Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 1e6406e

Browse files
committed
Move extern prelude into CrateData
1 parent bdca349 commit 1e6406e

File tree

3 files changed

+43
-31
lines changed

3 files changed

+43
-31
lines changed

crates/hir-def/src/nameres.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ pub struct DefMap {
103103
/// but that attribute is nightly and when used in a block, it affects resolution globally
104104
/// so we aren't handling this correctly anyways).
105105
prelude: Option<ModuleId>,
106-
/// The extern prelude is only populated for non-block DefMaps
107-
extern_prelude: FxHashMap<Name, ModuleId>,
108106
/// `macro_use` prelude that contains macros from `#[macro_use]`'d external crates. Note that
109107
/// this contains all kinds of macro, not just `macro_rules!` macro.
110108
macro_use_prelude: FxHashMap<Name, MacroId>,
@@ -115,12 +113,13 @@ pub struct DefMap {
115113

116114
diagnostics: Vec<DefDiagnostic>,
117115

118-
// FIXME: Arc this so we can share it with block def maps
119116
data: Arc<CrateData>,
120117
}
121118

122119
#[derive(Clone, Debug, PartialEq, Eq)]
123120
struct CrateData {
121+
extern_prelude: FxHashMap<Name, ModuleId>,
122+
124123
/// Side table for resolving derive helpers.
125124
exported_derives: FxHashMap<MacroDefId, Box<[Name]>>,
126125
fn_proc_macro_mapping: FxHashMap<FunctionId, ProcMacroId>,
@@ -141,9 +140,11 @@ struct CrateData {
141140
edition: Edition,
142141
recursion_limit: Option<u32>,
143142
}
143+
144144
impl CrateData {
145145
fn shrink_to_fit(&mut self) {
146146
let Self {
147+
extern_prelude,
147148
exported_derives,
148149
fn_proc_macro_mapping,
149150
registered_attrs,
@@ -156,6 +157,7 @@ impl CrateData {
156157
edition: _,
157158
recursion_limit: _,
158159
} = self;
160+
extern_prelude.shrink_to_fit();
159161
exported_derives.shrink_to_fit();
160162
fn_proc_macro_mapping.shrink_to_fit();
161163
registered_attrs.shrink_to_fit();
@@ -181,7 +183,11 @@ struct BlockRelativeModuleId {
181183

182184
impl BlockRelativeModuleId {
183185
fn def_map(self, db: &dyn DefDatabase, krate: CrateId) -> Arc<DefMap> {
184-
ModuleId { krate, block: self.block, local_id: self.local_id }.def_map(db)
186+
self.into_module(krate).def_map(db)
187+
}
188+
189+
fn into_module(self, krate: CrateId) -> ModuleId {
190+
ModuleId { krate, block: self.block, local_id: self.local_id }
185191
}
186192
}
187193

@@ -330,15 +336,14 @@ impl DefMap {
330336
DefMap {
331337
_c: Count::new(),
332338
block: None,
339+
modules,
333340
krate,
334-
extern_prelude: FxHashMap::default(),
341+
prelude: None,
335342
macro_use_prelude: FxHashMap::default(),
336343
derive_helpers_in_scope: FxHashMap::default(),
337-
prelude: None,
338-
modules,
339344
diagnostics: Vec::new(),
340345
data: Arc::new(CrateData {
341-
recursion_limit: None,
346+
extern_prelude: FxHashMap::default(),
342347
exported_derives: FxHashMap::default(),
343348
fn_proc_macro_mapping: FxHashMap::default(),
344349
proc_macro_loading_error: None,
@@ -349,6 +354,7 @@ impl DefMap {
349354
no_core: false,
350355
no_std: false,
351356
edition,
357+
recursion_limit: None,
352358
}),
353359
}
354360
}
@@ -412,7 +418,7 @@ impl DefMap {
412418
}
413419

414420
pub(crate) fn extern_prelude(&self) -> impl Iterator<Item = (&Name, ModuleId)> + '_ {
415-
self.extern_prelude.iter().map(|(name, def)| (name, *def))
421+
self.data.extern_prelude.iter().map(|(name, def)| (name, *def))
416422
}
417423

418424
pub(crate) fn macro_use_prelude(&self) -> impl Iterator<Item = (&Name, MacroId)> + '_ {
@@ -573,7 +579,6 @@ impl DefMap {
573579
// Exhaustive match to require handling new fields.
574580
let Self {
575581
_c: _,
576-
extern_prelude,
577582
macro_use_prelude,
578583
diagnostics,
579584
modules,
@@ -584,7 +589,6 @@ impl DefMap {
584589
data: _,
585590
} = self;
586591

587-
extern_prelude.shrink_to_fit();
588592
macro_use_prelude.shrink_to_fit();
589593
diagnostics.shrink_to_fit();
590594
modules.shrink_to_fit();

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

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
use std::{iter, mem};
77

8-
use base_db::{CrateId, Edition, FileId};
8+
use base_db::{CrateId, Dependency, Edition, FileId};
99
use cfg::{CfgExpr, CfgOptions};
1010
use either::Either;
1111
use hir_expand::{
@@ -62,22 +62,16 @@ static GLOB_RECURSION_LIMIT: Limit = Limit::new(100);
6262
static EXPANSION_DEPTH_LIMIT: Limit = Limit::new(128);
6363
static FIXED_POINT_LIMIT: Limit = Limit::new(8192);
6464

65-
pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: DefMap, tree_id: TreeId) -> DefMap {
65+
pub(super) fn collect_defs(db: &dyn DefDatabase, def_map: DefMap, tree_id: TreeId) -> DefMap {
6666
let crate_graph = db.crate_graph();
6767

6868
let mut deps = FxHashMap::default();
6969
// populate external prelude and dependency list
7070
let krate = &crate_graph[def_map.krate];
7171
for dep in &krate.dependencies {
7272
tracing::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id);
73-
let dep_def_map = db.crate_def_map(dep.crate_id);
74-
let dep_root = dep_def_map.module_id(DefMap::ROOT);
7573

76-
deps.insert(dep.as_name(), dep_root);
77-
78-
if dep.is_prelude() && !tree_id.is_block() {
79-
def_map.extern_prelude.insert(dep.as_name(), dep_root);
80-
}
74+
deps.insert(dep.as_name(), dep.clone());
8175
}
8276

8377
let cfg_options = &krate.cfg_options;
@@ -245,7 +239,7 @@ enum MacroDirectiveKind {
245239
struct DefCollector<'a> {
246240
db: &'a dyn DefDatabase,
247241
def_map: DefMap,
248-
deps: FxHashMap<Name, ModuleId>,
242+
deps: FxHashMap<Name, Dependency>,
249243
glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility)>>,
250244
unresolved_imports: Vec<ImportDirective>,
251245
indeterminate_imports: Vec<ImportDirective>,
@@ -289,6 +283,15 @@ impl DefCollector<'_> {
289283
crate_data.proc_macro_loading_error = Some(e.clone());
290284
}
291285

286+
for (name, dep) in &self.deps {
287+
if dep.is_prelude() {
288+
crate_data.extern_prelude.insert(
289+
name.clone(),
290+
ModuleId { krate: dep.crate_id, block: None, local_id: DefMap::ROOT },
291+
);
292+
}
293+
}
294+
292295
// Process other crate-level attributes.
293296
for attr in &*attrs {
294297
if let Some(cfg) = attr.cfg() {
@@ -832,15 +835,16 @@ impl DefCollector<'_> {
832835
if *name == name!(self) {
833836
cov_mark::hit!(extern_crate_self_as);
834837
let root = match self.def_map.block {
835-
Some(_) => {
836-
let def_map = self.def_map.crate_root(self.db).def_map(self.db);
837-
def_map.module_id(DefMap::ROOT)
838-
}
838+
Some(_) => self.def_map.crate_root(self.db),
839839
None => self.def_map.module_id(DefMap::ROOT),
840840
};
841841
Some(root)
842842
} else {
843-
self.deps.get(name).copied()
843+
self.deps.get(name).map(|dep| ModuleId {
844+
krate: dep.crate_id,
845+
block: None,
846+
local_id: DefMap::ROOT,
847+
})
844848
}
845849
}
846850

@@ -883,7 +887,10 @@ impl DefCollector<'_> {
883887
{
884888
if let (Some(ModuleDefId::ModuleId(def)), Some(name)) = (def.take_types(), name)
885889
{
886-
self.def_map.extern_prelude.insert(name.clone(), def);
890+
Arc::get_mut(&mut self.def_map.data)
891+
.unwrap()
892+
.extern_prelude
893+
.insert(name.clone(), def);
887894
}
888895
}
889896

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ impl DefMap {
8080
name: &Name,
8181
) -> Option<ModuleId> {
8282
match self.block {
83-
Some(_) => self.crate_root(db).def_map(db).extern_prelude.get(name).copied(),
84-
None => self.extern_prelude.get(name).copied(),
83+
Some(_) => self.crate_root(db).def_map(db).data.extern_prelude.get(name).copied(),
84+
None => self.data.extern_prelude.get(name).copied(),
8585
}
8686
}
8787

@@ -304,7 +304,7 @@ impl DefMap {
304304
Some((_, segment)) => segment,
305305
None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),
306306
};
307-
if let Some(&def) = self.extern_prelude.get(segment) {
307+
if let Some(&def) = self.data.extern_prelude.get(segment) {
308308
tracing::debug!("absolute path {:?} resolved to crate {:?}", path, def);
309309
PerNs::types(def.into(), Visibility::Public)
310310
} else {
@@ -453,7 +453,8 @@ impl DefMap {
453453
};
454454

455455
let extern_prelude = || {
456-
self.extern_prelude
456+
self.data
457+
.extern_prelude
457458
.get(name)
458459
.map_or(PerNs::none(), |&it| PerNs::types(it.into(), Visibility::Public))
459460
};

0 commit comments

Comments
 (0)