1
1
// ignore-tidy-filelength
2
2
use crate :: def:: { CtorKind , DefKind , Res } ;
3
- use crate :: def_id:: DefId ;
3
+ use crate :: def_id:: { DefId , CRATE_DEF_ID } ;
4
4
crate use crate :: hir_id:: { HirId , ItemLocalId } ;
5
5
use crate :: { itemlikevisit, LangItem } ;
6
6
@@ -628,7 +628,6 @@ pub struct ModuleItems {
628
628
/// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/hir.html
629
629
#[ derive( Debug ) ]
630
630
pub struct Crate < ' hir > {
631
- pub item : Mod < ' hir > ,
632
631
// Attributes from non-exported macros, kept only for collecting the library feature list.
633
632
pub non_exported_macro_attrs : & ' hir [ Attribute ] ,
634
633
@@ -658,6 +657,10 @@ pub struct Crate<'hir> {
658
657
}
659
658
660
659
impl 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
+
661
664
pub fn item ( & self , id : ItemId ) -> & ' hir Item < ' hir > {
662
665
self . owners [ id. def_id ] . as_ref ( ) . unwrap ( ) . expect_item ( )
663
666
}
@@ -698,7 +701,7 @@ impl Crate<'_> {
698
701
OwnerNode :: ForeignItem ( item) => visitor. visit_foreign_item ( item) ,
699
702
OwnerNode :: ImplItem ( item) => visitor. visit_impl_item ( item) ,
700
703
OwnerNode :: TraitItem ( item) => visitor. visit_trait_item ( item) ,
701
- OwnerNode :: MacroDef ( _) => { }
704
+ OwnerNode :: MacroDef ( _) | OwnerNode :: Crate ( _ ) => { }
702
705
}
703
706
}
704
707
}
@@ -713,7 +716,7 @@ impl Crate<'_> {
713
716
Some ( OwnerNode :: ForeignItem ( item) ) => visitor. visit_foreign_item ( item) ,
714
717
Some ( OwnerNode :: ImplItem ( item) ) => visitor. visit_impl_item ( item) ,
715
718
Some ( OwnerNode :: TraitItem ( item) ) => visitor. visit_trait_item ( item) ,
716
- Some ( OwnerNode :: MacroDef ( _) ) | None => { }
719
+ Some ( OwnerNode :: MacroDef ( _) ) | Some ( OwnerNode :: Crate ( _ ) ) | None => { }
717
720
} )
718
721
}
719
722
@@ -2943,16 +2946,29 @@ pub enum OwnerNode<'hir> {
2943
2946
TraitItem ( & ' hir TraitItem < ' hir > ) ,
2944
2947
ImplItem ( & ' hir ImplItem < ' hir > ) ,
2945
2948
MacroDef ( & ' hir MacroDef < ' hir > ) ,
2949
+ Crate ( & ' hir Mod < ' hir > ) ,
2946
2950
}
2947
2951
2948
2952
impl < ' hir > OwnerNode < ' hir > {
2949
- pub fn ident ( & self ) -> Ident {
2953
+ pub fn ident ( & self ) -> Option < Ident > {
2950
2954
match self {
2951
2955
OwnerNode :: Item ( Item { ident, .. } )
2952
2956
| OwnerNode :: ForeignItem ( ForeignItem { ident, .. } )
2953
2957
| OwnerNode :: ImplItem ( ImplItem { ident, .. } )
2954
2958
| 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,
2956
2972
}
2957
2973
}
2958
2974
@@ -2997,56 +3013,42 @@ impl<'hir> OwnerNode<'hir> {
2997
3013
| OwnerNode :: ImplItem ( ImplItem { def_id, .. } )
2998
3014
| OwnerNode :: ForeignItem ( ForeignItem { def_id, .. } )
2999
3015
| OwnerNode :: MacroDef ( MacroDef { def_id, .. } ) => * def_id,
3016
+ OwnerNode :: Crate ( ..) => crate :: CRATE_HIR_ID . owner ,
3000
3017
}
3001
3018
}
3002
3019
3003
3020
pub fn expect_item ( self ) -> & ' hir Item < ' hir > {
3004
3021
match self {
3005
3022
OwnerNode :: Item ( n) => n,
3006
- OwnerNode :: ForeignItem ( _)
3007
- | OwnerNode :: ImplItem ( _)
3008
- | OwnerNode :: TraitItem ( _)
3009
- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3023
+ _ => panic ! ( ) ,
3010
3024
}
3011
3025
}
3012
3026
3013
3027
pub fn expect_foreign_item ( self ) -> & ' hir ForeignItem < ' hir > {
3014
3028
match self {
3015
3029
OwnerNode :: ForeignItem ( n) => n,
3016
- OwnerNode :: Item ( _)
3017
- | OwnerNode :: ImplItem ( _)
3018
- | OwnerNode :: TraitItem ( _)
3019
- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3030
+ _ => panic ! ( ) ,
3020
3031
}
3021
3032
}
3022
3033
3023
3034
pub fn expect_impl_item ( self ) -> & ' hir ImplItem < ' hir > {
3024
3035
match self {
3025
3036
OwnerNode :: ImplItem ( n) => n,
3026
- OwnerNode :: ForeignItem ( _)
3027
- | OwnerNode :: Item ( _)
3028
- | OwnerNode :: TraitItem ( _)
3029
- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3037
+ _ => panic ! ( ) ,
3030
3038
}
3031
3039
}
3032
3040
3033
3041
pub fn expect_trait_item ( self ) -> & ' hir TraitItem < ' hir > {
3034
3042
match self {
3035
3043
OwnerNode :: TraitItem ( n) => n,
3036
- OwnerNode :: ForeignItem ( _)
3037
- | OwnerNode :: ImplItem ( _)
3038
- | OwnerNode :: Item ( _)
3039
- | OwnerNode :: MacroDef ( _) => panic ! ( ) ,
3044
+ _ => panic ! ( ) ,
3040
3045
}
3041
3046
}
3042
3047
3043
3048
pub fn expect_macro_def ( self ) -> & ' hir MacroDef < ' hir > {
3044
3049
match self {
3045
3050
OwnerNode :: MacroDef ( n) => n,
3046
- OwnerNode :: ForeignItem ( _)
3047
- | OwnerNode :: ImplItem ( _)
3048
- | OwnerNode :: TraitItem ( _)
3049
- | OwnerNode :: Item ( _) => panic ! ( ) ,
3051
+ _ => panic ! ( ) ,
3050
3052
}
3051
3053
}
3052
3054
}
@@ -3089,6 +3091,7 @@ impl<'hir> Into<Node<'hir>> for OwnerNode<'hir> {
3089
3091
OwnerNode :: ImplItem ( n) => Node :: ImplItem ( n) ,
3090
3092
OwnerNode :: TraitItem ( n) => Node :: TraitItem ( n) ,
3091
3093
OwnerNode :: MacroDef ( n) => Node :: MacroDef ( n) ,
3094
+ OwnerNode :: Crate ( n) => Node :: Crate ( n) ,
3092
3095
}
3093
3096
}
3094
3097
}
@@ -3221,6 +3224,18 @@ impl<'hir> Node<'hir> {
3221
3224
_ => Constness :: NotConst ,
3222
3225
}
3223
3226
}
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
+ }
3224
3239
}
3225
3240
3226
3241
// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
0 commit comments