@@ -44,7 +44,7 @@ use rustc_serialize::{Decodable, Decoder, SpecializedDecoder, opaque};
4444use  syntax:: attr; 
4545use  syntax:: ast:: { self ,  NodeId } ; 
4646use  syntax:: codemap; 
47- use  syntax_pos:: { self ,  Span ,  BytePos ,  Pos } ; 
47+ use  syntax_pos:: { self ,  Span ,  BytePos ,  Pos ,   DUMMY_SP } ; 
4848
4949pub  struct  DecodeContext < ' a ,  ' tcx :  ' a >  { 
5050 opaque :  opaque:: Decoder < ' a > , 
@@ -515,7 +515,12 @@ impl<'tcx> EntryKind<'tcx> {
515515} 
516516
517517impl < ' a ,  ' tcx >  CrateMetadata  { 
518+  fn  is_proc_macro ( & self ,  id :  DefIndex )  -> bool  { 
519+  self . proc_macros . is_some ( )  && id != CRATE_DEF_INDEX 
520+  } 
521+ 
518522 fn  maybe_entry ( & self ,  item_id :  DefIndex )  -> Option < Lazy < Entry < ' tcx > > >  { 
523+  assert ! ( !self . is_proc_macro( item_id) ) ; 
519524 self . root . index . lookup ( self . blob . raw_bytes ( ) ,  item_id) 
520525 } 
521526
@@ -548,18 +553,17 @@ impl<'a, 'tcx> CrateMetadata {
548553 } 
549554
550555 pub  fn  get_def ( & self ,  index :  DefIndex )  -> Option < Def >  { 
551-  if  self . proc_macros . is_some ( )  { 
552-  Some ( match  index { 
553-  CRATE_DEF_INDEX  => Def :: Mod ( self . local_def_id ( index) ) , 
554-  _ => Def :: Macro ( self . local_def_id ( index) ) , 
555-  } ) 
556-  }  else  { 
557-  self . entry ( index) . kind . to_def ( self . local_def_id ( index) ) 
556+  match  self . is_proc_macro ( index)  { 
557+  true  => Some ( Def :: Macro ( self . local_def_id ( index) ) ) , 
558+  false  => self . entry ( index) . kind . to_def ( self . local_def_id ( index) ) , 
558559 } 
559560 } 
560561
561562 pub  fn  get_span ( & self ,  index :  DefIndex ,  sess :  & Session )  -> Span  { 
562-  self . entry ( index) . span . decode ( ( self ,  sess) ) 
563+  match  self . is_proc_macro ( index)  { 
564+  true  => DUMMY_SP , 
565+  false  => self . entry ( index) . span . decode ( ( self ,  sess) ) , 
566+  } 
563567 } 
564568
565569 pub  fn  get_trait_def ( & self , 
@@ -670,23 +674,23 @@ impl<'a, 'tcx> CrateMetadata {
670674 } 
671675
672676 pub  fn  get_stability ( & self ,  id :  DefIndex )  -> Option < attr:: Stability >  { 
673-  match  self . proc_macros  { 
674-  Some ( _ )   if  id !=  CRATE_DEF_INDEX  => None , 
675-  _  => self . entry ( id) . stability . map ( |stab| stab. decode ( self ) ) , 
677+  match  self . is_proc_macro ( id )  { 
678+  true  => None , 
679+  false  => self . entry ( id) . stability . map ( |stab| stab. decode ( self ) ) , 
676680 } 
677681 } 
678682
679683 pub  fn  get_deprecation ( & self ,  id :  DefIndex )  -> Option < attr:: Deprecation >  { 
680-  match  self . proc_macros  { 
681-  Some ( _ )   if  id !=  CRATE_DEF_INDEX  => None , 
682-  _  => self . entry ( id) . deprecation . map ( |depr| depr. decode ( self ) ) , 
684+  match  self . is_proc_macro ( id )  { 
685+  true  => None , 
686+  false  => self . entry ( id) . deprecation . map ( |depr| depr. decode ( self ) ) , 
683687 } 
684688 } 
685689
686690 pub  fn  get_visibility ( & self ,  id :  DefIndex )  -> ty:: Visibility  { 
687-  match  self . proc_macros  { 
688-  Some ( _ )  => ty:: Visibility :: Public , 
689-  _  => self . entry ( id) . visibility , 
691+  match  self . is_proc_macro ( id )  { 
692+  true  => ty:: Visibility :: Public , 
693+  false  => self . entry ( id) . visibility , 
690694 } 
691695 } 
692696
@@ -832,6 +836,7 @@ impl<'a, 'tcx> CrateMetadata {
832836 id :  DefIndex ) 
833837 -> Option < & ' tcx  InlinedItem >  { 
834838 debug ! ( "Looking up item: {:?}" ,  id) ; 
839+  if  self . is_proc_macro ( id)  {  return  None ;  } 
835840 let  item_doc = self . entry ( id) ; 
836841 let  item_did = self . local_def_id ( id) ; 
837842 let  parent_def_id = self . local_def_id ( self . def_key ( id) . parent . unwrap ( ) ) ; 
@@ -844,6 +849,7 @@ impl<'a, 'tcx> CrateMetadata {
844849 } 
845850
846851 pub  fn  is_item_mir_available ( & self ,  id :  DefIndex )  -> bool  { 
852+  !self . is_proc_macro ( id)  &&
847853 self . maybe_entry ( id) . and_then ( |item| item. decode ( self ) . mir ) . is_some ( ) 
848854 } 
849855
@@ -874,7 +880,10 @@ impl<'a, 'tcx> CrateMetadata {
874880 tcx :  TyCtxt < ' a ,  ' tcx ,  ' tcx > , 
875881 id :  DefIndex ) 
876882 -> Option < Mir < ' tcx > >  { 
877-  self . entry ( id) . mir . map ( |mir| mir. decode ( ( self ,  tcx) ) ) 
883+  match  self . is_proc_macro ( id)  { 
884+  true  => None , 
885+  false  => self . entry ( id) . mir . map ( |mir| mir. decode ( ( self ,  tcx) ) ) , 
886+  } 
878887 } 
879888
880889 pub  fn  get_associated_item ( & self ,  id :  DefIndex )  -> Option < ty:: AssociatedItem >  { 
@@ -950,7 +959,7 @@ impl<'a, 'tcx> CrateMetadata {
950959 } 
951960
952961 pub  fn  get_item_attrs ( & self ,  node_id :  DefIndex )  -> Vec < ast:: Attribute >  { 
953-  if  self . proc_macros . is_some ( )  &&  node_id !=  CRATE_DEF_INDEX  { 
962+  if  self . is_proc_macro ( node_id)  { 
954963 return  Vec :: new ( ) ; 
955964 } 
956965 // The attributes for a tuple struct are attached to the definition, not the ctor; 
@@ -1131,15 +1140,26 @@ impl<'a, 'tcx> CrateMetadata {
11311140
11321141 pub  fn  def_key ( & self ,  id :  DefIndex )  -> hir_map:: DefKey  { 
11331142 debug ! ( "def_key: id={:?}" ,  id) ; 
1134-  self . entry ( id) . def_key . decode ( self ) 
1143+  if  self . is_proc_macro ( id)  { 
1144+  let  name = self . proc_macros . as_ref ( ) . unwrap ( ) [ id. as_usize ( )  - 1 ] . 0 ; 
1145+  hir_map:: DefKey  { 
1146+  parent :  Some ( CRATE_DEF_INDEX ) , 
1147+  disambiguated_data :  hir_map:: DisambiguatedDefPathData  { 
1148+  data :  hir_map:: DefPathData :: MacroDef ( name. as_str ( ) ) , 
1149+  disambiguator :  0 , 
1150+  } , 
1151+  } 
1152+  }  else  { 
1153+  self . entry ( id) . def_key . decode ( self ) 
1154+  } 
11351155 } 
11361156
11371157 // Returns the path leading to the thing with this `id`. Note that 
11381158 // some def-ids don't wind up in the metadata, so `def_path` sometimes 
11391159 // returns `None` 
11401160 pub  fn  def_path ( & self ,  id :  DefIndex )  -> Option < hir_map:: DefPath >  { 
11411161 debug ! ( "def_path(id={:?})" ,  id) ; 
1142-  if  self . maybe_entry ( id) . is_some ( )  { 
1162+  if  self . is_proc_macro ( id )  ||  self . maybe_entry ( id) . is_some ( )  { 
11431163 Some ( hir_map:: DefPath :: make ( self . cnum ,  id,  |parent| self . def_key ( parent) ) ) 
11441164 }  else  { 
11451165 None 
0 commit comments