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 8 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
100 changes: 75 additions & 25 deletions compiler/rustc_resolve/src/build_reduced_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,30 +42,80 @@ 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>,
) {
if let Err(old_binding) = self.try_define(parent, ident, ns, binding, false) {
assert!(parent.is_local());
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, // Implicitly local
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);
}

/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
/// otherwise, panic.
pub(crate) fn define_binding_extern(
&self,
parent: Module<'ra>,
ident: Ident,
ns: Namespace,
binding: NameBinding<'ra>,
) {
assert!(!parent.is_local());
// 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();
let resolution_binding = if binding.is_glob_import() {
&mut resolution.glob_binding
} else {
&mut resolution.non_glob_binding
};
if resolution_binding.replace(binding).is_some() {
panic!("An external binding was already defined");
}
}

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);
self.define_binding_extern(parent, ident, ns, binding);
}

/// Walks up the tree of definitions starting at `def_id`,
Expand Down Expand Up @@ -188,7 +238,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 @@ -197,7 +247,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 @@ -228,7 +278,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 @@ -237,9 +287,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 @@ -705,7 +755,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 @@ -757,7 +807,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 @@ -776,10 +826,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 @@ -788,11 +838,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 @@ -844,7 +894,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 @@ -965,7 +1015,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 @@ -982,7 +1032,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 @@ -1076,7 +1126,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 @@ -1241,7 +1291,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 @@ -1269,7 +1319,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 @@ -1405,7 +1455,7 @@ 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);
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
{
Expand Down Expand Up @@ -1493,7 +1543,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 @@ -1509,7 +1559,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
20 changes: 10 additions & 10 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -334,8 +334,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
}

/// Define the name or return the existing binding if there is a collision.
/// `update` indicates if the definition is a redefinition of an existing binding.
pub(crate) fn try_define(
pub(crate) fn try_define_local(
&mut self,
module: Module<'ra>,
ident: Ident,
Expand All @@ -352,7 +351,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
let key = BindingKey::new_disambiguated(ident, ns, || {
(module.0.0.lazy_resolutions.borrow().len() + 1).try_into().unwrap()
});
self.update_resolution(module, key, warn_ambiguity, |this, resolution| {
self.update_local_resolution(module, key, warn_ambiguity, |this, resolution| {
if let Some(old_binding) = resolution.best_binding() {
if res == Res::Err && old_binding.res() != Res::Err {
// Do not override real bindings with `Res::Err`s from error recovery.
Expand Down Expand Up @@ -455,7 +454,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {

// Use `f` to mutate the resolution of the name in the module.
// If the resolution becomes a success, define it in the module's glob importers.
fn update_resolution<T, F>(
fn update_local_resolution<T, F>(
&mut self,
module: Module<'ra>,
key: BindingKey,
Expand All @@ -465,6 +464,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
where
F: FnOnce(&Resolver<'ra, 'tcx>, &mut NameResolution<'ra>) -> T,
{
assert!(module.is_local());
// Ensure that `resolution` isn't borrowed when defining in the module's glob importers,
// during which the resolution might end up getting re-defined via a glob cycle.
let (binding, t, warn_ambiguity) = {
Expand Down Expand Up @@ -496,7 +496,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
};
if self.is_accessible_from(binding.vis, scope) {
let imported_binding = self.import(binding, *import);
let _ = self.try_define(
let _ = self.try_define_local(
import.parent_scope.module,
ident,
key.ns,
Expand All @@ -522,11 +522,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
let dummy_binding = self.import(dummy_binding, import);
self.per_ns(|this, ns| {
let module = import.parent_scope.module;
let _ = this.try_define(module, target, ns, dummy_binding, false);
let _ = this.try_define_local(module, target, ns, dummy_binding, false);
// Don't remove underscores from `single_imports`, they were never added.
if target.name != kw::Underscore {
let key = BindingKey::new(target, ns);
this.update_resolution(module, key, false, |_, resolution| {
this.update_local_resolution(module, key, false, |_, resolution| {
resolution.single_imports.swap_remove(&import);
})
}
Expand Down Expand Up @@ -902,14 +902,14 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
}
// We need the `target`, `source` can be extracted.
let imported_binding = this.import(binding, import);
this.define_binding(parent, target, ns, imported_binding);
this.define_binding_local(parent, target, ns, imported_binding);
PendingBinding::Ready(Some(imported_binding))
}
Err(Determinacy::Determined) => {
// Don't remove underscores from `single_imports`, they were never added.
if target.name != kw::Underscore {
let key = BindingKey::new(target, ns);
this.update_resolution(parent, key, false, |_, resolution| {
this.update_local_resolution(parent, key, false, |_, resolution| {
resolution.single_imports.swap_remove(&import);
});
}
Expand Down Expand Up @@ -1519,7 +1519,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
.borrow()
.binding()
.is_some_and(|binding| binding.warn_ambiguity_recursive());
let _ = self.try_define(
let _ = self.try_define_local(
import.parent_scope.module,
key.ident,
key.ns,
Expand Down
6 changes: 3 additions & 3 deletions compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2629,7 +2629,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
false
}

fn find_module(&mut self, def_id: DefId) -> Option<(Module<'ra>, ImportSuggestion)> {
fn find_module(&self, def_id: DefId) -> Option<(Module<'ra>, ImportSuggestion)> {
let mut result = None;
let mut seen_modules = FxHashSet::default();
let root_did = self.r.graph_root.def_id();
Expand Down Expand Up @@ -2686,7 +2686,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
result
}

fn collect_enum_ctors(&mut self, def_id: DefId) -> Option<Vec<(Path, DefId, CtorKind)>> {
fn collect_enum_ctors(&self, def_id: DefId) -> Option<Vec<(Path, DefId, CtorKind)>> {
self.find_module(def_id).map(|(enum_module, enum_import_suggestion)| {
let mut variants = Vec::new();
enum_module.for_each_child(self.r, |_, ident, _, name_binding| {
Expand All @@ -2703,7 +2703,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {

/// Adds a suggestion for using an enum's variant when an enum is used instead.
fn suggest_using_enum_variant(
&mut self,
&self,
err: &mut Diag<'_>,
source: PathSource<'_, '_, '_>,
def_id: DefId,
Expand Down
Loading
Loading