Skip to content

Commit 591d865

Browse files
committed
Delegation: support generics in associated delegation items
1 parent 8aeaa5f commit 591d865

14 files changed

+492
-271
lines changed

compiler/rustc_hir_analysis/src/collect/generics_of.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics {
5858
let hir_id = tcx.local_def_id_to_hir_id(def_id);
5959

6060
let node = tcx.hir_node(hir_id);
61+
if let Some(sig) = node.fn_sig()
62+
&& let Some(sig_id) = sig.decl.opt_delegation_sig_id()
63+
{
64+
return inherit_generics_for_delegation_item(tcx, def_id, sig_id);
65+
}
66+
6167
let parent_def_id = match node {
6268
Node::ImplItem(_)
6369
| Node::TraitItem(_)
@@ -228,16 +234,6 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics {
228234
// inherit the generics of the item.
229235
Some(parent.to_def_id())
230236
}
231-
ItemKind::Fn(sig, _, _) => {
232-
// For a delegation item inherit generics from callee.
233-
if let Some(sig_id) = sig.decl.opt_delegation_sig_id()
234-
&& let Some(generics) =
235-
inherit_generics_for_delegation_item(tcx, def_id, sig_id)
236-
{
237-
return generics;
238-
}
239-
None
240-
}
241237
_ => None,
242238
},
243239
_ => None,

compiler/rustc_hir_analysis/src/collect/predicates_of.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
120120
let hir_id = tcx.local_def_id_to_hir_id(def_id);
121121
let node = tcx.hir_node(hir_id);
122122

123+
if let Some(sig) = node.fn_sig()
124+
&& let Some(sig_id) = sig.decl.opt_delegation_sig_id()
125+
{
126+
return inherit_predicates_for_delegation_item(tcx, def_id, sig_id);
127+
}
128+
123129
let mut is_trait = None;
124130
let mut is_default_impl_trait = None;
125131

@@ -146,16 +152,6 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
146152
ItemKind::Trait(_, _, _, self_bounds, ..) | ItemKind::TraitAlias(_, self_bounds) => {
147153
is_trait = Some(self_bounds);
148154
}
149-
150-
ItemKind::Fn(sig, _, _) => {
151-
// For a delegation item inherit predicates from callee.
152-
if let Some(sig_id) = sig.decl.opt_delegation_sig_id()
153-
&& let Some(predicates) =
154-
inherit_predicates_for_delegation_item(tcx, def_id, sig_id)
155-
{
156-
return predicates;
157-
}
158-
}
159155
_ => {}
160156
}
161157
};

0 commit comments

Comments
 (0)