Delegation: allow foreign fns reuse
This commit is contained in:
parent
961351c76c
commit
63447f2095
5 changed files with 87 additions and 13 deletions
|
@ -5117,12 +5117,18 @@ struct ItemInfoCollector<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
impl ItemInfoCollector<'_, '_, '_> {
|
||||
fn collect_fn_info(&mut self, sig: &FnSig, id: NodeId, attrs: &[Attribute]) {
|
||||
fn collect_fn_info(
|
||||
&mut self,
|
||||
header: FnHeader,
|
||||
decl: &FnDecl,
|
||||
id: NodeId,
|
||||
attrs: &[Attribute],
|
||||
) {
|
||||
let sig = DelegationFnSig {
|
||||
header: sig.header,
|
||||
param_count: sig.decl.inputs.len(),
|
||||
has_self: sig.decl.has_self(),
|
||||
c_variadic: sig.decl.c_variadic(),
|
||||
header,
|
||||
param_count: decl.inputs.len(),
|
||||
has_self: decl.has_self(),
|
||||
c_variadic: decl.c_variadic(),
|
||||
target_feature: attrs.iter().any(|attr| attr.has_name(sym::target_feature)),
|
||||
};
|
||||
self.r.delegation_fn_sigs.insert(self.r.local_def_id(id), sig);
|
||||
|
@ -5142,7 +5148,7 @@ impl<'ast> Visitor<'ast> for ItemInfoCollector<'_, '_, '_> {
|
|||
| ItemKind::Trait(box Trait { generics, .. })
|
||||
| ItemKind::TraitAlias(generics, _) => {
|
||||
if let ItemKind::Fn(box Fn { sig, .. }) = &item.kind {
|
||||
self.collect_fn_info(sig, item.id, &item.attrs);
|
||||
self.collect_fn_info(sig.header, &sig.decl, item.id, &item.attrs);
|
||||
}
|
||||
|
||||
let def_id = self.r.local_def_id(item.id);
|
||||
|
@ -5154,8 +5160,17 @@ impl<'ast> Visitor<'ast> for ItemInfoCollector<'_, '_, '_> {
|
|||
self.r.item_generics_num_lifetimes.insert(def_id, count);
|
||||
}
|
||||
|
||||
ItemKind::ForeignMod(ForeignMod { extern_span, safety: _, abi, items }) => {
|
||||
for foreign_item in items {
|
||||
if let ForeignItemKind::Fn(box Fn { sig, .. }) = &foreign_item.kind {
|
||||
let new_header =
|
||||
FnHeader { ext: Extern::from_abi(*abi, *extern_span), ..sig.header };
|
||||
self.collect_fn_info(new_header, &sig.decl, foreign_item.id, &item.attrs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ItemKind::Mod(..)
|
||||
| ItemKind::ForeignMod(..)
|
||||
| ItemKind::Static(..)
|
||||
| ItemKind::Use(..)
|
||||
| ItemKind::ExternCrate(..)
|
||||
|
@ -5175,7 +5190,7 @@ impl<'ast> Visitor<'ast> for ItemInfoCollector<'_, '_, '_> {
|
|||
|
||||
fn visit_assoc_item(&mut self, item: &'ast AssocItem, ctxt: AssocCtxt) {
|
||||
if let AssocItemKind::Fn(box Fn { sig, .. }) = &item.kind {
|
||||
self.collect_fn_info(sig, item.id, &item.attrs);
|
||||
self.collect_fn_info(sig.header, &sig.decl, item.id, &item.attrs);
|
||||
}
|
||||
visit::walk_assoc_item(self, item, ctxt);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue