Skip to content

Commit 69c4e81

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 419d205 commit 69c4e81

File tree

4 files changed

+22
-119
lines changed

4 files changed

+22
-119
lines changed

Diff for: compiler/rustc_hir_analysis/src/collect/generics_of.rs

+3-23
Original file line numberDiff line numberDiff line change
@@ -508,29 +508,9 @@ fn has_late_bound_regions<'tcx>(tcx: TyCtxt<'tcx>, node: Node<'tcx>) -> Option<S
508508
visitor.has_late_bound_regions
509509
}
510510

511-
match node {
512-
Node::TraitItem(item) => match &item.kind {
513-
hir::TraitItemKind::Fn(sig, _) => has_late_bound_regions(tcx, item.generics, sig.decl),
514-
_ => None,
515-
},
516-
Node::ImplItem(item) => match &item.kind {
517-
hir::ImplItemKind::Fn(sig, _) => has_late_bound_regions(tcx, item.generics, sig.decl),
518-
_ => None,
519-
},
520-
Node::ForeignItem(item) => match item.kind {
521-
hir::ForeignItemKind::Fn(fn_decl, _, generics) => {
522-
has_late_bound_regions(tcx, generics, fn_decl)
523-
}
524-
_ => None,
525-
},
526-
Node::Item(item) => match &item.kind {
527-
hir::ItemKind::Fn(sig, .., generics, _) => {
528-
has_late_bound_regions(tcx, generics, sig.decl)
529-
}
530-
_ => None,
531-
},
532-
_ => None,
533-
}
511+
let decl = node.fn_decl()?;
512+
let generics = node.generics()?;
513+
has_late_bound_regions(tcx, generics, decl)
534514
}
535515

536516
struct AnonConstInParamTyDetector {

Diff for: 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);
@@ -703,45 +682,17 @@ pub(super) fn type_param_predicates(
703682
let mut extend = None;
704683

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

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

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

Diff for: 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 {

Diff for: 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)