@@ -2263,7 +2263,7 @@ pub struct TraitItem<'hir> {
2263
2263
pub defaultness : Defaultness ,
2264
2264
}
2265
2265
2266
- impl TraitItem < ' _ > {
2266
+ impl < ' hir > TraitItem < ' hir > {
2267
2267
#[ inline]
2268
2268
pub fn hir_id ( & self ) -> HirId {
2269
2269
// Items are always HIR owners.
@@ -2273,6 +2273,27 @@ impl TraitItem<'_> {
2273
2273
pub fn trait_item_id ( & self ) -> TraitItemId {
2274
2274
TraitItemId { owner_id : self . owner_id }
2275
2275
}
2276
+
2277
+ /// Expect an [`TraitItemKind::Const`] or panic.
2278
+ #[ track_caller]
2279
+ pub fn expect_const ( & self ) -> ( & ' hir Ty < ' hir > , Option < BodyId > ) {
2280
+ let TraitItemKind :: Const ( ty, body) = self . kind else { unreachable ! ( ) } ;
2281
+ ( ty, body)
2282
+ }
2283
+
2284
+ /// Expect an [`TraitItemKind::Fn`] or panic.
2285
+ #[ track_caller]
2286
+ pub fn expect_fn ( & self ) -> ( & FnSig < ' hir > , & TraitFn < ' hir > ) {
2287
+ let TraitItemKind :: Fn ( ty, trfn) = & self . kind else { unreachable ! ( ) } ;
2288
+ ( ty, trfn)
2289
+ }
2290
+
2291
+ /// Expect an [`TraitItemKind::ExternCrate`] or panic.
2292
+ #[ track_caller]
2293
+ pub fn expect_type ( & self ) -> ( GenericBounds < ' hir > , Option < & ' hir Ty < ' hir > > ) {
2294
+ let TraitItemKind :: Type ( bounds, ty) = self . kind else { unreachable ! ( ) } ;
2295
+ ( bounds, ty)
2296
+ }
2276
2297
}
2277
2298
2278
2299
/// Represents a trait method's body (or just argument names).
@@ -2325,7 +2346,7 @@ pub struct ImplItem<'hir> {
2325
2346
pub vis_span : Span ,
2326
2347
}
2327
2348
2328
- impl ImplItem < ' _ > {
2349
+ impl < ' hir > ImplItem < ' hir > {
2329
2350
#[ inline]
2330
2351
pub fn hir_id ( & self ) -> HirId {
2331
2352
// Items are always HIR owners.
@@ -2335,6 +2356,27 @@ impl ImplItem<'_> {
2335
2356
pub fn impl_item_id ( & self ) -> ImplItemId {
2336
2357
ImplItemId { owner_id : self . owner_id }
2337
2358
}
2359
+
2360
+ /// Expect an [`ImplItemKind::Const`] or panic.
2361
+ #[ track_caller]
2362
+ pub fn expect_const ( & self ) -> ( & ' hir Ty < ' hir > , BodyId ) {
2363
+ let ImplItemKind :: Const ( ty, body) = self . kind else { unreachable ! ( ) } ;
2364
+ ( ty, body)
2365
+ }
2366
+
2367
+ /// Expect an [`ImplItemKind::Fn`] or panic.
2368
+ #[ track_caller]
2369
+ pub fn expect_fn ( & self ) -> ( & FnSig < ' hir > , BodyId ) {
2370
+ let ImplItemKind :: Fn ( ty, body) = & self . kind else { unreachable ! ( ) } ;
2371
+ ( ty, * body)
2372
+ }
2373
+
2374
+ /// Expect an [`ImplItemKind::ExternCrate`] or panic.
2375
+ #[ track_caller]
2376
+ pub fn expect_type ( & self ) -> & ' hir Ty < ' hir > {
2377
+ let ImplItemKind :: Type ( ty) = self . kind else { unreachable ! ( ) } ;
2378
+ ty
2379
+ }
2338
2380
}
2339
2381
2340
2382
/// Represents various kinds of content within an `impl`.
@@ -2995,7 +3037,7 @@ pub struct Item<'hir> {
2995
3037
pub vis_span : Span ,
2996
3038
}
2997
3039
2998
- impl Item < ' _ > {
3040
+ impl < ' hir > Item < ' hir > {
2999
3041
#[ inline]
3000
3042
pub fn hir_id ( & self ) -> HirId {
3001
3043
// Items are always HIR owners.
@@ -3005,6 +3047,127 @@ impl Item<'_> {
3005
3047
pub fn item_id ( & self ) -> ItemId {
3006
3048
ItemId { owner_id : self . owner_id }
3007
3049
}
3050
+
3051
+ /// Expect an [`ItemKind::ExternCrate`] or panic.
3052
+ #[ track_caller]
3053
+ pub fn expect_extern_crate ( & self ) -> Option < Symbol > {
3054
+ let ItemKind :: ExternCrate ( s) = self . kind else { unreachable ! ( ) } ;
3055
+ s
3056
+ }
3057
+
3058
+ /// Expect an [`ItemKind::Use`] or panic.
3059
+ #[ track_caller]
3060
+ pub fn expect_use ( & self ) -> ( & ' hir UsePath < ' hir > , UseKind ) {
3061
+ let ItemKind :: Use ( p, uk) = self . kind else { unreachable ! ( ) } ;
3062
+ ( p, uk)
3063
+ }
3064
+
3065
+ /// Expect an [`ItemKind::Static`] or panic.
3066
+ #[ track_caller]
3067
+ pub fn expect_static ( & self ) -> ( & ' hir Ty < ' hir > , Mutability , BodyId ) {
3068
+ let ItemKind :: Static ( ty, mutbl, body) = self . kind else { unreachable ! ( ) } ;
3069
+ ( ty, mutbl, body)
3070
+ }
3071
+ /// Expect an [`ItemKind::Const`] or panic.
3072
+ #[ track_caller]
3073
+ pub fn expect_const ( & self ) -> ( & ' hir Ty < ' hir > , BodyId ) {
3074
+ let ItemKind :: Const ( ty, body) = self . kind else { unreachable ! ( ) } ;
3075
+ ( ty, body)
3076
+ }
3077
+ /// Expect an [`ItemKind::Fn`] or panic.
3078
+ #[ track_caller]
3079
+ pub fn expect_fn ( & self ) -> ( & FnSig < ' hir > , & ' hir Generics < ' hir > , BodyId ) {
3080
+ let ItemKind :: Fn ( sig, gen, body) = & self . kind else { unreachable ! ( ) } ;
3081
+ ( sig, gen, * body)
3082
+ }
3083
+
3084
+ /// Expect an [`ItemKind::Macro`] or panic.
3085
+ #[ track_caller]
3086
+ pub fn expect_macro ( & self ) -> ( & ast:: MacroDef , MacroKind ) {
3087
+ let ItemKind :: Macro ( def, mk) = & self . kind else { unreachable ! ( ) } ;
3088
+ ( def, * mk)
3089
+ }
3090
+
3091
+ /// Expect an [`ItemKind::Mod`] or panic.
3092
+ #[ track_caller]
3093
+ pub fn expect_mod ( & self ) -> & ' hir Mod < ' hir > {
3094
+ let ItemKind :: Mod ( m) = self . kind else { unreachable ! ( ) } ;
3095
+ m
3096
+ }
3097
+
3098
+ /// Expect an [`ItemKind::ForeignMod`] or panic.
3099
+ #[ track_caller]
3100
+ pub fn expect_foreign_mod ( & self ) -> ( Abi , & ' hir [ ForeignItemRef ] ) {
3101
+ let ItemKind :: ForeignMod { abi, items } = self . kind else { unreachable ! ( ) } ;
3102
+ ( abi, items)
3103
+ }
3104
+
3105
+ /// Expect an [`ItemKind::GlobalAsm`] or panic.
3106
+ #[ track_caller]
3107
+ pub fn expect_global_asm ( & self ) -> & ' hir InlineAsm < ' hir > {
3108
+ let ItemKind :: GlobalAsm ( asm) = self . kind else { unreachable ! ( ) } ;
3109
+ asm
3110
+ }
3111
+
3112
+ /// Expect an [`ItemKind::TyAlias`] or panic.
3113
+ #[ track_caller]
3114
+ pub fn expect_ty_alias ( & self ) -> ( & ' hir Ty < ' hir > , & ' hir Generics < ' hir > ) {
3115
+ let ItemKind :: TyAlias ( ty, gen) = self . kind else { unreachable ! ( ) } ;
3116
+ ( ty, gen)
3117
+ }
3118
+
3119
+ /// An opaque `impl Trait` type alias, e.g., `type Foo = impl Bar;`.
3120
+ /// Expect an [`ItemKind::OpaqueTy`] or panic.
3121
+ #[ track_caller]
3122
+ pub fn expect_opaque_ty ( & self ) -> & OpaqueTy < ' hir > {
3123
+ let ItemKind :: OpaqueTy ( ty) = & self . kind else { unreachable ! ( ) } ;
3124
+ ty
3125
+ }
3126
+
3127
+ /// Expect an [`ItemKind::Enum`] or panic.
3128
+ #[ track_caller]
3129
+ pub fn expect_enum ( & self ) -> ( & EnumDef < ' hir > , & ' hir Generics < ' hir > ) {
3130
+ let ItemKind :: Enum ( def, gen) = & self . kind else { unreachable ! ( ) } ;
3131
+ ( def, gen)
3132
+ }
3133
+
3134
+ /// Expect an [`ItemKind::Struct`] or panic.
3135
+ #[ track_caller]
3136
+ pub fn expect_struct ( & self ) -> ( & VariantData < ' hir > , & ' hir Generics < ' hir > ) {
3137
+ let ItemKind :: Struct ( data, gen) = & self . kind else { unreachable ! ( ) } ;
3138
+ ( data, gen)
3139
+ }
3140
+
3141
+ /// A union definition, e.g., `union Foo<A, B> {x: A, y: B}`.
3142
+ /// Expect an [`ItemKind::Union`] or panic.
3143
+ #[ track_caller]
3144
+ pub fn expect_union ( & self ) -> ( & VariantData < ' hir > , & ' hir Generics < ' hir > ) {
3145
+ let ItemKind :: Union ( data, gen) = & self . kind else { unreachable ! ( ) } ;
3146
+ ( data, gen)
3147
+ }
3148
+
3149
+ /// Expect an [`ItemKind::Trait`] or panic.
3150
+ #[ track_caller]
3151
+ pub fn expect_trait (
3152
+ self ,
3153
+ ) -> ( IsAuto , Unsafety , & ' hir Generics < ' hir > , GenericBounds < ' hir > , & ' hir [ TraitItemRef ] ) {
3154
+ let ItemKind :: Trait ( is_auto, unsafety, gen, bounds, items) = self . kind else { unreachable ! ( ) } ;
3155
+ ( is_auto, unsafety, gen, bounds, items)
3156
+ }
3157
+
3158
+ /// Expect an [`ItemKind::TraitAlias`] or panic.
3159
+ #[ track_caller]
3160
+ pub fn expect_trait_alias ( & self ) -> ( & ' hir Generics < ' hir > , GenericBounds < ' hir > ) {
3161
+ let ItemKind :: TraitAlias ( gen, bounds) = self . kind else { unreachable ! ( ) } ;
3162
+ ( gen, bounds)
3163
+ }
3164
+
3165
+ /// Expect an [`ItemKind::Impl`] or panic.
3166
+ #[ track_caller]
3167
+ pub fn expect_impl ( & self ) -> & ' hir Impl < ' hir > {
3168
+ let ItemKind :: Impl ( imp) = self . kind else { unreachable ! ( ) } ;
3169
+ imp
3170
+ }
3008
3171
}
3009
3172
3010
3173
#[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash , Debug ) ]
@@ -3590,6 +3753,180 @@ impl<'hir> Node<'hir> {
3590
3753
pub fn tuple_fields ( & self ) -> Option < & ' hir [ FieldDef < ' hir > ] > {
3591
3754
if let Node :: Ctor ( & VariantData :: Tuple ( fields, _, _) ) = self { Some ( fields) } else { None }
3592
3755
}
3756
+
3757
+ /// Expect a [`Node::Param`] or panic.
3758
+ #[ track_caller]
3759
+ pub fn expect_param ( self ) -> & ' hir Param < ' hir > {
3760
+ let Node :: Param ( this) = self else { unreachable ! ( ) } ;
3761
+ this
3762
+ }
3763
+
3764
+ /// Expect a [`Node::Item`] or panic.
3765
+ #[ track_caller]
3766
+ pub fn expect_item ( self ) -> & ' hir Item < ' hir > {
3767
+ let Node :: Item ( this) = self else { unreachable ! ( ) } ;
3768
+ this
3769
+ }
3770
+
3771
+ /// Expect a [`Node::ForeignItem`] or panic.
3772
+ #[ track_caller]
3773
+ pub fn expect_foreign_item ( self ) -> & ' hir ForeignItem < ' hir > {
3774
+ let Node :: ForeignItem ( this) = self else { unreachable ! ( ) } ;
3775
+ this
3776
+ }
3777
+
3778
+ /// Expect a [`Node::TraitItem`] or panic.
3779
+ #[ track_caller]
3780
+ pub fn expect_trait_item ( self ) -> & ' hir TraitItem < ' hir > {
3781
+ let Node :: TraitItem ( this) = self else { unreachable ! ( ) } ;
3782
+ this
3783
+ }
3784
+
3785
+ /// Expect a [`Node::ImplItem`] or panic.
3786
+ #[ track_caller]
3787
+ pub fn expect_impl_item ( self ) -> & ' hir ImplItem < ' hir > {
3788
+ let Node :: ImplItem ( this) = self else { unreachable ! ( ) } ;
3789
+ this
3790
+ }
3791
+
3792
+ /// Expect a [`Node::Variant`] or panic.
3793
+ #[ track_caller]
3794
+ pub fn expect_variant ( self ) -> & ' hir Variant < ' hir > {
3795
+ let Node :: Variant ( this) = self else { unreachable ! ( ) } ;
3796
+ this
3797
+ }
3798
+
3799
+ /// Expect a [`Node::Field`] or panic.
3800
+ #[ track_caller]
3801
+ pub fn expect_field ( self ) -> & ' hir FieldDef < ' hir > {
3802
+ let Node :: Field ( this) = self else { unreachable ! ( ) } ;
3803
+ this
3804
+ }
3805
+
3806
+ /// Expect a [`Node::AnonConst`] or panic.
3807
+ #[ track_caller]
3808
+ pub fn expect_anon_const ( self ) -> & ' hir AnonConst {
3809
+ let Node :: AnonConst ( this) = self else { unreachable ! ( ) } ;
3810
+ this
3811
+ }
3812
+
3813
+ /// Expect a [`Node::Expr`] or panic.
3814
+ #[ track_caller]
3815
+ pub fn expect_expr ( self ) -> & ' hir Expr < ' hir > {
3816
+ let Node :: Expr ( this) = self else { unreachable ! ( ) } ;
3817
+ this
3818
+ }
3819
+ /// Expect a [`Node::ExprField`] or panic.
3820
+ #[ track_caller]
3821
+ pub fn expect_expr_field ( self ) -> & ' hir ExprField < ' hir > {
3822
+ let Node :: ExprField ( this) = self else { unreachable ! ( ) } ;
3823
+ this
3824
+ }
3825
+
3826
+ /// Expect a [`Node::Stmt`] or panic.
3827
+ #[ track_caller]
3828
+ pub fn expect_stmt ( self ) -> & ' hir Stmt < ' hir > {
3829
+ let Node :: Stmt ( this) = self else { unreachable ! ( ) } ;
3830
+ this
3831
+ }
3832
+
3833
+ /// Expect a [`Node::PathSegment`] or panic.
3834
+ #[ track_caller]
3835
+ pub fn expect_path_segment ( self ) -> & ' hir PathSegment < ' hir > {
3836
+ let Node :: PathSegment ( this) = self else { unreachable ! ( ) } ;
3837
+ this
3838
+ }
3839
+
3840
+ /// Expect a [`Node::Ty`] or panic.
3841
+ #[ track_caller]
3842
+ pub fn expect_ty ( self ) -> & ' hir Ty < ' hir > {
3843
+ let Node :: Ty ( this) = self else { unreachable ! ( ) } ;
3844
+ this
3845
+ }
3846
+
3847
+ /// Expect a [`Node::TypeBinding`] or panic.
3848
+ #[ track_caller]
3849
+ pub fn expect_type_binding ( self ) -> & ' hir TypeBinding < ' hir > {
3850
+ let Node :: TypeBinding ( this) = self else { unreachable ! ( ) } ;
3851
+ this
3852
+ }
3853
+
3854
+ /// Expect a [`Node::TraitRef`] or panic.
3855
+ #[ track_caller]
3856
+ pub fn expect_trait_ref ( self ) -> & ' hir TraitRef < ' hir > {
3857
+ let Node :: TraitRef ( this) = self else { unreachable ! ( ) } ;
3858
+ this
3859
+ }
3860
+
3861
+ /// Expect a [`Node::Pat`] or panic.
3862
+ #[ track_caller]
3863
+ pub fn expect_pat ( self ) -> & ' hir Pat < ' hir > {
3864
+ let Node :: Pat ( this) = self else { unreachable ! ( ) } ;
3865
+ this
3866
+ }
3867
+
3868
+ /// Expect a [`Node::PatField`] or panic.
3869
+ #[ track_caller]
3870
+ pub fn expect_pat_field ( self ) -> & ' hir PatField < ' hir > {
3871
+ let Node :: PatField ( this) = self else { unreachable ! ( ) } ;
3872
+ this
3873
+ }
3874
+
3875
+ /// Expect a [`Node::Arm`] or panic.
3876
+ #[ track_caller]
3877
+ pub fn expect_arm ( self ) -> & ' hir Arm < ' hir > {
3878
+ let Node :: Arm ( this) = self else { unreachable ! ( ) } ;
3879
+ this
3880
+ }
3881
+
3882
+ /// Expect a [`Node::Block`] or panic.
3883
+ #[ track_caller]
3884
+ pub fn expect_block ( self ) -> & ' hir Block < ' hir > {
3885
+ let Node :: Block ( this) = self else { unreachable ! ( ) } ;
3886
+ this
3887
+ }
3888
+
3889
+ /// Expect a [`Node::Local`] or panic.
3890
+ #[ track_caller]
3891
+ pub fn expect_local ( self ) -> & ' hir Local < ' hir > {
3892
+ let Node :: Local ( this) = self else { unreachable ! ( ) } ;
3893
+ this
3894
+ }
3895
+
3896
+ /// Expect a [`Node::Ctor`] or panic.
3897
+ #[ track_caller]
3898
+ pub fn expect_ctor ( self ) -> & ' hir VariantData < ' hir > {
3899
+ let Node :: Ctor ( this) = self else { unreachable ! ( ) } ;
3900
+ this
3901
+ }
3902
+
3903
+ /// Expect a [`Node::Lifetime`] or panic.
3904
+ #[ track_caller]
3905
+ pub fn expect_lifetime ( self ) -> & ' hir Lifetime {
3906
+ let Node :: Lifetime ( this) = self else { unreachable ! ( ) } ;
3907
+ this
3908
+ }
3909
+
3910
+ /// Expect a [`Node::GenericParam`] or panic.
3911
+ #[ track_caller]
3912
+ pub fn expect_generic_param ( self ) -> & ' hir GenericParam < ' hir > {
3913
+ let Node :: GenericParam ( this) = self else { unreachable ! ( ) } ;
3914
+ this
3915
+ }
3916
+
3917
+ /// Expect a [`Node::Crate`] or panic.
3918
+ #[ track_caller]
3919
+ pub fn expect_crate ( self ) -> & ' hir Mod < ' hir > {
3920
+ let Node :: Crate ( this) = self else { unreachable ! ( ) } ;
3921
+ this
3922
+ }
3923
+
3924
+ /// Expect a [`Node::Infer`] or panic.
3925
+ #[ track_caller]
3926
+ pub fn expect_infer ( self ) -> & ' hir InferArg {
3927
+ let Node :: Infer ( this) = self else { unreachable ! ( ) } ;
3928
+ this
3929
+ }
3593
3930
}
3594
3931
3595
3932
// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
0 commit comments