resolve: Make disambiguators for underscore bindings module-local
This commit is contained in:
@@ -532,15 +532,26 @@ struct BindingKey {
|
||||
/// identifier.
|
||||
ident: Ident,
|
||||
ns: Namespace,
|
||||
/// 0 if ident is not `_`, otherwise a value that's unique to the specific
|
||||
/// `_` in the expanded AST that introduced this binding.
|
||||
/// When we add an underscore binding (with ident `_`) to some module, this field has
|
||||
/// a non-zero value that uniquely identifies this binding in that module.
|
||||
/// For non-underscore bindings this field is zero.
|
||||
/// When a key is constructed for name lookup (as opposed to name definition), this field is
|
||||
/// also zero, even for underscore names, so for underscores the lookup will never succeed.
|
||||
disambiguator: u32,
|
||||
}
|
||||
|
||||
impl BindingKey {
|
||||
fn new(ident: Ident, ns: Namespace) -> Self {
|
||||
let ident = ident.normalize_to_macros_2_0();
|
||||
BindingKey { ident, ns, disambiguator: 0 }
|
||||
BindingKey { ident: ident.normalize_to_macros_2_0(), ns, disambiguator: 0 }
|
||||
}
|
||||
|
||||
fn new_disambiguated(
|
||||
ident: Ident,
|
||||
ns: Namespace,
|
||||
disambiguator: impl FnOnce() -> u32,
|
||||
) -> BindingKey {
|
||||
let disambiguator = if ident.name == kw::Underscore { disambiguator() } else { 0 };
|
||||
BindingKey { ident: ident.normalize_to_macros_2_0(), ns, disambiguator }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1078,8 +1089,6 @@ pub struct Resolver<'ra, 'tcx> {
|
||||
module_map: FxIndexMap<DefId, Module<'ra>>,
|
||||
binding_parent_modules: FxHashMap<NameBinding<'ra>, Module<'ra>>,
|
||||
|
||||
underscore_disambiguator: u32,
|
||||
|
||||
/// Maps glob imports to the names of items actually imported.
|
||||
glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
|
||||
glob_error: Option<ErrorGuaranteed>,
|
||||
@@ -1500,7 +1509,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||
extern_crate_map: Default::default(),
|
||||
module_children: Default::default(),
|
||||
trait_map: NodeMap::default(),
|
||||
underscore_disambiguator: 0,
|
||||
empty_module,
|
||||
module_map,
|
||||
block_map: Default::default(),
|
||||
@@ -1880,17 +1888,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||
import_ids
|
||||
}
|
||||
|
||||
fn new_disambiguated_key(&mut self, ident: Ident, ns: Namespace) -> BindingKey {
|
||||
let ident = ident.normalize_to_macros_2_0();
|
||||
let disambiguator = if ident.name == kw::Underscore {
|
||||
self.underscore_disambiguator += 1;
|
||||
self.underscore_disambiguator
|
||||
} else {
|
||||
0
|
||||
};
|
||||
BindingKey { ident, ns, disambiguator }
|
||||
}
|
||||
|
||||
fn resolutions(&mut self, module: Module<'ra>) -> &'ra Resolutions<'ra> {
|
||||
if module.populate_on_access.get() {
|
||||
module.populate_on_access.set(false);
|
||||
|
||||
Reference in New Issue
Block a user