Auto merge of #138740 - nnethercote:ast-ItemKind-idents, r=fmease
Move `ast::Item::ident` into `ast::ItemKind` The follow-up to #138384, which did the same thing for `hir::ItemKind`. r? `@fmease`
This commit is contained in:
commit
ed201574c5
59 changed files with 1217 additions and 1015 deletions
|
@ -10,8 +10,8 @@ use std::sync::Arc;
|
|||
|
||||
use rustc_ast::visit::{self, AssocCtxt, Visitor, WalkItemKind};
|
||||
use rustc_ast::{
|
||||
self as ast, AssocItem, AssocItemKind, Block, ForeignItem, ForeignItemKind, Impl, Item,
|
||||
ItemKind, MetaItemKind, NodeId, StmtKind,
|
||||
self as ast, AssocItem, AssocItemKind, Block, ConstItem, Delegation, Fn, ForeignItem,
|
||||
ForeignItemKind, Impl, Item, ItemKind, MetaItemKind, NodeId, StaticItem, StmtKind, TyAlias,
|
||||
};
|
||||
use rustc_attr_parsing as attr;
|
||||
use rustc_expand::base::ResolverExpand;
|
||||
|
@ -735,7 +735,6 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
let parent_scope = &self.parent_scope;
|
||||
let parent = parent_scope.module;
|
||||
let expansion = parent_scope.expansion;
|
||||
let ident = item.ident;
|
||||
let sp = item.span;
|
||||
let vis = self.resolve_visibility(&item.vis);
|
||||
let feed = self.r.feed(item.id);
|
||||
|
@ -762,17 +761,18 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
);
|
||||
}
|
||||
|
||||
ItemKind::ExternCrate(orig_name) => {
|
||||
ItemKind::ExternCrate(orig_name, ident) => {
|
||||
self.build_reduced_graph_for_extern_crate(
|
||||
orig_name,
|
||||
item,
|
||||
ident,
|
||||
local_def_id,
|
||||
vis,
|
||||
parent,
|
||||
);
|
||||
}
|
||||
|
||||
ItemKind::Mod(.., ref mod_kind) => {
|
||||
ItemKind::Mod(_, ident, ref mod_kind) => {
|
||||
let module = self.r.new_module(
|
||||
Some(parent),
|
||||
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
|
||||
|
@ -792,10 +792,12 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
// These items live in the value namespace.
|
||||
ItemKind::Const(..) | ItemKind::Delegation(..) | ItemKind::Static(..) => {
|
||||
ItemKind::Const(box ConstItem { ident, .. })
|
||||
| ItemKind::Delegation(box Delegation { ident, .. })
|
||||
| ItemKind::Static(box StaticItem { ident, .. }) => {
|
||||
self.r.define(parent, ident, ValueNS, (res, vis, sp, expansion));
|
||||
}
|
||||
ItemKind::Fn(..) => {
|
||||
ItemKind::Fn(box Fn { ident, .. }) => {
|
||||
self.r.define(parent, ident, ValueNS, (res, vis, sp, expansion));
|
||||
|
||||
// Functions introducing procedural macros reserve a slot
|
||||
|
@ -804,11 +806,11 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
// These items live in the type namespace.
|
||||
ItemKind::TyAlias(..) | ItemKind::TraitAlias(..) => {
|
||||
ItemKind::TyAlias(box TyAlias { ident, .. }) | ItemKind::TraitAlias(ident, ..) => {
|
||||
self.r.define(parent, ident, TypeNS, (res, vis, sp, expansion));
|
||||
}
|
||||
|
||||
ItemKind::Enum(_, _) | ItemKind::Trait(..) => {
|
||||
ItemKind::Enum(ident, _, _) | ItemKind::Trait(box ast::Trait { ident, .. }) => {
|
||||
let module = self.r.new_module(
|
||||
Some(parent),
|
||||
ModuleKind::Def(def_kind, def_id, Some(ident.name)),
|
||||
|
@ -821,7 +823,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
// These items live in both the type and value namespaces.
|
||||
ItemKind::Struct(ref vdata, _) => {
|
||||
ItemKind::Struct(ident, ref vdata, _) => {
|
||||
self.build_reduced_graph_for_struct_variant(
|
||||
vdata.fields(),
|
||||
ident,
|
||||
|
@ -872,7 +874,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
ItemKind::Union(ref vdata, _) => {
|
||||
ItemKind::Union(ident, ref vdata, _) => {
|
||||
self.build_reduced_graph_for_struct_variant(
|
||||
vdata.fields(),
|
||||
ident,
|
||||
|
@ -899,11 +901,11 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
&mut self,
|
||||
orig_name: Option<Symbol>,
|
||||
item: &Item,
|
||||
ident: Ident,
|
||||
local_def_id: LocalDefId,
|
||||
vis: ty::Visibility,
|
||||
parent: Module<'ra>,
|
||||
) {
|
||||
let ident = item.ident;
|
||||
let sp = item.span;
|
||||
let parent_scope = self.parent_scope;
|
||||
let expansion = parent_scope.expansion;
|
||||
|
@ -987,7 +989,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
/// Constructs the reduced graph for one foreign item.
|
||||
fn build_reduced_graph_for_foreign_item(&mut self, item: &ForeignItem) {
|
||||
fn build_reduced_graph_for_foreign_item(&mut self, item: &ForeignItem, ident: Ident) {
|
||||
let feed = self.r.feed(item.id);
|
||||
let local_def_id = feed.key();
|
||||
let def_id = local_def_id.to_def_id();
|
||||
|
@ -1000,7 +1002,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
let parent = self.parent_scope.module;
|
||||
let expansion = self.parent_scope.expansion;
|
||||
let vis = self.resolve_visibility(&item.vis);
|
||||
self.r.define(parent, item.ident, ns, (self.res(def_id), vis, item.span, expansion));
|
||||
self.r.define(parent, ident, ns, (self.res(def_id), vis, item.span, expansion));
|
||||
self.r.feed_visibility(feed, vis);
|
||||
}
|
||||
|
||||
|
@ -1043,7 +1045,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
span: item.span,
|
||||
});
|
||||
}
|
||||
if let ItemKind::ExternCrate(Some(orig_name)) = item.kind
|
||||
if let ItemKind::ExternCrate(Some(orig_name), _) = item.kind
|
||||
&& orig_name == kw::SelfLower
|
||||
{
|
||||
self.r.dcx().emit_err(errors::MacroUseExternCrateSelf { span: attr.span });
|
||||
|
@ -1177,11 +1179,15 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
self.r.arenas.alloc_macro_rules_scope(MacroRulesScope::Invocation(invoc_id))
|
||||
}
|
||||
|
||||
fn proc_macro_stub(&self, item: &ast::Item) -> Option<(MacroKind, Ident, Span)> {
|
||||
fn proc_macro_stub(
|
||||
&self,
|
||||
item: &ast::Item,
|
||||
fn_ident: Ident,
|
||||
) -> Option<(MacroKind, Ident, Span)> {
|
||||
if ast::attr::contains_name(&item.attrs, sym::proc_macro) {
|
||||
return Some((MacroKind::Bang, item.ident, item.span));
|
||||
return Some((MacroKind::Bang, fn_ident, item.span));
|
||||
} else if ast::attr::contains_name(&item.attrs, sym::proc_macro_attribute) {
|
||||
return Some((MacroKind::Attr, item.ident, item.span));
|
||||
return Some((MacroKind::Attr, fn_ident, item.span));
|
||||
} else if let Some(attr) = ast::attr::find_by_name(&item.attrs, sym::proc_macro_derive)
|
||||
&& let Some(meta_item_inner) =
|
||||
attr.meta_item_list().and_then(|list| list.get(0).cloned())
|
||||
|
@ -1214,17 +1220,21 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
let feed = self.r.feed(item.id);
|
||||
let def_id = feed.key();
|
||||
let (res, ident, span, macro_rules) = match &item.kind {
|
||||
ItemKind::MacroDef(def) => (self.res(def_id), item.ident, item.span, def.macro_rules),
|
||||
ItemKind::Fn(..) => match self.proc_macro_stub(item) {
|
||||
Some((macro_kind, ident, span)) => {
|
||||
let res = Res::Def(DefKind::Macro(macro_kind), def_id.to_def_id());
|
||||
let macro_data = MacroData::new(self.r.dummy_ext(macro_kind));
|
||||
self.r.macro_map.insert(def_id.to_def_id(), macro_data);
|
||||
self.r.proc_macro_stubs.insert(def_id);
|
||||
(res, ident, span, false)
|
||||
ItemKind::MacroDef(ident, def) => {
|
||||
(self.res(def_id), *ident, item.span, def.macro_rules)
|
||||
}
|
||||
ItemKind::Fn(box ast::Fn { ident: fn_ident, .. }) => {
|
||||
match self.proc_macro_stub(item, *fn_ident) {
|
||||
Some((macro_kind, ident, span)) => {
|
||||
let res = Res::Def(DefKind::Macro(macro_kind), def_id.to_def_id());
|
||||
let macro_data = MacroData::new(self.r.dummy_ext(macro_kind));
|
||||
self.r.macro_map.insert(def_id.to_def_id(), macro_data);
|
||||
self.r.proc_macro_stubs.insert(def_id);
|
||||
(res, ident, span, false)
|
||||
}
|
||||
None => return parent_scope.macro_rules,
|
||||
}
|
||||
None => return parent_scope.macro_rules,
|
||||
},
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
|
@ -1327,8 +1337,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
// Visit attributes after items for backward compatibility.
|
||||
// This way they can use `macro_rules` defined later.
|
||||
self.visit_vis(&item.vis);
|
||||
self.visit_ident(&item.ident);
|
||||
item.kind.walk(item.span, item.id, &item.ident, &item.vis, (), self);
|
||||
item.kind.walk(item.span, item.id, &item.vis, (), self);
|
||||
visit::walk_list!(self, visit_attribute, &item.attrs);
|
||||
}
|
||||
_ => visit::walk_item(self, item),
|
||||
|
@ -1353,12 +1362,17 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
fn visit_foreign_item(&mut self, foreign_item: &'a ForeignItem) {
|
||||
if let ForeignItemKind::MacCall(_) = foreign_item.kind {
|
||||
self.visit_invoc_in_module(foreign_item.id);
|
||||
return;
|
||||
}
|
||||
let ident = match foreign_item.kind {
|
||||
ForeignItemKind::Static(box StaticItem { ident, .. })
|
||||
| ForeignItemKind::Fn(box Fn { ident, .. })
|
||||
| ForeignItemKind::TyAlias(box TyAlias { ident, .. }) => ident,
|
||||
ForeignItemKind::MacCall(_) => {
|
||||
self.visit_invoc_in_module(foreign_item.id);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
self.build_reduced_graph_for_foreign_item(foreign_item);
|
||||
self.build_reduced_graph_for_foreign_item(foreign_item, ident);
|
||||
visit::walk_item(self, foreign_item);
|
||||
}
|
||||
|
||||
|
@ -1372,26 +1386,35 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
fn visit_assoc_item(&mut self, item: &'a AssocItem, ctxt: AssocCtxt) {
|
||||
if let AssocItemKind::MacCall(_) = item.kind {
|
||||
match ctxt {
|
||||
AssocCtxt::Trait => {
|
||||
self.visit_invoc_in_module(item.id);
|
||||
}
|
||||
AssocCtxt::Impl { .. } => {
|
||||
let invoc_id = item.id.placeholder_to_expn_id();
|
||||
if !self.r.glob_delegation_invoc_ids.contains(&invoc_id) {
|
||||
self.r
|
||||
.impl_unexpanded_invocations
|
||||
.entry(self.r.invocation_parent(invoc_id))
|
||||
.or_default()
|
||||
.insert(invoc_id);
|
||||
}
|
||||
self.visit_invoc(item.id);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
let (ident, ns) = match item.kind {
|
||||
AssocItemKind::Const(box ConstItem { ident, .. })
|
||||
| AssocItemKind::Fn(box Fn { ident, .. })
|
||||
| AssocItemKind::Delegation(box Delegation { ident, .. }) => (ident, ValueNS),
|
||||
|
||||
AssocItemKind::Type(box TyAlias { ident, .. }) => (ident, TypeNS),
|
||||
|
||||
AssocItemKind::MacCall(_) => {
|
||||
match ctxt {
|
||||
AssocCtxt::Trait => {
|
||||
self.visit_invoc_in_module(item.id);
|
||||
}
|
||||
AssocCtxt::Impl { .. } => {
|
||||
let invoc_id = item.id.placeholder_to_expn_id();
|
||||
if !self.r.glob_delegation_invoc_ids.contains(&invoc_id) {
|
||||
self.r
|
||||
.impl_unexpanded_invocations
|
||||
.entry(self.r.invocation_parent(invoc_id))
|
||||
.or_default()
|
||||
.insert(invoc_id);
|
||||
}
|
||||
self.visit_invoc(item.id);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
AssocItemKind::DelegationMac(..) => bug!(),
|
||||
};
|
||||
let vis = self.resolve_visibility(&item.vis);
|
||||
let feed = self.r.feed(item.id);
|
||||
let local_def_id = feed.key();
|
||||
|
@ -1406,20 +1429,13 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||
self.r.feed_visibility(feed, vis);
|
||||
}
|
||||
|
||||
let ns = match item.kind {
|
||||
AssocItemKind::Const(..) | AssocItemKind::Delegation(..) | AssocItemKind::Fn(..) => {
|
||||
ValueNS
|
||||
}
|
||||
AssocItemKind::Type(..) => TypeNS,
|
||||
AssocItemKind::MacCall(_) | AssocItemKind::DelegationMac(..) => bug!(), // handled above
|
||||
};
|
||||
if ctxt == AssocCtxt::Trait {
|
||||
let parent = self.parent_scope.module;
|
||||
let expansion = self.parent_scope.expansion;
|
||||
self.r.define(parent, item.ident, ns, (self.res(def_id), vis, item.span, expansion));
|
||||
self.r.define(parent, ident, ns, (self.res(def_id), vis, item.span, expansion));
|
||||
} else if !matches!(&item.kind, AssocItemKind::Delegation(deleg) if deleg.from_glob) {
|
||||
let impl_def_id = self.r.tcx.local_parent(local_def_id);
|
||||
let key = BindingKey::new(item.ident.normalize_to_macros_2_0(), ns);
|
||||
let key = BindingKey::new(ident.normalize_to_macros_2_0(), ns);
|
||||
self.r.impl_binding_keys.entry(impl_def_id).or_default().insert(key);
|
||||
}
|
||||
|
||||
|
|
|
@ -219,14 +219,14 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for UnusedImportCheckVisitor<'a, 'ra, 'tcx> {
|
|||
// because this means that they were generated in some fashion by the
|
||||
// compiler and we don't need to consider them.
|
||||
ast::ItemKind::Use(..) if item.span.is_dummy() => return,
|
||||
ast::ItemKind::ExternCrate(orig_name) => {
|
||||
ast::ItemKind::ExternCrate(orig_name, ident) => {
|
||||
self.extern_crate_items.push(ExternCrateToLint {
|
||||
id: item.id,
|
||||
span: item.span,
|
||||
vis_span: item.vis.span,
|
||||
span_with_attributes: item.span_with_attributes(),
|
||||
has_attrs: !item.attrs.is_empty(),
|
||||
ident: item.ident,
|
||||
ident,
|
||||
renames: orig_name.is_some(),
|
||||
});
|
||||
}
|
||||
|
|
|
@ -122,7 +122,7 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
},
|
||||
ItemKind::Const(..) => DefKind::Const,
|
||||
ItemKind::Fn(..) | ItemKind::Delegation(..) => DefKind::Fn,
|
||||
ItemKind::MacroDef(def) => {
|
||||
ItemKind::MacroDef(ident, def) => {
|
||||
let edition = i.span.edition();
|
||||
|
||||
// FIXME(jdonszelmann) make one of these in the resolver?
|
||||
|
@ -141,7 +141,7 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
);
|
||||
|
||||
let macro_data =
|
||||
self.resolver.compile_macro(def, i.ident, &attrs, i.span, i.id, edition);
|
||||
self.resolver.compile_macro(def, *ident, &attrs, i.span, i.id, edition);
|
||||
let macro_kind = macro_data.ext.macro_kind();
|
||||
opt_macro_data = Some(macro_data);
|
||||
DefKind::Macro(macro_kind)
|
||||
|
@ -152,7 +152,8 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
return self.visit_macro_invoc(i.id);
|
||||
}
|
||||
};
|
||||
let def_id = self.create_def(i.id, Some(i.ident.name), def_kind, i.span);
|
||||
let def_id =
|
||||
self.create_def(i.id, i.kind.ident().map(|ident| ident.name), def_kind, i.span);
|
||||
|
||||
if let Some(macro_data) = opt_macro_data {
|
||||
self.resolver.macro_map.insert(def_id.to_def_id(), macro_data);
|
||||
|
@ -161,7 +162,8 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
self.with_parent(def_id, |this| {
|
||||
this.with_impl_trait(ImplTraitContext::Existential, |this| {
|
||||
match i.kind {
|
||||
ItemKind::Struct(ref struct_def, _) | ItemKind::Union(ref struct_def, _) => {
|
||||
ItemKind::Struct(_, ref struct_def, _)
|
||||
| ItemKind::Union(_, ref struct_def, _) => {
|
||||
// If this is a unit or tuple-like struct, register the constructor.
|
||||
if let Some((ctor_kind, ctor_node_id)) = CtorKind::from_ast(struct_def) {
|
||||
this.create_def(
|
||||
|
@ -183,10 +185,12 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
match fn_kind {
|
||||
FnKind::Fn(
|
||||
_ctxt,
|
||||
_ident,
|
||||
_vis,
|
||||
Fn { sig: FnSig { header, decl, span: _ }, generics, contract, body, .. },
|
||||
Fn {
|
||||
sig: FnSig { header, decl, span: _ }, ident, generics, contract, body, ..
|
||||
},
|
||||
) if let Some(coroutine_kind) = header.coroutine_kind => {
|
||||
self.visit_ident(ident);
|
||||
self.visit_fn_header(header);
|
||||
self.visit_generics(generics);
|
||||
if let Some(contract) = contract {
|
||||
|
@ -234,8 +238,9 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
fn visit_foreign_item(&mut self, fi: &'a ForeignItem) {
|
||||
let def_kind = match fi.kind {
|
||||
let (ident, def_kind) = match fi.kind {
|
||||
ForeignItemKind::Static(box StaticItem {
|
||||
ident,
|
||||
ty: _,
|
||||
mutability,
|
||||
expr: _,
|
||||
|
@ -247,14 +252,14 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
ast::Safety::Safe(_) => hir::Safety::Safe,
|
||||
};
|
||||
|
||||
DefKind::Static { safety, mutability, nested: false }
|
||||
(ident, DefKind::Static { safety, mutability, nested: false })
|
||||
}
|
||||
ForeignItemKind::Fn(_) => DefKind::Fn,
|
||||
ForeignItemKind::TyAlias(_) => DefKind::ForeignTy,
|
||||
ForeignItemKind::Fn(box Fn { ident, .. }) => (ident, DefKind::Fn),
|
||||
ForeignItemKind::TyAlias(box TyAlias { ident, .. }) => (ident, DefKind::ForeignTy),
|
||||
ForeignItemKind::MacCall(_) => return self.visit_macro_invoc(fi.id),
|
||||
};
|
||||
|
||||
let def = self.create_def(fi.id, Some(fi.ident.name), def_kind, fi.span);
|
||||
let def = self.create_def(fi.id, Some(ident.name), def_kind, fi.span);
|
||||
|
||||
self.with_parent(def, |this| visit::walk_item(this, fi));
|
||||
}
|
||||
|
@ -318,16 +323,17 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
fn visit_assoc_item(&mut self, i: &'a AssocItem, ctxt: visit::AssocCtxt) {
|
||||
let def_kind = match &i.kind {
|
||||
AssocItemKind::Fn(..) | AssocItemKind::Delegation(..) => DefKind::AssocFn,
|
||||
AssocItemKind::Const(..) => DefKind::AssocConst,
|
||||
AssocItemKind::Type(..) => DefKind::AssocTy,
|
||||
let (ident, def_kind) = match &i.kind {
|
||||
AssocItemKind::Fn(box Fn { ident, .. })
|
||||
| AssocItemKind::Delegation(box Delegation { ident, .. }) => (*ident, DefKind::AssocFn),
|
||||
AssocItemKind::Const(box ConstItem { ident, .. }) => (*ident, DefKind::AssocConst),
|
||||
AssocItemKind::Type(box TyAlias { ident, .. }) => (*ident, DefKind::AssocTy),
|
||||
AssocItemKind::MacCall(..) | AssocItemKind::DelegationMac(..) => {
|
||||
return self.visit_macro_invoc(i.id);
|
||||
}
|
||||
};
|
||||
|
||||
let def = self.create_def(i.id, Some(i.ident.name), def_kind, i.span);
|
||||
let def = self.create_def(i.id, Some(ident.name), def_kind, i.span);
|
||||
self.with_parent(def, |this| visit::walk_assoc_item(this, i, ctxt));
|
||||
}
|
||||
|
||||
|
|
|
@ -3063,7 +3063,7 @@ impl<'tcx> visit::Visitor<'tcx> for UsePlacementFinder {
|
|||
|
||||
fn visit_item(&mut self, item: &'tcx ast::Item) {
|
||||
if self.target_module == item.id {
|
||||
if let ItemKind::Mod(_, ModKind::Loaded(items, _inline, mod_spans, _)) = &item.kind {
|
||||
if let ItemKind::Mod(_, _, ModKind::Loaded(items, _inline, mod_spans, _)) = &item.kind {
|
||||
let inject = mod_spans.inject_use_span;
|
||||
if is_span_suitable_for_use_injection(inject) {
|
||||
self.first_legal_span = Some(inject);
|
||||
|
|
|
@ -252,7 +252,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for EffectiveVisibilitiesVisitor<'a, 'ra, 'tcx>
|
|||
self.current_private_vis = prev_private_vis;
|
||||
}
|
||||
|
||||
ast::ItemKind::Enum(EnumDef { ref variants }, _) => {
|
||||
ast::ItemKind::Enum(_, EnumDef { ref variants }, _) => {
|
||||
self.set_bindings_effective_visibilities(def_id);
|
||||
for variant in variants {
|
||||
let variant_def_id = self.r.local_def_id(variant.id);
|
||||
|
@ -262,7 +262,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for EffectiveVisibilitiesVisitor<'a, 'ra, 'tcx>
|
|||
}
|
||||
}
|
||||
|
||||
ast::ItemKind::Struct(ref def, _) | ast::ItemKind::Union(ref def, _) => {
|
||||
ast::ItemKind::Struct(_, ref def, _) | ast::ItemKind::Union(_, ref def, _) => {
|
||||
for field in def.fields() {
|
||||
self.update_field(self.r.local_def_id(field.id), def_id);
|
||||
}
|
||||
|
|
|
@ -1025,9 +1025,10 @@ impl<'ra: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'_, 'ast, 'r
|
|||
match fn_kind {
|
||||
// Bail if the function is foreign, and thus cannot validly have
|
||||
// a body, or if there's no body for some other reason.
|
||||
FnKind::Fn(FnCtxt::Foreign, _, _, Fn { sig, generics, .. })
|
||||
| FnKind::Fn(_, _, _, Fn { sig, generics, body: None, .. }) => {
|
||||
FnKind::Fn(FnCtxt::Foreign, _, Fn { sig, ident, generics, .. })
|
||||
| FnKind::Fn(_, _, Fn { sig, ident, generics, body: None, .. }) => {
|
||||
self.visit_fn_header(&sig.header);
|
||||
self.visit_ident(ident);
|
||||
self.visit_generics(generics);
|
||||
self.with_lifetime_rib(
|
||||
LifetimeRibKind::AnonymousCreateParameter {
|
||||
|
@ -1058,7 +1059,7 @@ impl<'ra: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'_, 'ast, 'r
|
|||
// Create a label rib for the function.
|
||||
this.with_label_rib(RibKind::FnOrCoroutine, |this| {
|
||||
match fn_kind {
|
||||
FnKind::Fn(_, _, _, Fn { sig, generics, contract, body, .. }) => {
|
||||
FnKind::Fn(_, _, Fn { sig, generics, contract, body, .. }) => {
|
||||
this.visit_generics(generics);
|
||||
|
||||
let declaration = &sig.decl;
|
||||
|
@ -2632,8 +2633,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
self.resolve_doc_links(&item.attrs, MaybeExported::Ok(item.id));
|
||||
}
|
||||
|
||||
let name = item.ident.name;
|
||||
debug!("(resolving item) resolving {} ({:?})", name, item.kind);
|
||||
debug!("(resolving item) resolving {:?} ({:?})", item.kind.ident(), item.kind);
|
||||
|
||||
let def_kind = self.r.local_def_kind(item.id);
|
||||
match item.kind {
|
||||
|
@ -2664,9 +2664,9 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
self.resolve_define_opaques(define_opaque);
|
||||
}
|
||||
|
||||
ItemKind::Enum(_, ref generics)
|
||||
| ItemKind::Struct(_, ref generics)
|
||||
| ItemKind::Union(_, ref generics) => {
|
||||
ItemKind::Enum(_, _, ref generics)
|
||||
| ItemKind::Struct(_, _, ref generics)
|
||||
| ItemKind::Union(_, _, ref generics) => {
|
||||
self.resolve_adt(item, generics);
|
||||
}
|
||||
|
||||
|
@ -2710,7 +2710,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
);
|
||||
}
|
||||
|
||||
ItemKind::TraitAlias(ref generics, ref bounds) => {
|
||||
ItemKind::TraitAlias(_, ref generics, ref bounds) => {
|
||||
// Create a new rib for the trait-wide type parameters.
|
||||
self.with_generic_param_rib(
|
||||
&generics.params,
|
||||
|
@ -2748,7 +2748,11 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
}
|
||||
|
||||
ItemKind::Static(box ast::StaticItem {
|
||||
ref ty, ref expr, ref define_opaque, ..
|
||||
ident,
|
||||
ref ty,
|
||||
ref expr,
|
||||
ref define_opaque,
|
||||
..
|
||||
}) => {
|
||||
self.with_static_rib(def_kind, |this| {
|
||||
this.with_lifetime_rib(
|
||||
|
@ -2762,13 +2766,14 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
if let Some(expr) = expr {
|
||||
// We already forbid generic params because of the above item rib,
|
||||
// so it doesn't matter whether this is a trivial constant.
|
||||
this.resolve_const_body(expr, Some((item.ident, ConstantItemKind::Static)));
|
||||
this.resolve_const_body(expr, Some((ident, ConstantItemKind::Static)));
|
||||
}
|
||||
});
|
||||
self.resolve_define_opaques(define_opaque);
|
||||
}
|
||||
|
||||
ItemKind::Const(box ast::ConstItem {
|
||||
ident,
|
||||
ref generics,
|
||||
ref ty,
|
||||
ref expr,
|
||||
|
@ -2801,10 +2806,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
);
|
||||
|
||||
if let Some(expr) = expr {
|
||||
this.resolve_const_body(
|
||||
expr,
|
||||
Some((item.ident, ConstantItemKind::Const)),
|
||||
);
|
||||
this.resolve_const_body(expr, Some((ident, ConstantItemKind::Const)));
|
||||
}
|
||||
},
|
||||
);
|
||||
|
@ -2821,7 +2823,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
self.future_proof_import(use_tree);
|
||||
}
|
||||
|
||||
ItemKind::MacroDef(ref macro_def) => {
|
||||
ItemKind::MacroDef(_, ref macro_def) => {
|
||||
// Maintain macro_rules scopes in the same way as during early resolution
|
||||
// for diagnostics and doc links.
|
||||
if macro_def.macro_rules {
|
||||
|
@ -3319,7 +3321,12 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
self.resolve_doc_links(&item.attrs, MaybeExported::ImplItem(trait_id.ok_or(&item.vis)));
|
||||
match &item.kind {
|
||||
AssocItemKind::Const(box ast::ConstItem {
|
||||
generics, ty, expr, define_opaque, ..
|
||||
ident,
|
||||
generics,
|
||||
ty,
|
||||
expr,
|
||||
define_opaque,
|
||||
..
|
||||
}) => {
|
||||
debug!("resolve_implementation AssocItemKind::Const");
|
||||
self.with_generic_param_rib(
|
||||
|
@ -3350,7 +3357,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
// exists in trait
|
||||
this.check_trait_item(
|
||||
item.id,
|
||||
item.ident,
|
||||
*ident,
|
||||
&item.kind,
|
||||
ValueNS,
|
||||
item.span,
|
||||
|
@ -3376,7 +3383,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
);
|
||||
self.resolve_define_opaques(define_opaque);
|
||||
}
|
||||
AssocItemKind::Fn(box Fn { generics, define_opaque, .. }) => {
|
||||
AssocItemKind::Fn(box Fn { ident, generics, define_opaque, .. }) => {
|
||||
debug!("resolve_implementation AssocItemKind::Fn");
|
||||
// We also need a new scope for the impl item type parameters.
|
||||
self.with_generic_param_rib(
|
||||
|
@ -3392,7 +3399,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
// exists in trait
|
||||
this.check_trait_item(
|
||||
item.id,
|
||||
item.ident,
|
||||
*ident,
|
||||
&item.kind,
|
||||
ValueNS,
|
||||
item.span,
|
||||
|
@ -3406,7 +3413,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
|
||||
self.resolve_define_opaques(define_opaque);
|
||||
}
|
||||
AssocItemKind::Type(box TyAlias { generics, .. }) => {
|
||||
AssocItemKind::Type(box TyAlias { ident, generics, .. }) => {
|
||||
self.diag_metadata.in_non_gat_assoc_type = Some(generics.params.is_empty());
|
||||
debug!("resolve_implementation AssocItemKind::Type");
|
||||
// We also need a new scope for the impl item type parameters.
|
||||
|
@ -3424,7 +3431,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
// exists in trait
|
||||
this.check_trait_item(
|
||||
item.id,
|
||||
item.ident,
|
||||
*ident,
|
||||
&item.kind,
|
||||
TypeNS,
|
||||
item.span,
|
||||
|
@ -3451,7 +3458,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
|this| {
|
||||
this.check_trait_item(
|
||||
item.id,
|
||||
item.ident,
|
||||
delegation.ident,
|
||||
&item.kind,
|
||||
ValueNS,
|
||||
item.span,
|
||||
|
@ -4337,7 +4344,13 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
|||
if let Some(items) = self.diag_metadata.current_trait_assoc_items
|
||||
&& let [Segment { ident, .. }] = path
|
||||
&& items.iter().any(|item| {
|
||||
item.ident == *ident && matches!(item.kind, AssocItemKind::Type(_))
|
||||
if let AssocItemKind::Type(alias) = &item.kind
|
||||
&& alias.ident == *ident
|
||||
{
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
})
|
||||
{
|
||||
let mut diag = self.r.tcx.dcx().struct_allow("");
|
||||
|
@ -5159,12 +5172,12 @@ impl<'ast> Visitor<'ast> for ItemInfoCollector<'_, '_, '_> {
|
|||
ItemKind::TyAlias(box TyAlias { generics, .. })
|
||||
| ItemKind::Const(box ConstItem { generics, .. })
|
||||
| ItemKind::Fn(box Fn { generics, .. })
|
||||
| ItemKind::Enum(_, generics)
|
||||
| ItemKind::Struct(_, generics)
|
||||
| ItemKind::Union(_, generics)
|
||||
| ItemKind::Enum(_, _, generics)
|
||||
| ItemKind::Struct(_, _, generics)
|
||||
| ItemKind::Union(_, _, generics)
|
||||
| ItemKind::Impl(box Impl { generics, .. })
|
||||
| ItemKind::Trait(box Trait { generics, .. })
|
||||
| ItemKind::TraitAlias(generics, _) => {
|
||||
| ItemKind::TraitAlias(_, generics, _) => {
|
||||
if let ItemKind::Fn(box Fn { sig, .. }) = &item.kind {
|
||||
self.collect_fn_info(sig.header, &sig.decl, item.id, &item.attrs);
|
||||
}
|
||||
|
|
|
@ -224,12 +224,13 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
let suggestion = if self.current_trait_ref.is_none()
|
||||
&& let Some((fn_kind, _)) = self.diag_metadata.current_function
|
||||
&& let Some(FnCtxt::Assoc(_)) = fn_kind.ctxt()
|
||||
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = fn_kind
|
||||
&& let FnKind::Fn(_, _, ast::Fn { sig, .. }) = fn_kind
|
||||
&& let Some(items) = self.diag_metadata.current_impl_items
|
||||
&& let Some(item) = items.iter().find(|i| {
|
||||
i.ident.name == item_str.name
|
||||
i.kind.ident().is_some_and(|ident| {
|
||||
// Don't suggest if the item is in Fn signature arguments (#112590).
|
||||
&& !sig.span.contains(item_span)
|
||||
ident.name == item_str.name && !sig.span.contains(item_span)
|
||||
})
|
||||
}) {
|
||||
let sp = item_span.shrink_to_lo();
|
||||
|
||||
|
@ -268,14 +269,14 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
// you can't call `fn foo(&self)` from `fn bar()` (#115992).
|
||||
// We also want to mention that the method exists.
|
||||
span_label = Some((
|
||||
item.ident.span,
|
||||
fn_.ident.span,
|
||||
"a method by that name is available on `Self` here",
|
||||
));
|
||||
None
|
||||
}
|
||||
AssocItemKind::Fn(fn_) if !fn_.sig.decl.has_self() && !is_call => {
|
||||
span_label = Some((
|
||||
item.ident.span,
|
||||
fn_.ident.span,
|
||||
"an associated function by that name is available on `Self` here",
|
||||
));
|
||||
None
|
||||
|
@ -604,7 +605,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
if !self.self_value_is_available(path[0].ident.span) {
|
||||
if let Some((FnKind::Fn(_, _, _, ast::Fn { sig, .. }), fn_span)) =
|
||||
if let Some((FnKind::Fn(_, _, ast::Fn { sig, .. }), fn_span)) =
|
||||
&self.diag_metadata.current_function
|
||||
{
|
||||
let (span, sugg) = if let Some(param) = sig.decl.inputs.get(0) {
|
||||
|
@ -1064,15 +1065,11 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
}
|
||||
err.code(E0411);
|
||||
err.span_label(span, "`Self` is only available in impls, traits, and type definitions");
|
||||
if let Some(item_kind) = self.diag_metadata.current_item {
|
||||
if !item_kind.ident.span.is_dummy() {
|
||||
if let Some(item) = self.diag_metadata.current_item {
|
||||
if let Some(ident) = item.kind.ident() {
|
||||
err.span_label(
|
||||
item_kind.ident.span,
|
||||
format!(
|
||||
"`Self` not allowed in {} {}",
|
||||
item_kind.kind.article(),
|
||||
item_kind.kind.descr()
|
||||
),
|
||||
ident.span,
|
||||
format!("`Self` not allowed in {} {}", item.kind.article(), item.kind.descr()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1150,17 +1147,14 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
);
|
||||
}
|
||||
}
|
||||
} else if let Some(item_kind) = self.diag_metadata.current_item {
|
||||
if matches!(item_kind.kind, ItemKind::Delegation(..)) {
|
||||
err.span_label(item_kind.span, format!("delegation supports {self_from_macro}"));
|
||||
} else if let Some(item) = self.diag_metadata.current_item {
|
||||
if matches!(item.kind, ItemKind::Delegation(..)) {
|
||||
err.span_label(item.span, format!("delegation supports {self_from_macro}"));
|
||||
} else {
|
||||
let span = if let Some(ident) = item.kind.ident() { ident.span } else { item.span };
|
||||
err.span_label(
|
||||
item_kind.ident.span,
|
||||
format!(
|
||||
"`self` not allowed in {} {}",
|
||||
item_kind.kind.article(),
|
||||
item_kind.kind.descr()
|
||||
),
|
||||
span,
|
||||
format!("`self` not allowed in {} {}", item.kind.article(), item.kind.descr()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -2196,7 +2190,9 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
|
||||
if let Some(items) = self.diag_metadata.current_trait_assoc_items {
|
||||
for assoc_item in items {
|
||||
if assoc_item.ident == ident {
|
||||
if let Some(assoc_ident) = assoc_item.kind.ident()
|
||||
&& assoc_ident == ident
|
||||
{
|
||||
return Some(match &assoc_item.kind {
|
||||
ast::AssocItemKind::Const(..) => AssocSuggestion::AssocConst,
|
||||
ast::AssocItemKind::Fn(box ast::Fn { sig, .. }) if sig.decl.has_self() => {
|
||||
|
@ -2735,7 +2731,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
return None;
|
||||
}
|
||||
match (self.diag_metadata.current_item, single_uppercase_char, self.diag_metadata.currently_processing_generic_args) {
|
||||
(Some(Item { kind: ItemKind::Fn(..), ident, .. }), _, _) if ident.name == sym::main => {
|
||||
(Some(Item { kind: ItemKind::Fn(fn_), .. }), _, _) if fn_.ident.name == sym::main => {
|
||||
// Ignore `fn main()` as we don't want to suggest `fn main<T>()`
|
||||
}
|
||||
(
|
||||
|
@ -3400,7 +3396,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
{
|
||||
let pre = if lt.kind == MissingLifetimeKind::Ampersand
|
||||
&& let Some((kind, _span)) = self.diag_metadata.current_function
|
||||
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = kind
|
||||
&& let FnKind::Fn(_, _, ast::Fn { sig, .. }) = kind
|
||||
&& !sig.decl.inputs.is_empty()
|
||||
&& let sugg = sig
|
||||
.decl
|
||||
|
@ -3441,7 +3437,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
} else if (lt.kind == MissingLifetimeKind::Ampersand
|
||||
|| lt.kind == MissingLifetimeKind::Underscore)
|
||||
&& let Some((kind, _span)) = self.diag_metadata.current_function
|
||||
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = kind
|
||||
&& let FnKind::Fn(_, _, ast::Fn { sig, .. }) = kind
|
||||
&& let ast::FnRetTy::Ty(ret_ty) = &sig.decl.output
|
||||
&& !sig.decl.inputs.is_empty()
|
||||
&& let arg_refs = sig
|
||||
|
@ -3501,7 +3497,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||
let mut owned_sugg = lt.kind == MissingLifetimeKind::Ampersand;
|
||||
let mut sugg = vec![(lt.span, String::new())];
|
||||
if let Some((kind, _span)) = self.diag_metadata.current_function
|
||||
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = kind
|
||||
&& let FnKind::Fn(_, _, ast::Fn { sig, .. }) = kind
|
||||
&& let ast::FnRetTy::Ty(ty) = &sig.decl.output
|
||||
{
|
||||
let mut lt_finder =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue