Skip to content

Commit afa374e

Browse files
committed
Auto merge of rust-lang#13175 - Veykril:resolver, r=Veykril
Clarify the state of (extern) preludes for block def maps
2 parents f27f98d + 894aa0e commit afa374e

File tree

3 files changed

+60
-60
lines changed

3 files changed

+60
-60
lines changed

crates/hir-def/src/nameres.rs

+4
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ pub struct DefMap {
9898
/// The prelude module for this crate. This either comes from an import
9999
/// marked with the `prelude_import` attribute, or (in the normal case) from
100100
/// a dependency (`std` or `core`).
101+
/// The prelude is empty for non-block DefMaps (unless `#[prelude_import]` was used,
102+
/// but that attribute is nightly and when used in a block, it affects resolution globally
103+
/// so we aren't handling this correctly anyways).
101104
prelude: Option<ModuleId>,
105+
/// The extern prelude is only populated for non-block DefMaps
102106
extern_prelude: FxHashMap<Name, ModuleId>,
103107

104108
/// Side table for resolving derive helpers.

crates/hir-def/src/nameres/collector.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -512,10 +512,9 @@ impl DefCollector<'_> {
512512
Edition::Edition2021 => name![rust_2021],
513513
};
514514

515-
let path_kind = if self.def_map.edition == Edition::Edition2015 {
516-
PathKind::Plain
517-
} else {
518-
PathKind::Abs
515+
let path_kind = match self.def_map.edition {
516+
Edition::Edition2015 => PathKind::Plain,
517+
_ => PathKind::Abs,
519518
};
520519
let path =
521520
ModPath::from_segments(path_kind, [krate.clone(), name![prelude], edition].into_iter());
@@ -535,7 +534,6 @@ impl DefCollector<'_> {
535534
match per_ns.types {
536535
Some((ModuleDefId::ModuleId(m), _)) => {
537536
self.def_map.prelude = Some(m);
538-
return;
539537
}
540538
types => {
541539
tracing::debug!(
@@ -850,7 +848,10 @@ impl DefCollector<'_> {
850848
tracing::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def);
851849

852850
// extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658
853-
if import.is_extern_crate && module_id == self.def_map.root {
851+
if import.is_extern_crate
852+
&& self.def_map.block.is_none()
853+
&& module_id == self.def_map.root
854+
{
854855
if let (Some(ModuleDefId::ModuleId(def)), Some(name)) = (def.take_types(), name)
855856
{
856857
self.def_map.extern_prelude.insert(name.clone(), def);

crates/hir-def/src/resolver.rs

+49-54
Original file line numberDiff line numberDiff line change
@@ -368,34 +368,43 @@ impl Resolver {
368368
for scope in self.scopes() {
369369
scope.process_names(&mut res, db);
370370
}
371-
process_module_scope_names(&mut res, db, &self.module_scope);
371+
let ModuleItemMap { ref def_map, module_id } = self.module_scope;
372+
// FIXME: should we provide `self` here?
373+
// f(
374+
// Name::self_param(),
375+
// PerNs::types(Resolution::Def {
376+
// def: m.module.into(),
377+
// }),
378+
// );
379+
def_map[module_id].scope.entries().for_each(|(name, def)| {
380+
res.add_per_ns(name, def);
381+
});
382+
def_map[module_id].scope.legacy_macros().for_each(|(name, macs)| {
383+
macs.iter().for_each(|&mac| {
384+
res.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(MacroId::from(mac))));
385+
})
386+
});
387+
def_map.extern_prelude().for_each(|(name, &def)| {
388+
res.add(name, ScopeDef::ModuleDef(ModuleDefId::ModuleId(def)));
389+
});
390+
BUILTIN_SCOPE.iter().for_each(|(name, &def)| {
391+
res.add_per_ns(name, def);
392+
});
393+
if let Some(prelude) = def_map.prelude() {
394+
let prelude_def_map = prelude.def_map(db);
395+
for (name, def) in prelude_def_map[prelude.local_id].scope.entries() {
396+
res.add_per_ns(name, def)
397+
}
398+
}
372399
res.map
373400
}
374401

375402
pub fn traits_in_scope(&self, db: &dyn DefDatabase) -> FxHashSet<TraitId> {
376403
let mut traits = FxHashSet::default();
377404

378-
let collect_module_traits = |traits: &mut FxHashSet<_>, m: &ModuleItemMap| {
379-
if let Some(prelude) = m.def_map.prelude() {
380-
let prelude_def_map = prelude.def_map(db);
381-
traits.extend(prelude_def_map[prelude.local_id].scope.traits());
382-
}
383-
traits.extend(m.def_map[m.module_id].scope.traits());
384-
385-
// Add all traits that are in scope because of the containing DefMaps
386-
m.def_map.with_ancestor_maps(db, m.module_id, &mut |def_map, module| {
387-
if let Some(prelude) = def_map.prelude() {
388-
let prelude_def_map = prelude.def_map(db);
389-
traits.extend(prelude_def_map[prelude.local_id].scope.traits());
390-
}
391-
traits.extend(def_map[module].scope.traits());
392-
None::<()>
393-
});
394-
};
395-
396405
for scope in self.scopes() {
397406
match scope {
398-
Scope::BlockScope(m) => collect_module_traits(&mut traits, m),
407+
Scope::BlockScope(m) => traits.extend(m.def_map[m.module_id].scope.traits()),
399408
&Scope::ImplDefScope(impl_) => {
400409
if let Some(target_trait) = &db.impl_data(impl_).target_trait {
401410
if let Some(TypeNs::TraitId(trait_)) =
@@ -409,7 +418,13 @@ impl Resolver {
409418
}
410419
}
411420

412-
collect_module_traits(&mut traits, &self.module_scope);
421+
// Fill in the prelude traits
422+
if let Some(prelude) = self.module_scope.def_map.prelude() {
423+
let prelude_def_map = prelude.def_map(db);
424+
traits.extend(prelude_def_map[prelude.local_id].scope.traits());
425+
}
426+
// Fill in module visible traits
427+
traits.extend(self.module_scope.def_map[self.module_scope.module_id].scope.traits());
413428
traits
414429
}
415430

@@ -493,42 +508,22 @@ pub enum ScopeDef {
493508
Label(LabelId),
494509
}
495510

496-
fn process_module_scope_names(acc: &mut ScopeNames, db: &dyn DefDatabase, m: &ModuleItemMap) {
497-
// FIXME: should we provide `self` here?
498-
// f(
499-
// Name::self_param(),
500-
// PerNs::types(Resolution::Def {
501-
// def: m.module.into(),
502-
// }),
503-
// );
504-
m.def_map[m.module_id].scope.entries().for_each(|(name, def)| {
505-
acc.add_per_ns(name, def);
506-
});
507-
m.def_map[m.module_id].scope.legacy_macros().for_each(|(name, macs)| {
508-
macs.iter().for_each(|&mac| {
509-
acc.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(MacroId::from(mac))));
510-
})
511-
});
512-
m.def_map.extern_prelude().for_each(|(name, &def)| {
513-
acc.add(name, ScopeDef::ModuleDef(ModuleDefId::ModuleId(def)));
514-
});
515-
if m.def_map.block_id().is_none() {
516-
BUILTIN_SCOPE.iter().for_each(|(name, &def)| {
517-
acc.add_per_ns(name, def);
518-
});
519-
}
520-
if let Some(prelude) = m.def_map.prelude() {
521-
let prelude_def_map = prelude.def_map(db);
522-
for (name, def) in prelude_def_map[prelude.local_id].scope.entries() {
523-
acc.add_per_ns(name, def)
524-
}
525-
}
526-
}
527-
528511
impl Scope {
529512
fn process_names(&self, acc: &mut ScopeNames, db: &dyn DefDatabase) {
530513
match self {
531-
Scope::BlockScope(m) => process_module_scope_names(acc, db, m),
514+
Scope::BlockScope(m) => {
515+
m.def_map[m.module_id].scope.entries().for_each(|(name, def)| {
516+
acc.add_per_ns(name, def);
517+
});
518+
m.def_map[m.module_id].scope.legacy_macros().for_each(|(name, macs)| {
519+
macs.iter().for_each(|&mac| {
520+
acc.add(
521+
name,
522+
ScopeDef::ModuleDef(ModuleDefId::MacroId(MacroId::from(mac))),
523+
);
524+
})
525+
});
526+
}
532527
Scope::GenericParams { params, def: parent } => {
533528
let parent = *parent;
534529
for (local_id, param) in params.type_or_consts.iter() {

0 commit comments

Comments
 (0)