split up define into define_extern and define_local
This commit is contained in:
@@ -1141,7 +1141,7 @@ pub trait ResolverExpand {
|
|||||||
|
|
||||||
/// Names of specific methods to which glob delegation expands.
|
/// Names of specific methods to which glob delegation expands.
|
||||||
fn glob_delegation_suffixes(
|
fn glob_delegation_suffixes(
|
||||||
&mut self,
|
&self,
|
||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
impl_def_id: LocalDefId,
|
impl_def_id: LocalDefId,
|
||||||
) -> Result<Vec<(Ident, Option<Ident>)>, Indeterminate>;
|
) -> Result<Vec<(Ident, Option<Ident>)>, Indeterminate>;
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ use rustc_hir::def::{self, *};
|
|||||||
use rustc_hir::def_id::{CRATE_DEF_ID, DefId, LocalDefId};
|
use rustc_hir::def_id::{CRATE_DEF_ID, DefId, LocalDefId};
|
||||||
use rustc_index::bit_set::DenseBitSet;
|
use rustc_index::bit_set::DenseBitSet;
|
||||||
use rustc_metadata::creader::LoadedMacro;
|
use rustc_metadata::creader::LoadedMacro;
|
||||||
use rustc_middle::bug;
|
|
||||||
use rustc_middle::metadata::ModChild;
|
use rustc_middle::metadata::ModChild;
|
||||||
use rustc_middle::ty::{Feed, Visibility};
|
use rustc_middle::ty::{Feed, Visibility};
|
||||||
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind};
|
use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind};
|
||||||
use rustc_span::{Ident, Span, Symbol, kw, sym};
|
use rustc_span::{Ident, Span, Symbol, kw, sym};
|
||||||
use thin_vec::ThinVec;
|
use thin_vec::ThinVec;
|
||||||
@@ -46,30 +46,59 @@ type Res = def::Res<NodeId>;
|
|||||||
impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||||
/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
|
/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
|
||||||
/// otherwise, reports an error.
|
/// otherwise, reports an error.
|
||||||
pub(crate) fn define_binding(
|
pub(crate) fn define_binding_local(
|
||||||
&mut self,
|
&mut self,
|
||||||
parent: Module<'ra>,
|
parent: Module<'ra>,
|
||||||
ident: Ident,
|
ident: Ident,
|
||||||
ns: Namespace,
|
ns: Namespace,
|
||||||
binding: NameBinding<'ra>,
|
binding: NameBinding<'ra>,
|
||||||
) {
|
) {
|
||||||
if let Err(old_binding) = self.try_define(parent, ident, ns, 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);
|
self.report_conflict(parent, ident, ns, old_binding, binding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn define(
|
fn define_local(
|
||||||
&mut self,
|
&mut self,
|
||||||
parent: Module<'ra>,
|
parent: Module<'ra>,
|
||||||
ident: Ident,
|
ident: Ident,
|
||||||
ns: Namespace,
|
ns: Namespace,
|
||||||
res: Res,
|
res: Res,
|
||||||
vis: Visibility<impl Into<DefId>>,
|
vis: Visibility,
|
||||||
span: Span,
|
span: Span,
|
||||||
expn_id: LocalExpnId,
|
expn_id: LocalExpnId,
|
||||||
) {
|
) {
|
||||||
let binding = self.arenas.new_res_binding(res, vis.to_def_id(), span, expn_id);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn define_extern(
|
||||||
|
&self,
|
||||||
|
parent: Module<'ra>,
|
||||||
|
ident: Ident,
|
||||||
|
ns: Namespace,
|
||||||
|
res: Res,
|
||||||
|
vis: Visibility<DefId>,
|
||||||
|
span: Span,
|
||||||
|
expn_id: LocalExpnId,
|
||||||
|
) {
|
||||||
|
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.underscore_disambiguator.update(|d| d + 1);
|
||||||
|
parent.underscore_disambiguator.get()
|
||||||
|
});
|
||||||
|
if self
|
||||||
|
.resolution_or_default(parent, key)
|
||||||
|
.borrow_mut()
|
||||||
|
.non_glob_binding
|
||||||
|
.replace(binding)
|
||||||
|
.is_some()
|
||||||
|
{
|
||||||
|
span_bug!(span, "an external binding was already defined");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Walks up the tree of definitions starting at `def_id`,
|
/// Walks up the tree of definitions starting at `def_id`,
|
||||||
@@ -192,7 +221,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
visitor.parent_scope.macro_rules
|
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()) {
|
for child in self.tcx.module_children(module.def_id()) {
|
||||||
let parent_scope = ParentScope::module(module, self);
|
let parent_scope = ParentScope::module(module, self);
|
||||||
self.build_reduced_graph_for_external_crate_res(child, parent_scope)
|
self.build_reduced_graph_for_external_crate_res(child, parent_scope)
|
||||||
@@ -201,7 +230,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
|
|
||||||
/// Builds the reduced graph for a single item in an external crate.
|
/// Builds the reduced graph for a single item in an external crate.
|
||||||
fn build_reduced_graph_for_external_crate_res(
|
fn build_reduced_graph_for_external_crate_res(
|
||||||
&mut self,
|
&self,
|
||||||
child: &ModChild,
|
child: &ModChild,
|
||||||
parent_scope: ParentScope<'ra>,
|
parent_scope: ParentScope<'ra>,
|
||||||
) {
|
) {
|
||||||
@@ -232,7 +261,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
_,
|
_,
|
||||||
)
|
)
|
||||||
| Res::PrimTy(..)
|
| 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(
|
Res::Def(
|
||||||
DefKind::Fn
|
DefKind::Fn
|
||||||
| DefKind::AssocFn
|
| DefKind::AssocFn
|
||||||
@@ -241,9 +270,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
| DefKind::AssocConst
|
| DefKind::AssocConst
|
||||||
| DefKind::Ctor(..),
|
| 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(..) => {
|
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(
|
Res::Def(
|
||||||
DefKind::TyParam
|
DefKind::TyParam
|
||||||
@@ -711,7 +740,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
let expansion = parent_scope.expansion;
|
let expansion = parent_scope.expansion;
|
||||||
|
|
||||||
// Define a name in the type namespace if it is not anonymous.
|
// 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);
|
self.r.feed_visibility(feed, adt_vis);
|
||||||
let def_id = feed.key();
|
let def_id = feed.key();
|
||||||
|
|
||||||
@@ -763,7 +792,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ItemKind::Mod(_, ident, ref mod_kind) => {
|
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 {
|
if let ast::ModKind::Loaded(_, _, _, Err(_)) = mod_kind {
|
||||||
self.r.mods_with_parse_errors.insert(def_id);
|
self.r.mods_with_parse_errors.insert(def_id);
|
||||||
@@ -782,10 +811,10 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
ItemKind::Const(box ConstItem { ident, .. })
|
ItemKind::Const(box ConstItem { ident, .. })
|
||||||
| ItemKind::Delegation(box Delegation { ident, .. })
|
| ItemKind::Delegation(box Delegation { ident, .. })
|
||||||
| ItemKind::Static(box StaticItem { 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, .. }) => {
|
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
|
// Functions introducing procedural macros reserve a slot
|
||||||
// in the macro namespace as well (see #52225).
|
// in the macro namespace as well (see #52225).
|
||||||
@@ -794,11 +823,11 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
|
|
||||||
// These items live in the type namespace.
|
// These items live in the type namespace.
|
||||||
ItemKind::TyAlias(box TyAlias { ident, .. }) | ItemKind::TraitAlias(ident, ..) => {
|
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, .. }) => {
|
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(
|
self.parent_scope.module = self.r.new_local_module(
|
||||||
Some(parent),
|
Some(parent),
|
||||||
@@ -850,7 +879,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
let feed = self.r.feed(ctor_node_id);
|
let feed = self.r.feed(ctor_node_id);
|
||||||
let ctor_def_id = feed.key();
|
let ctor_def_id = feed.key();
|
||||||
let ctor_res = self.res(ctor_def_id);
|
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);
|
self.r.feed_visibility(feed, ctor_vis);
|
||||||
// We need the field visibility spans also for the constructor for E0603.
|
// 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());
|
self.insert_field_visibilities_local(ctor_def_id.to_def_id(), vdata.fields());
|
||||||
@@ -974,7 +1003,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.
|
/// Constructs the reduced graph for one foreign item.
|
||||||
@@ -991,7 +1020,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
let parent = self.parent_scope.module;
|
let parent = self.parent_scope.module;
|
||||||
let expansion = self.parent_scope.expansion;
|
let expansion = self.parent_scope.expansion;
|
||||||
let vis = self.resolve_visibility(&item.vis);
|
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);
|
self.r.feed_visibility(feed, vis);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1074,7 +1103,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
if let Some(span) = import_all {
|
if let Some(span) = import_all {
|
||||||
let import = macro_use_import(self, span, false);
|
let import = macro_use_import(self, span, false);
|
||||||
self.r.potentially_unused_imports.push(import);
|
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 {
|
if ns == MacroNS {
|
||||||
let import = if this.r.is_accessible_from(binding.vis, this.parent_scope.module)
|
let import = if this.r.is_accessible_from(binding.vis, this.parent_scope.module)
|
||||||
{
|
{
|
||||||
@@ -1239,7 +1268,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
});
|
});
|
||||||
self.r.import_use_map.insert(import, Used::Other);
|
self.r.import_use_map.insert(import, Used::Other);
|
||||||
let import_binding = self.r.import(binding, import);
|
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 {
|
} else {
|
||||||
self.r.check_reserved_macro_name(ident, res);
|
self.r.check_reserved_macro_name(ident, res);
|
||||||
self.insert_unused_macro(ident, def_id, item.id);
|
self.insert_unused_macro(ident, def_id, item.id);
|
||||||
@@ -1267,7 +1296,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
if !vis.is_public() {
|
if !vis.is_public() {
|
||||||
self.insert_unused_macro(ident, def_id, item.id);
|
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.r.feed_visibility(feed, vis);
|
||||||
self.parent_scope.macro_rules
|
self.parent_scope.macro_rules
|
||||||
}
|
}
|
||||||
@@ -1403,7 +1432,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
if ctxt == AssocCtxt::Trait {
|
if ctxt == AssocCtxt::Trait {
|
||||||
let parent = self.parent_scope.module;
|
let parent = self.parent_scope.module;
|
||||||
let expansion = self.parent_scope.expansion;
|
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)
|
} else if !matches!(&item.kind, AssocItemKind::Delegation(deleg) if deleg.from_glob)
|
||||||
&& ident.name != kw::Underscore
|
&& ident.name != kw::Underscore
|
||||||
{
|
{
|
||||||
@@ -1491,7 +1520,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
let feed = self.r.feed(variant.id);
|
let feed = self.r.feed(variant.id);
|
||||||
let def_id = feed.key();
|
let def_id = feed.key();
|
||||||
let vis = self.resolve_visibility(&variant.vis);
|
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);
|
self.r.feed_visibility(feed, vis);
|
||||||
|
|
||||||
// If the variant is marked as non_exhaustive then lower the visibility to within the crate.
|
// If the variant is marked as non_exhaustive then lower the visibility to within the crate.
|
||||||
@@ -1507,7 +1536,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
let feed = self.r.feed(ctor_node_id);
|
let feed = self.r.feed(ctor_node_id);
|
||||||
let ctor_def_id = feed.key();
|
let ctor_def_id = feed.key();
|
||||||
let ctor_res = self.res(ctor_def_id);
|
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);
|
self.r.feed_visibility(feed, ctor_vis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -523,7 +523,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn add_module_candidates(
|
pub(crate) fn add_module_candidates(
|
||||||
&mut self,
|
&self,
|
||||||
module: Module<'ra>,
|
module: Module<'ra>,
|
||||||
names: &mut Vec<TypoSuggestion>,
|
names: &mut Vec<TypoSuggestion>,
|
||||||
filter_fn: &impl Fn(Res) -> bool,
|
filter_fn: &impl Fn(Res) -> bool,
|
||||||
@@ -1150,7 +1150,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn lookup_import_candidates_from_module<FilterFn>(
|
fn lookup_import_candidates_from_module<FilterFn>(
|
||||||
&mut self,
|
&self,
|
||||||
lookup_ident: Ident,
|
lookup_ident: Ident,
|
||||||
namespace: Namespace,
|
namespace: Namespace,
|
||||||
parent_scope: &ParentScope<'ra>,
|
parent_scope: &ParentScope<'ra>,
|
||||||
|
|||||||
@@ -334,8 +334,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Define the name or return the existing binding if there is a collision.
|
/// 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_local(
|
||||||
pub(crate) fn try_define(
|
|
||||||
&mut self,
|
&mut self,
|
||||||
module: Module<'ra>,
|
module: Module<'ra>,
|
||||||
ident: Ident,
|
ident: Ident,
|
||||||
@@ -353,7 +352,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
module.underscore_disambiguator.update(|d| d + 1);
|
module.underscore_disambiguator.update(|d| d + 1);
|
||||||
module.underscore_disambiguator.get()
|
module.underscore_disambiguator.get()
|
||||||
});
|
});
|
||||||
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 let Some(old_binding) = resolution.best_binding() {
|
||||||
if res == Res::Err && old_binding.res() != Res::Err {
|
if res == Res::Err && old_binding.res() != Res::Err {
|
||||||
// Do not override real bindings with `Res::Err`s from error recovery.
|
// Do not override real bindings with `Res::Err`s from error recovery.
|
||||||
@@ -456,7 +455,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
|
|
||||||
// Use `f` to mutate the resolution of the name in the module.
|
// 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.
|
// 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,
|
&mut self,
|
||||||
module: Module<'ra>,
|
module: Module<'ra>,
|
||||||
key: BindingKey,
|
key: BindingKey,
|
||||||
@@ -497,7 +496,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
};
|
};
|
||||||
if self.is_accessible_from(binding.vis, scope) {
|
if self.is_accessible_from(binding.vis, scope) {
|
||||||
let imported_binding = self.import(binding, *import);
|
let imported_binding = self.import(binding, *import);
|
||||||
let _ = self.try_define(
|
let _ = self.try_define_local(
|
||||||
import.parent_scope.module,
|
import.parent_scope.module,
|
||||||
ident,
|
ident,
|
||||||
key.ns,
|
key.ns,
|
||||||
@@ -523,11 +522,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
let dummy_binding = self.import(dummy_binding, import);
|
let dummy_binding = self.import(dummy_binding, import);
|
||||||
self.per_ns(|this, ns| {
|
self.per_ns(|this, ns| {
|
||||||
let module = import.parent_scope.module;
|
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.
|
// Don't remove underscores from `single_imports`, they were never added.
|
||||||
if target.name != kw::Underscore {
|
if target.name != kw::Underscore {
|
||||||
let key = BindingKey::new(target, ns);
|
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);
|
resolution.single_imports.swap_remove(&import);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -902,14 +901,14 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
// We need the `target`, `source` can be extracted.
|
// We need the `target`, `source` can be extracted.
|
||||||
let imported_binding = this.import(binding, import);
|
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))
|
PendingBinding::Ready(Some(imported_binding))
|
||||||
}
|
}
|
||||||
Err(Determinacy::Determined) => {
|
Err(Determinacy::Determined) => {
|
||||||
// Don't remove underscores from `single_imports`, they were never added.
|
// Don't remove underscores from `single_imports`, they were never added.
|
||||||
if target.name != kw::Underscore {
|
if target.name != kw::Underscore {
|
||||||
let key = BindingKey::new(target, ns);
|
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);
|
resolution.single_imports.swap_remove(&import);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1516,7 +1515,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
.resolution(import.parent_scope.module, key)
|
.resolution(import.parent_scope.module, key)
|
||||||
.and_then(|r| r.binding())
|
.and_then(|r| r.binding())
|
||||||
.is_some_and(|binding| binding.warn_ambiguity_recursive());
|
.is_some_and(|binding| binding.warn_ambiguity_recursive());
|
||||||
let _ = self.try_define(
|
let _ = self.try_define_local(
|
||||||
import.parent_scope.module,
|
import.parent_scope.module,
|
||||||
key.ident,
|
key.ident,
|
||||||
key.ns,
|
key.ns,
|
||||||
|
|||||||
@@ -2633,7 +2633,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||||||
false
|
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 result = None;
|
||||||
let mut seen_modules = FxHashSet::default();
|
let mut seen_modules = FxHashSet::default();
|
||||||
let root_did = self.r.graph_root.def_id();
|
let root_did = self.r.graph_root.def_id();
|
||||||
@@ -2690,7 +2690,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||||||
result
|
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)| {
|
self.find_module(def_id).map(|(enum_module, enum_import_suggestion)| {
|
||||||
let mut variants = Vec::new();
|
let mut variants = Vec::new();
|
||||||
enum_module.for_each_child(self.r, |_, ident, _, name_binding| {
|
enum_module.for_each_child(self.r, |_, ident, _, name_binding| {
|
||||||
@@ -2707,7 +2707,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
|||||||
|
|
||||||
/// Adds a suggestion for using an enum's variant when an enum is used instead.
|
/// Adds a suggestion for using an enum's variant when an enum is used instead.
|
||||||
fn suggest_using_enum_variant(
|
fn suggest_using_enum_variant(
|
||||||
&mut self,
|
&self,
|
||||||
err: &mut Diag<'_>,
|
err: &mut Diag<'_>,
|
||||||
source: PathSource<'_, '_, '_>,
|
source: PathSource<'_, '_, '_>,
|
||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
|
|||||||
@@ -656,11 +656,23 @@ impl<'ra> ModuleData<'ra> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'ra> Module<'ra> {
|
impl<'ra> Module<'ra> {
|
||||||
fn for_each_child<'tcx, R, F>(self, resolver: &mut R, mut f: F)
|
fn for_each_child<'tcx, R: AsRef<Resolver<'ra, 'tcx>>>(
|
||||||
where
|
self,
|
||||||
R: AsMut<Resolver<'ra, 'tcx>>,
|
resolver: &R,
|
||||||
F: FnMut(&mut R, Ident, Namespace, NameBinding<'ra>),
|
mut f: impl FnMut(&R, Ident, Namespace, NameBinding<'ra>),
|
||||||
{
|
) {
|
||||||
|
for (key, name_resolution) in resolver.as_ref().resolutions(self).borrow().iter() {
|
||||||
|
if let Some(binding) = name_resolution.borrow().best_binding() {
|
||||||
|
f(resolver, key.ident, key.ns, binding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn for_each_child_mut<'tcx, R: AsMut<Resolver<'ra, 'tcx>>>(
|
||||||
|
self,
|
||||||
|
resolver: &mut R,
|
||||||
|
mut f: impl FnMut(&mut R, Ident, Namespace, NameBinding<'ra>),
|
||||||
|
) {
|
||||||
for (key, name_resolution) in resolver.as_mut().resolutions(self).borrow().iter() {
|
for (key, name_resolution) in resolver.as_mut().resolutions(self).borrow().iter() {
|
||||||
if let Some(binding) = name_resolution.borrow().best_binding() {
|
if let Some(binding) = name_resolution.borrow().best_binding() {
|
||||||
f(resolver, key.ident, key.ns, binding);
|
f(resolver, key.ident, key.ns, binding);
|
||||||
@@ -669,10 +681,7 @@ impl<'ra> Module<'ra> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// This modifies `self` in place. The traits will be stored in `self.traits`.
|
/// This modifies `self` in place. The traits will be stored in `self.traits`.
|
||||||
fn ensure_traits<'tcx, R>(self, resolver: &mut R)
|
fn ensure_traits<'tcx>(self, resolver: &impl AsRef<Resolver<'ra, 'tcx>>) {
|
||||||
where
|
|
||||||
R: AsMut<Resolver<'ra, 'tcx>>,
|
|
||||||
{
|
|
||||||
let mut traits = self.traits.borrow_mut();
|
let mut traits = self.traits.borrow_mut();
|
||||||
if traits.is_none() {
|
if traits.is_none() {
|
||||||
let mut collected_traits = Vec::new();
|
let mut collected_traits = Vec::new();
|
||||||
@@ -681,7 +690,7 @@ impl<'ra> Module<'ra> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if let Res::Def(DefKind::Trait | DefKind::TraitAlias, def_id) = binding.res() {
|
if let Res::Def(DefKind::Trait | DefKind::TraitAlias, def_id) = binding.res() {
|
||||||
collected_traits.push((name, binding, r.as_mut().get_module(def_id)))
|
collected_traits.push((name, binding, r.as_ref().get_module(def_id)))
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
*traits = Some(collected_traits.into_boxed_slice());
|
*traits = Some(collected_traits.into_boxed_slice());
|
||||||
@@ -1340,6 +1349,12 @@ impl<'ra, 'tcx> AsMut<Resolver<'ra, 'tcx>> for Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'ra, 'tcx> AsRef<Resolver<'ra, 'tcx>> for Resolver<'ra, 'tcx> {
|
||||||
|
fn as_ref(&self) -> &Resolver<'ra, 'tcx> {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> Resolver<'_, 'tcx> {
|
impl<'tcx> Resolver<'_, 'tcx> {
|
||||||
fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
|
fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
|
||||||
self.opt_feed(node).map(|f| f.key())
|
self.opt_feed(node).map(|f| f.key())
|
||||||
@@ -1861,7 +1876,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
// We don't reject trait aliases (`trait_module == None`) because we don't have access to their
|
// We don't reject trait aliases (`trait_module == None`) because we don't have access to their
|
||||||
// associated items.
|
// associated items.
|
||||||
fn trait_may_have_item(
|
fn trait_may_have_item(
|
||||||
&mut self,
|
&self,
|
||||||
trait_module: Option<Module<'ra>>,
|
trait_module: Option<Module<'ra>>,
|
||||||
assoc_item: Option<(Symbol, Namespace)>,
|
assoc_item: Option<(Symbol, Namespace)>,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
@@ -1893,7 +1908,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
import_ids
|
import_ids
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolutions(&mut self, module: Module<'ra>) -> &'ra Resolutions<'ra> {
|
fn resolutions(&self, module: Module<'ra>) -> &'ra Resolutions<'ra> {
|
||||||
if module.populate_on_access.get() {
|
if module.populate_on_access.get() {
|
||||||
module.populate_on_access.set(false);
|
module.populate_on_access.set(false);
|
||||||
self.build_reduced_graph_external(module);
|
self.build_reduced_graph_external(module);
|
||||||
@@ -1902,7 +1917,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn resolution(
|
fn resolution(
|
||||||
&mut self,
|
&self,
|
||||||
module: Module<'ra>,
|
module: Module<'ra>,
|
||||||
key: BindingKey,
|
key: BindingKey,
|
||||||
) -> Option<Ref<'ra, NameResolution<'ra>>> {
|
) -> Option<Ref<'ra, NameResolution<'ra>>> {
|
||||||
@@ -1910,7 +1925,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn resolution_or_default(
|
fn resolution_or_default(
|
||||||
&mut self,
|
&self,
|
||||||
module: Module<'ra>,
|
module: Module<'ra>,
|
||||||
key: BindingKey,
|
key: BindingKey,
|
||||||
) -> &'ra RefCell<NameResolution<'ra>> {
|
) -> &'ra RefCell<NameResolution<'ra>> {
|
||||||
|
|||||||
@@ -511,7 +511,7 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn glob_delegation_suffixes(
|
fn glob_delegation_suffixes(
|
||||||
&mut self,
|
&self,
|
||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
impl_def_id: LocalDefId,
|
impl_def_id: LocalDefId,
|
||||||
) -> Result<Vec<(Ident, Option<Ident>)>, Indeterminate> {
|
) -> Result<Vec<(Ident, Option<Ident>)>, Indeterminate> {
|
||||||
|
|||||||
Reference in New Issue
Block a user