Skip to content

Resolve: refactor define into define_local and define_extern #143884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/rustc_expand/src/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1144,7 +1144,7 @@ pub trait ResolverExpand {

/// Names of specific methods to which glob delegation expands.
fn glob_delegation_suffixes(
&mut self,
&self,
trait_def_id: DefId,
impl_def_id: LocalDefId,
) -> Result<Vec<(Ident, Option<Ident>)>, Indeterminate>;
Expand Down
118 changes: 81 additions & 37 deletions compiler/rustc_resolve/src/build_reduced_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,31 +42,70 @@ type Res = def::Res<NodeId>;
impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
/// otherwise, reports an error.
pub(crate) fn define_binding(
pub(crate) fn define_binding_local(
&mut self,
parent: Module<'ra>,
ident: Ident,
ns: Namespace,
binding: NameBinding<'ra>,
) {
let key = self.new_disambiguated_key(ident, ns);
if let Err(old_binding) = self.try_define(parent, key, binding, false) {
if let Err(old_binding) = self.try_define_local(parent, ident, ns, binding, false) {
self.report_conflict(parent, ident, ns, old_binding, binding);
}
}

fn define(
fn define_local(
&mut self,
parent: Module<'ra>,
ident: Ident,
ns: Namespace,
res: Res,
vis: Visibility<impl Into<DefId>>,
vis: Visibility,
span: Span,
expn_id: LocalExpnId,
) {
assert!(parent.is_local());
assert!(res.opt_def_id().is_none_or(|def_id| def_id.is_local()));
let binding = self.arenas.new_res_binding(res, vis.to_def_id(), span, expn_id);
self.define_binding(parent, ident, ns, binding)
self.define_binding_local(parent, ident, ns, binding)
}

// Panics when a binding already exists.
fn define_extern(
&self,
parent: Module<'ra>,
ident: Ident,
ns: Namespace,
res: Res,
vis: Visibility<DefId>,
span: Span,
expn_id: LocalExpnId,
) {
assert!(!parent.is_local());
assert!(!res.opt_def_id().is_some_and(|def_id| def_id.is_local()));
let vis = vis.map_id(|def_id| {
assert!(!def_id.is_local());
def_id
});
let binding = self.arenas.new_res_binding(res, vis, span, expn_id);
// Even if underscore names cannot be looked up, we still need to add them to modules,
// because they can be fetched by glob imports from those modules, and bring traits
// into scope both directly and through glob imports.
let key = BindingKey::new_disambiguated(ident, ns, || {
(parent.0.0.lazy_resolutions.borrow().len() + 1).try_into().unwrap()
});
let resolution = &mut *self.resolution(parent, key).borrow_mut();
if binding.is_glob_import() {
if resolution.glob_binding.is_some() {
panic!("An external glob-binding was already defined");
}
resolution.glob_binding = Some(binding);
} else {
if resolution.non_glob_binding.is_some() {
panic!("An external non-glob-binding was already defined");
}
resolution.non_glob_binding = Some(binding);
}
}

/// Walks up the tree of definitions starting at `def_id`,
Expand Down Expand Up @@ -189,7 +228,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
visitor.parent_scope.macro_rules
}

pub(crate) fn build_reduced_graph_external(&mut self, module: Module<'ra>) {
pub(crate) fn build_reduced_graph_external(&self, module: Module<'ra>) {
for child in self.tcx.module_children(module.def_id()) {
let parent_scope = ParentScope::module(module, self);
self.build_reduced_graph_for_external_crate_res(child, parent_scope)
Expand All @@ -198,7 +237,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {

/// Builds the reduced graph for a single item in an external crate.
fn build_reduced_graph_for_external_crate_res(
&mut self,
&self,
child: &ModChild,
parent_scope: ParentScope<'ra>,
) {
Expand Down Expand Up @@ -229,7 +268,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
_,
)
| Res::PrimTy(..)
| Res::ToolMod => self.define(parent, ident, TypeNS, res, vis, span, expansion),
| Res::ToolMod => self.define_extern(parent, ident, TypeNS, res, vis, span, expansion),
Res::Def(
DefKind::Fn
| DefKind::AssocFn
Expand All @@ -238,9 +277,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
| DefKind::AssocConst
| DefKind::Ctor(..),
_,
) => self.define(parent, ident, ValueNS, res, vis, span, expansion),
) => self.define_extern(parent, ident, ValueNS, res, vis, span, expansion),
Res::Def(DefKind::Macro(..), _) | Res::NonMacroAttr(..) => {
self.define(parent, ident, MacroNS, res, vis, span, expansion)
self.define_extern(parent, ident, MacroNS, res, vis, span, expansion)
}
Res::Def(
DefKind::TyParam
Expand Down Expand Up @@ -442,16 +481,18 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {

self.r.indeterminate_imports.push(import);
match import.kind {
// Don't add unresolved underscore imports to modules
ImportKind::Single { target: Ident { name: kw::Underscore, .. }, .. } => {}
ImportKind::Single { target, type_ns_only, .. } => {
self.r.per_ns(|this, ns| {
if !type_ns_only || ns == TypeNS {
let key = BindingKey::new(target, ns);
let mut resolution = this.resolution(current_module, key).borrow_mut();
resolution.single_imports.insert(import);
}
});
// Don't add underscore imports to `single_imports`
// because they cannot define any usable names.
if target.name != kw::Underscore {
self.r.per_ns(|this, ns| {
if !type_ns_only || ns == TypeNS {
let key = BindingKey::new(target, ns);
let mut resolution = this.resolution(current_module, key).borrow_mut();
resolution.single_imports.insert(import);
}
});
}
}
// We don't add prelude imports to the globs since they only affect lexical scopes,
// which are not relevant to import resolution.
Expand Down Expand Up @@ -704,7 +745,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
let expansion = parent_scope.expansion;

// Define a name in the type namespace if it is not anonymous.
self.r.define(parent, ident, TypeNS, adt_res, adt_vis, adt_span, expansion);
self.r.define_local(parent, ident, TypeNS, adt_res, adt_vis, adt_span, expansion);
self.r.feed_visibility(feed, adt_vis);
let def_id = feed.key();

Expand Down Expand Up @@ -756,7 +797,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
}

ItemKind::Mod(_, ident, ref mod_kind) => {
self.r.define(parent, ident, TypeNS, res, vis, sp, expansion);
self.r.define_local(parent, ident, TypeNS, res, vis, sp, expansion);

if let ast::ModKind::Loaded(_, _, _, Err(_)) = mod_kind {
self.r.mods_with_parse_errors.insert(def_id);
Expand All @@ -775,10 +816,10 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
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);
self.r.define_local(parent, ident, ValueNS, res, vis, sp, expansion);
}
ItemKind::Fn(box Fn { ident, .. }) => {
self.r.define(parent, ident, ValueNS, res, vis, sp, expansion);
self.r.define_local(parent, ident, ValueNS, res, vis, sp, expansion);

// Functions introducing procedural macros reserve a slot
// in the macro namespace as well (see #52225).
Expand All @@ -787,11 +828,11 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {

// These items live in the type namespace.
ItemKind::TyAlias(box TyAlias { ident, .. }) | ItemKind::TraitAlias(ident, ..) => {
self.r.define(parent, ident, TypeNS, res, vis, sp, expansion);
self.r.define_local(parent, ident, TypeNS, res, vis, sp, expansion);
}

ItemKind::Enum(ident, _, _) | ItemKind::Trait(box ast::Trait { ident, .. }) => {
self.r.define(parent, ident, TypeNS, res, vis, sp, expansion);
self.r.define_local(parent, ident, TypeNS, res, vis, sp, expansion);

self.parent_scope.module = self.r.new_local_module(
Some(parent),
Expand Down Expand Up @@ -843,7 +884,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
let feed = self.r.feed(ctor_node_id);
let ctor_def_id = feed.key();
let ctor_res = self.res(ctor_def_id);
self.r.define(parent, ident, ValueNS, ctor_res, ctor_vis, sp, expansion);
self.r.define_local(parent, ident, ValueNS, ctor_res, ctor_vis, sp, expansion);
self.r.feed_visibility(feed, ctor_vis);
// We need the field visibility spans also for the constructor for E0603.
self.insert_field_visibilities_local(ctor_def_id.to_def_id(), vdata.fields());
Expand Down Expand Up @@ -964,7 +1005,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
);
}
}
self.r.define_binding(parent, ident, TypeNS, imported_binding);
self.r.define_binding_local(parent, ident, TypeNS, imported_binding);
}

/// Constructs the reduced graph for one foreign item.
Expand All @@ -981,7 +1022,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, ident, ns, self.res(def_id), vis, item.span, expansion);
self.r.define_local(parent, ident, ns, self.res(def_id), vis, item.span, expansion);
self.r.feed_visibility(feed, vis);
}

Expand Down Expand Up @@ -1075,7 +1116,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
if let Some(span) = import_all {
let import = macro_use_import(self, span, false);
self.r.potentially_unused_imports.push(import);
module.for_each_child(self, |this, ident, ns, binding| {
module.for_each_child_mut(self, |this, ident, ns, binding| {
if ns == MacroNS {
let import = if this.r.is_accessible_from(binding.vis, this.parent_scope.module)
{
Expand Down Expand Up @@ -1240,7 +1281,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
});
self.r.import_use_map.insert(import, Used::Other);
let import_binding = self.r.import(binding, import);
self.r.define_binding(self.r.graph_root, ident, MacroNS, import_binding);
self.r.define_binding_local(self.r.graph_root, ident, MacroNS, import_binding);
} else {
self.r.check_reserved_macro_name(ident, res);
self.insert_unused_macro(ident, def_id, item.id);
Expand Down Expand Up @@ -1268,7 +1309,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
if !vis.is_public() {
self.insert_unused_macro(ident, def_id, item.id);
}
self.r.define(module, ident, MacroNS, res, vis, span, expansion);
self.r.define_local(module, ident, MacroNS, res, vis, span, expansion);
self.r.feed_visibility(feed, vis);
self.parent_scope.macro_rules
}
Expand Down Expand Up @@ -1404,10 +1445,13 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
if ctxt == AssocCtxt::Trait {
let parent = self.parent_scope.module;
let expansion = self.parent_scope.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) {
self.r.define_local(parent, ident, ns, self.res(def_id), vis, item.span, expansion);
} else if !matches!(&item.kind, AssocItemKind::Delegation(deleg) if deleg.from_glob)
&& ident.name != kw::Underscore
{
// Don't add underscore names, they cannot be looked up anyway.
let impl_def_id = self.r.tcx.local_parent(local_def_id);
let key = BindingKey::new(ident.normalize_to_macros_2_0(), ns);
let key = BindingKey::new(ident, ns);
self.r.impl_binding_keys.entry(impl_def_id).or_default().insert(key);
}

Expand Down Expand Up @@ -1489,7 +1533,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
let feed = self.r.feed(variant.id);
let def_id = feed.key();
let vis = self.resolve_visibility(&variant.vis);
self.r.define(parent, ident, TypeNS, self.res(def_id), vis, variant.span, expn_id);
self.r.define_local(parent, ident, TypeNS, self.res(def_id), vis, variant.span, expn_id);
self.r.feed_visibility(feed, vis);

// If the variant is marked as non_exhaustive then lower the visibility to within the crate.
Expand All @@ -1505,7 +1549,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
let feed = self.r.feed(ctor_node_id);
let ctor_def_id = feed.key();
let ctor_res = self.res(ctor_def_id);
self.r.define(parent, ident, ValueNS, ctor_res, ctor_vis, variant.span, expn_id);
self.r.define_local(parent, ident, ValueNS, ctor_res, ctor_vis, variant.span, expn_id);
self.r.feed_visibility(feed, ctor_vis);
}

Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_resolve/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
}

pub(crate) fn add_module_candidates(
&mut self,
&self,
module: Module<'ra>,
names: &mut Vec<TypoSuggestion>,
filter_fn: &impl Fn(Res) -> bool,
Expand Down Expand Up @@ -1155,7 +1155,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
}

fn lookup_import_candidates_from_module<FilterFn>(
&mut self,
&self,
lookup_ident: Ident,
namespace: Namespace,
parent_scope: &ParentScope<'ra>,
Expand Down
Loading
Loading