@@ -12,7 +12,7 @@ use crate::ty::TyCtxt;
1212use rustc_data_structures:: fx:: FxHashMap ;
1313use rustc_data_structures:: svh:: Svh ;
1414use rustc_hir:: def:: { DefKind , Res } ;
15- use rustc_hir:: def_id:: { DefId , DefIndex , LocalDefId , CRATE_DEF_INDEX } ;
15+ use rustc_hir:: def_id:: { DefId , DefIndex , LocalDefId } ;
1616use rustc_hir:: intravisit;
1717use rustc_hir:: itemlikevisit:: ItemLikeVisitor ;
1818use rustc_hir:: print:: Nested ;
@@ -41,7 +41,7 @@ pub struct Entry<'hir> {
4141impl < ' hir > Entry < ' hir > {
4242 fn parent_node ( self ) -> Option < HirId > {
4343 match self . node {
44- Node :: Crate | Node :: MacroDef ( _) => None ,
44+ Node :: Crate ( _ ) | Node :: MacroDef ( _) => None ,
4545 _ => Some ( self . parent ) ,
4646 }
4747 }
@@ -394,7 +394,7 @@ impl<'hir> Map<'hir> {
394394 | Node :: Lifetime ( _)
395395 | Node :: Visibility ( _)
396396 | Node :: Block ( _)
397- | Node :: Crate => return None ,
397+ | Node :: Crate ( _ ) => return None ,
398398 Node :: MacroDef ( _) => DefKind :: Macro ( MacroKind :: Bang ) ,
399399 Node :: GenericParam ( param) => match param. kind {
400400 GenericParamKind :: Lifetime { .. } => return None ,
@@ -408,6 +408,21 @@ impl<'hir> Map<'hir> {
408408 self . lookup ( id) . cloned ( )
409409 }
410410
411+ fn get_entry ( & self , id : HirId ) -> Entry < ' hir > {
412+ if id. local_id == ItemLocalId :: from_u32_const ( 0 ) {
413+ let owner = self . tcx . hir_owner ( id. owner_def_id ( ) ) ;
414+ Entry { parent : owner. parent , node : owner. node , dep_node : DepNodeIndex :: INVALID }
415+ } else {
416+ let owner = self . tcx . hir_owner_items ( id. owner_def_id ( ) ) ;
417+ let item = owner. items [ id. local_id ] . as_ref ( ) . unwrap ( ) ;
418+ Entry {
419+ parent : HirId { owner : id. owner , local_id : item. parent } ,
420+ node : item. node ,
421+ dep_node : DepNodeIndex :: INVALID ,
422+ }
423+ }
424+ }
425+
411426 pub fn item ( & self , id : HirId ) -> & ' hir Item < ' hir > {
412427 match self . find ( id) . unwrap ( ) {
413428 Node :: Item ( item) => item,
@@ -533,18 +548,17 @@ impl<'hir> Map<'hir> {
533548 /// invoking `krate.attrs` because it registers a tighter
534549 /// dep-graph access.
535550 pub fn krate_attrs ( & self ) -> & ' hir [ ast:: Attribute ] {
536- let def_path_hash = self . definitions . def_path_hash ( CRATE_DEF_INDEX ) ;
537-
538- self . dep_graph . read ( def_path_hash . to_dep_node ( DepKind :: Hir ) ) ;
539- & self . krate . attrs
551+ match self . get_entry ( CRATE_HIR_ID ) . node {
552+ Node :: Crate ( item ) => item . attrs ,
553+ _ => bug ! ( ) ,
554+ }
540555 }
541556
542557 pub fn get_module ( & self , module : DefId ) -> ( & ' hir Mod < ' hir > , Span , HirId ) {
543558 let hir_id = self . as_local_hir_id ( module) . unwrap ( ) ;
544- self . read ( hir_id) ;
545- match self . find_entry ( hir_id) . unwrap ( ) . node {
559+ match self . get_entry ( hir_id) . node {
546560 Node :: Item ( & Item { span, kind : ItemKind :: Mod ( ref m) , .. } ) => ( m, span, hir_id) ,
547- Node :: Crate => ( & self . krate . module , self . krate . span , hir_id) ,
561+ Node :: Crate ( item ) => ( & item . module , item . span , hir_id) ,
548562 node => panic ! ( "not a module: {:?}" , node) ,
549563 }
550564 }
@@ -607,9 +621,9 @@ impl<'hir> Map<'hir> {
607621
608622 /// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found.
609623 pub fn find ( & self , hir_id : HirId ) -> Option < Node < ' hir > > {
610- let result = self
611- . find_entry ( hir_id )
612- . and_then ( |entry| if let Node :: Crate = entry . node { None } else { Some ( entry . node ) } ) ;
624+ let result = self . find_entry ( hir_id ) . and_then ( |entry| {
625+ if let Node :: Crate ( .. ) = entry . node { None } else { Some ( entry . node ) }
626+ } ) ;
613627 if result. is_some ( ) {
614628 self . read ( hir_id) ;
615629 }
@@ -674,7 +688,7 @@ impl<'hir> Map<'hir> {
674688 pub fn is_hir_id_module ( & self , hir_id : HirId ) -> bool {
675689 match self . lookup ( hir_id) {
676690 Some ( Entry { node : Node :: Item ( Item { kind : ItemKind :: Mod ( _) , .. } ) , .. } )
677- | Some ( Entry { node : Node :: Crate , .. } ) => true ,
691+ | Some ( Entry { node : Node :: Crate ( .. ) , .. } ) => true ,
678692 _ => false ,
679693 }
680694 }
@@ -751,7 +765,7 @@ impl<'hir> Map<'hir> {
751765 pub fn get_parent_item ( & self , hir_id : HirId ) -> HirId {
752766 for ( hir_id, node) in ParentHirIterator :: new ( hir_id, & self ) {
753767 match node {
754- Node :: Crate
768+ Node :: Crate ( _ )
755769 | Node :: Item ( _)
756770 | Node :: ForeignItem ( _)
757771 | Node :: TraitItem ( _)
@@ -978,7 +992,7 @@ impl<'hir> Map<'hir> {
978992 // Unit/tuple structs/variants take the attributes straight from
979993 // the struct/variant definition.
980994 Some ( Node :: Ctor ( ..) ) => return self . attrs ( self . get_parent_item ( id) ) ,
981- Some ( Node :: Crate ) => Some ( & self . krate . attrs [ ..] ) ,
995+ Some ( Node :: Crate ( item ) ) => Some ( & item . attrs [ ..] ) ,
982996 _ => None ,
983997 } ;
984998 attrs. unwrap_or ( & [ ] )
@@ -1018,7 +1032,7 @@ impl<'hir> Map<'hir> {
10181032 Some ( Node :: Visibility ( v) ) => bug ! ( "unexpected Visibility {:?}" , v) ,
10191033 Some ( Node :: Local ( local) ) => local. span ,
10201034 Some ( Node :: MacroDef ( macro_def) ) => macro_def. span ,
1021- Some ( Node :: Crate ) => self . krate . span ,
1035+ Some ( Node :: Crate ( item ) ) => item . span ,
10221036 None => bug ! ( "hir::map::Map::span: id not in map: {:?}" , hir_id) ,
10231037 }
10241038 }
@@ -1260,7 +1274,7 @@ fn hir_id_to_string(map: &Map<'_>, id: HirId, include_id: bool) -> String {
12601274 Some ( Node :: GenericParam ( ref param) ) => format ! ( "generic_param {:?}{}" , param, id_str) ,
12611275 Some ( Node :: Visibility ( ref vis) ) => format ! ( "visibility {:?}{}" , vis, id_str) ,
12621276 Some ( Node :: MacroDef ( _) ) => format ! ( "macro {}{}" , path_str( ) , id_str) ,
1263- Some ( Node :: Crate ) => String :: from ( "root_crate" ) ,
1277+ Some ( Node :: Crate ( .. ) ) => String :: from ( "root_crate" ) ,
12641278 None => format ! ( "unknown node{}" , id_str) ,
12651279 }
12661280}
0 commit comments