11// ignore-tidy-filelength
22use crate :: def:: { CtorKind , DefKind , Res } ;
3- use crate :: def_id:: DefId ;
3+ use crate :: def_id:: { DefId , CRATE_DEF_ID } ;
44crate use crate :: hir_id:: { HirId , ItemLocalId } ;
55use crate :: { itemlikevisit, LangItem } ;
66
@@ -628,7 +628,6 @@ pub struct ModuleItems {
628628/// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/hir.html
629629#[ derive( Debug ) ]
630630pub struct Crate < ' hir > {
631- pub item : Mod < ' hir > ,
632631 // Attributes from non-exported macros, kept only for collecting the library feature list.
633632 pub non_exported_macro_attrs : & ' hir [ Attribute ] ,
634633
@@ -658,6 +657,10 @@ pub struct Crate<'hir> {
658657}
659658
660659impl Crate < ' hir > {
660+ pub fn module ( & self ) -> & ' hir Mod < ' hir > {
661+ if let Some ( OwnerNode :: Crate ( m) ) = self . owners [ CRATE_DEF_ID ] { m } else { panic ! ( ) }
662+ }
663+
661664 pub fn item ( & self , id : ItemId ) -> & ' hir Item < ' hir > {
662665 self . owners [ id. def_id ] . as_ref ( ) . unwrap ( ) . expect_item ( )
663666 }
@@ -698,7 +701,7 @@ impl Crate<'_> {
698701 OwnerNode :: ForeignItem ( item) => visitor. visit_foreign_item ( item) ,
699702 OwnerNode :: ImplItem ( item) => visitor. visit_impl_item ( item) ,
700703 OwnerNode :: TraitItem ( item) => visitor. visit_trait_item ( item) ,
701- OwnerNode :: MacroDef ( _) => { }
704+ OwnerNode :: MacroDef ( _) | OwnerNode :: Crate ( _ ) => { }
702705 }
703706 }
704707 }
@@ -713,7 +716,7 @@ impl Crate<'_> {
713716 Some ( OwnerNode :: ForeignItem ( item) ) => visitor. visit_foreign_item ( item) ,
714717 Some ( OwnerNode :: ImplItem ( item) ) => visitor. visit_impl_item ( item) ,
715718 Some ( OwnerNode :: TraitItem ( item) ) => visitor. visit_trait_item ( item) ,
716- Some ( OwnerNode :: MacroDef ( _) ) | None => { }
719+ Some ( OwnerNode :: MacroDef ( _) ) | Some ( OwnerNode :: Crate ( _ ) ) | None => { }
717720 } )
718721 }
719722
@@ -2943,16 +2946,29 @@ pub enum OwnerNode<'hir> {
29432946 TraitItem ( & ' hir TraitItem < ' hir > ) ,
29442947 ImplItem ( & ' hir ImplItem < ' hir > ) ,
29452948 MacroDef ( & ' hir MacroDef < ' hir > ) ,
2949+ Crate ( & ' hir Mod < ' hir > ) ,
29462950}
29472951
29482952impl < ' hir > OwnerNode < ' hir > {
2949- pub fn ident ( & self ) -> Ident {
2953+ pub fn ident ( & self ) -> Option < Ident > {
29502954 match self {
29512955 OwnerNode :: Item ( Item { ident, .. } )
29522956 | OwnerNode :: ForeignItem ( ForeignItem { ident, .. } )
29532957 | OwnerNode :: ImplItem ( ImplItem { ident, .. } )
29542958 | OwnerNode :: TraitItem ( TraitItem { ident, .. } )
2955- | OwnerNode :: MacroDef ( MacroDef { ident, .. } ) => * ident,
2959+ | OwnerNode :: MacroDef ( MacroDef { ident, .. } ) => Some ( * ident) ,
2960+ OwnerNode :: Crate ( ..) => None ,
2961+ }
2962+ }
2963+
2964+ pub fn span ( & self ) -> Span {
2965+ match self {
2966+ OwnerNode :: Item ( Item { span, .. } )
2967+ | OwnerNode :: ForeignItem ( ForeignItem { span, .. } )
2968+ | OwnerNode :: ImplItem ( ImplItem { span, .. } )
2969+ | OwnerNode :: TraitItem ( TraitItem { span, .. } )
2970+ | OwnerNode :: MacroDef ( MacroDef { span, .. } )
2971+ | OwnerNode :: Crate ( Mod { inner : span, .. } ) => * span,
29562972 }
29572973 }
29582974
@@ -2997,56 +3013,42 @@ impl<'hir> OwnerNode<'hir> {
29973013 | OwnerNode :: ImplItem ( ImplItem { def_id, .. } )
29983014 | OwnerNode :: ForeignItem ( ForeignItem { def_id, .. } )
29993015 | OwnerNode :: MacroDef ( MacroDef { def_id, .. } ) => * def_id,
3016+ OwnerNode :: Crate ( ..) => crate :: CRATE_HIR_ID . owner ,
30003017 }
30013018 }
30023019
30033020 pub fn expect_item ( self ) -> & ' hir Item < ' hir > {
30043021 match self {
30053022 OwnerNode :: Item ( n) => n,
3006- OwnerNode :: ForeignItem ( _)
3007- | OwnerNode :: ImplItem ( _)
3008- | OwnerNode :: TraitItem ( _)
3009- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3023+ _ => panic ! ( ) ,
30103024 }
30113025 }
30123026
30133027 pub fn expect_foreign_item ( self ) -> & ' hir ForeignItem < ' hir > {
30143028 match self {
30153029 OwnerNode :: ForeignItem ( n) => n,
3016- OwnerNode :: Item ( _)
3017- | OwnerNode :: ImplItem ( _)
3018- | OwnerNode :: TraitItem ( _)
3019- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3030+ _ => panic ! ( ) ,
30203031 }
30213032 }
30223033
30233034 pub fn expect_impl_item ( self ) -> & ' hir ImplItem < ' hir > {
30243035 match self {
30253036 OwnerNode :: ImplItem ( n) => n,
3026- OwnerNode :: ForeignItem ( _)
3027- | OwnerNode :: Item ( _)
3028- | OwnerNode :: TraitItem ( _)
3029- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3037+ _ => panic ! ( ) ,
30303038 }
30313039 }
30323040
30333041 pub fn expect_trait_item ( self ) -> & ' hir TraitItem < ' hir > {
30343042 match self {
30353043 OwnerNode :: TraitItem ( n) => n,
3036- OwnerNode :: ForeignItem ( _)
3037- | OwnerNode :: ImplItem ( _)
3038- | OwnerNode :: Item ( _)
3039- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3044+ _ => panic ! ( ) ,
30403045 }
30413046 }
30423047
30433048 pub fn expect_macro_def ( self ) -> & ' hir MacroDef < ' hir > {
30443049 match self {
30453050 OwnerNode :: MacroDef ( n) => n,
3046- OwnerNode :: ForeignItem ( _)
3047- | OwnerNode :: ImplItem ( _)
3048- | OwnerNode :: TraitItem ( _)
3049- | OwnerNode :: Item ( _) => panic ! ( ) ,
3051+ _ => panic ! ( ) ,
30503052 }
30513053 }
30523054}
@@ -3089,6 +3091,7 @@ impl<'hir> Into<Node<'hir>> for OwnerNode<'hir> {
30893091 OwnerNode :: ImplItem ( n) => Node :: ImplItem ( n) ,
30903092 OwnerNode :: TraitItem ( n) => Node :: TraitItem ( n) ,
30913093 OwnerNode :: MacroDef ( n) => Node :: MacroDef ( n) ,
3094+ OwnerNode :: Crate ( n) => Node :: Crate ( n) ,
30923095 }
30933096 }
30943097}
@@ -3221,6 +3224,18 @@ impl<'hir> Node<'hir> {
32213224 _ => Constness :: NotConst ,
32223225 }
32233226 }
3227+
3228+ pub fn as_owner ( self ) -> Option < OwnerNode < ' hir > > {
3229+ match self {
3230+ Node :: Item ( i) => Some ( OwnerNode :: Item ( i) ) ,
3231+ Node :: ForeignItem ( i) => Some ( OwnerNode :: ForeignItem ( i) ) ,
3232+ Node :: TraitItem ( i) => Some ( OwnerNode :: TraitItem ( i) ) ,
3233+ Node :: ImplItem ( i) => Some ( OwnerNode :: ImplItem ( i) ) ,
3234+ Node :: MacroDef ( i) => Some ( OwnerNode :: MacroDef ( i) ) ,
3235+ Node :: Crate ( i) => Some ( OwnerNode :: Crate ( i) ) ,
3236+ _ => None ,
3237+ }
3238+ }
32243239}
32253240
32263241// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
0 commit comments