@@ -2263,7 +2263,7 @@ pub struct TraitItem<'hir> {
22632263 pub defaultness : Defaultness ,
22642264}
22652265
2266- impl TraitItem < ' _ > {
2266+ impl < ' hir > TraitItem < ' hir > {
22672267 #[ inline]
22682268 pub fn hir_id ( & self ) -> HirId {
22692269 // Items are always HIR owners.
@@ -2273,6 +2273,27 @@ impl TraitItem<'_> {
22732273 pub fn trait_item_id ( & self ) -> TraitItemId {
22742274 TraitItemId { owner_id : self . owner_id }
22752275 }
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+ }
22762297}
22772298
22782299/// Represents a trait method's body (or just argument names).
@@ -2325,7 +2346,7 @@ pub struct ImplItem<'hir> {
23252346 pub vis_span : Span ,
23262347}
23272348
2328- impl ImplItem < ' _ > {
2349+ impl < ' hir > ImplItem < ' hir > {
23292350 #[ inline]
23302351 pub fn hir_id ( & self ) -> HirId {
23312352 // Items are always HIR owners.
@@ -2335,6 +2356,27 @@ impl ImplItem<'_> {
23352356 pub fn impl_item_id ( & self ) -> ImplItemId {
23362357 ImplItemId { owner_id : self . owner_id }
23372358 }
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+ }
23382380}
23392381
23402382/// Represents various kinds of content within an `impl`.
@@ -2995,7 +3037,7 @@ pub struct Item<'hir> {
29953037 pub vis_span : Span ,
29963038}
29973039
2998- impl Item < ' _ > {
3040+ impl < ' hir > Item < ' hir > {
29993041 #[ inline]
30003042 pub fn hir_id ( & self ) -> HirId {
30013043 // Items are always HIR owners.
@@ -3005,6 +3047,127 @@ impl Item<'_> {
30053047 pub fn item_id ( & self ) -> ItemId {
30063048 ItemId { owner_id : self . owner_id }
30073049 }
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+ }
30083171}
30093172
30103173#[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , Hash , Debug ) ]
@@ -3590,6 +3753,180 @@ impl<'hir> Node<'hir> {
35903753 pub fn tuple_fields ( & self ) -> Option < & ' hir [ FieldDef < ' hir > ] > {
35913754 if let Node :: Ctor ( & VariantData :: Tuple ( fields, _, _) ) = self { Some ( fields) } else { None }
35923755 }
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+ }
35933930}
35943931
35953932// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
0 commit comments