Skip to content

Commit 6baf7fd

Browse files
committed
Use hir::Node helper methods instead of repeat the same impl multiple times
There already were inconsistencies, so this ensures we don't introduce subtle surprising bugs
1 parent 6206de2 commit 6baf7fd

File tree

4 files changed

+22
-119
lines changed

4 files changed

+22
-119
lines changed

compiler/rustc_hir_analysis/src/collect/generics_of.rs

+3-23
Original file line numberDiff line numberDiff line change
@@ -471,29 +471,9 @@ fn has_late_bound_regions<'tcx>(tcx: TyCtxt<'tcx>, node: Node<'tcx>) -> Option<S
471471
visitor.has_late_bound_regions
472472
}
473473

474-
match node {
475-
Node::TraitItem(item) => match &item.kind {
476-
hir::TraitItemKind::Fn(sig, _) => has_late_bound_regions(tcx, item.generics, sig.decl),
477-
_ => None,
478-
},
479-
Node::ImplItem(item) => match &item.kind {
480-
hir::ImplItemKind::Fn(sig, _) => has_late_bound_regions(tcx, item.generics, sig.decl),
481-
_ => None,
482-
},
483-
Node::ForeignItem(item) => match item.kind {
484-
hir::ForeignItemKind::Fn(fn_decl, _, generics) => {
485-
has_late_bound_regions(tcx, generics, fn_decl)
486-
}
487-
_ => None,
488-
},
489-
Node::Item(item) => match &item.kind {
490-
hir::ItemKind::Fn(sig, .., generics, _) => {
491-
has_late_bound_regions(tcx, generics, sig.decl)
492-
}
493-
_ => None,
494-
},
495-
_ => None,
496-
}
474+
let decl = node.fn_decl()?;
475+
let generics = node.generics()?;
476+
has_late_bound_regions(tcx, generics, decl)
497477
}
498478

499479
struct AnonConstInParamTyDetector {

compiler/rustc_hir_analysis/src/collect/predicates_of.rs

+17-66
Original file line numberDiff line numberDiff line change
@@ -123,43 +123,22 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
123123
// Preserving the order of insertion is important here so as not to break UI tests.
124124
let mut predicates: FxIndexSet<(ty::Clause<'_>, Span)> = FxIndexSet::default();
125125

126-
let ast_generics = match node {
127-
Node::TraitItem(item) => item.generics,
128-
129-
Node::ImplItem(item) => item.generics,
130-
131-
Node::Item(item) => match item.kind {
126+
let ast_generics = node.generics().unwrap_or(NO_GENERICS);
127+
if let Node::Item(item) = node {
128+
match item.kind {
132129
ItemKind::Impl(impl_) => {
133130
if impl_.defaultness.is_default() {
134131
is_default_impl_trait = tcx
135132
.impl_trait_ref(def_id)
136133
.map(|t| ty::Binder::dummy(t.instantiate_identity()));
137134
}
138-
impl_.generics
139135
}
140-
ItemKind::Fn(.., generics, _)
141-
| ItemKind::TyAlias(_, generics)
142-
| ItemKind::Const(_, generics, _)
143-
| ItemKind::Enum(_, generics)
144-
| ItemKind::Struct(_, generics)
145-
| ItemKind::Union(_, generics) => generics,
146-
147-
ItemKind::Trait(_, _, generics, self_bounds, ..)
148-
| ItemKind::TraitAlias(generics, self_bounds) => {
136+
137+
ItemKind::Trait(_, _, _, self_bounds, ..) | ItemKind::TraitAlias(_, self_bounds) => {
149138
is_trait = Some(self_bounds);
150-
generics
151139
}
152-
ItemKind::OpaqueTy(OpaqueTy { generics, .. }) => generics,
153-
_ => NO_GENERICS,
154-
},
155-
156-
Node::ForeignItem(item) => match item.kind {
157-
ForeignItemKind::Static(..) => NO_GENERICS,
158-
ForeignItemKind::Fn(_, _, generics) => generics,
159-
ForeignItemKind::Type => NO_GENERICS,
160-
},
161-
162-
_ => NO_GENERICS,
140+
_ => {}
141+
}
163142
};
164143

165144
let generics = tcx.generics_of(def_id);
@@ -705,45 +684,17 @@ pub(super) fn type_param_predicates(
705684
let mut extend = None;
706685

707686
let item_hir_id = tcx.local_def_id_to_hir_id(item_def_id);
708-
let ast_generics = match tcx.hir_node(item_hir_id) {
709-
Node::TraitItem(item) => item.generics,
710-
711-
Node::ImplItem(item) => item.generics,
712-
713-
Node::Item(item) => {
714-
match item.kind {
715-
ItemKind::Fn(.., generics, _)
716-
| ItemKind::Impl(&hir::Impl { generics, .. })
717-
| ItemKind::TyAlias(_, generics)
718-
| ItemKind::Const(_, generics, _)
719-
| ItemKind::OpaqueTy(&OpaqueTy {
720-
generics,
721-
origin: hir::OpaqueTyOrigin::TyAlias { .. },
722-
..
723-
})
724-
| ItemKind::Enum(_, generics)
725-
| ItemKind::Struct(_, generics)
726-
| ItemKind::Union(_, generics) => generics,
727-
ItemKind::Trait(_, _, generics, ..) => {
728-
// Implied `Self: Trait` and supertrait bounds.
729-
if param_id == item_hir_id {
730-
let identity_trait_ref =
731-
ty::TraitRef::identity(tcx, item_def_id.to_def_id());
732-
extend = Some((identity_trait_ref.to_predicate(tcx), item.span));
733-
}
734-
generics
735-
}
736-
_ => return result,
737-
}
738-
}
739-
740-
Node::ForeignItem(item) => match item.kind {
741-
ForeignItemKind::Fn(_, _, generics) => generics,
742-
_ => return result,
743-
},
744687

745-
_ => return result,
746-
};
688+
let hir_node = tcx.hir_node(item_hir_id);
689+
let Some(ast_generics) = hir_node.generics() else { return result };
690+
if let Node::Item(item) = hir_node
691+
&& let ItemKind::Trait(..) = item.kind
692+
// Implied `Self: Trait` and supertrait bounds.
693+
&& param_id == item_hir_id
694+
{
695+
let identity_trait_ref = ty::TraitRef::identity(tcx, item_def_id.to_def_id());
696+
extend = Some((identity_trait_ref.to_predicate(tcx), item.span));
697+
}
747698

748699
let icx = ItemCtxt::new(tcx, item_def_id);
749700
let extra_predicates = extend.into_iter().chain(

compiler/rustc_hir_typeck/src/lib.rs

+1-23
Original file line numberDiff line numberDiff line change
@@ -95,29 +95,7 @@ macro_rules! type_error_struct {
9595
fn primary_body_of(
9696
node: Node<'_>,
9797
) -> Option<(hir::BodyId, Option<&hir::Ty<'_>>, Option<&hir::FnSig<'_>>)> {
98-
match node {
99-
Node::Item(item) => match item.kind {
100-
hir::ItemKind::Const(ty, _, body) | hir::ItemKind::Static(ty, _, body) => {
101-
Some((body, Some(ty), None))
102-
}
103-
hir::ItemKind::Fn(ref sig, .., body) => Some((body, None, Some(sig))),
104-
_ => None,
105-
},
106-
Node::TraitItem(item) => match item.kind {
107-
hir::TraitItemKind::Const(ty, Some(body)) => Some((body, Some(ty), None)),
108-
hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => {
109-
Some((body, None, Some(sig)))
110-
}
111-
_ => None,
112-
},
113-
Node::ImplItem(item) => match item.kind {
114-
hir::ImplItemKind::Const(ty, body) => Some((body, Some(ty), None)),
115-
hir::ImplItemKind::Fn(ref sig, body) => Some((body, None, Some(sig))),
116-
_ => None,
117-
},
118-
Node::AnonConst(constant) => Some((constant.body, None, None)),
119-
_ => None,
120-
}
98+
Some((node.body_id()?, node.ty(), node.fn_sig()))
12199
}
122100

123101
fn has_typeck_results(tcx: TyCtxt<'_>, def_id: DefId) -> bool {

compiler/rustc_passes/src/check_attr.rs

+1-7
Original file line numberDiff line numberDiff line change
@@ -609,13 +609,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
609609
&& !self.tcx.sess.target.is_like_wasm
610610
&& !self.tcx.sess.opts.actually_rustdoc
611611
{
612-
let hir::Node::Item(item) = self.tcx.hir_node(hir_id) else {
613-
unreachable!();
614-
};
615-
let hir::ItemKind::Fn(sig, _, _) = item.kind else {
616-
// target is `Fn`
617-
unreachable!();
618-
};
612+
let sig = self.tcx.hir_node(hir_id).fn_sig().unwrap();
619613

620614
self.dcx().emit_err(errors::LangItemWithTargetFeature {
621615
attr_span: attr.span,

0 commit comments

Comments
 (0)