Skip to content

Commit 70f9d52

Browse files
committed
Add and use expect methods to hir.
1 parent 56ee852 commit 70f9d52

File tree

7 files changed

+356
-23
lines changed

7 files changed

+356
-23
lines changed

compiler/rustc_hir/src/hir.rs

Lines changed: 340 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)