Skip to content

Commit 5c466cc

Browse files
committed
Refactor out some crate wide data in DefMap into nested struct
1 parent dc7c6d4 commit 5c466cc

File tree

6 files changed

+73
-58
lines changed

6 files changed

+73
-58
lines changed

crates/hir-def/src/body/tests/block.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ fn f() {
148148
}
149149
"#,
150150
expect![[r#"
151-
BlockId(1) in ModuleId { krate: Idx::<CrateData>(0), block: Some(BlockId(0)), local_id: Idx::<ModuleData>(1) }
152-
BlockId(0) in ModuleId { krate: Idx::<CrateData>(0), block: None, local_id: Idx::<ModuleData>(0) }
151+
BlockId(1) in BlockRelativeModuleId { block: Some(BlockId(0)), local_id: Idx::<ModuleData>(1) }
152+
BlockId(0) in BlockRelativeModuleId { block: None, local_id: Idx::<ModuleData>(0) }
153153
crate scope
154154
"#]],
155155
);

crates/hir-def/src/nameres.rs

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,23 @@ pub struct DefMap {
109109
/// this contains all kinds of macro, not just `macro_rules!` macro.
110110
macro_use_prelude: FxHashMap<Name, MacroId>,
111111

112+
/// Tracks which custom derives are in scope for an item, to allow resolution of derive helper
113+
/// attributes.
114+
derive_helpers_in_scope: FxHashMap<AstId<ast::Item>, Vec<(Name, MacroId, MacroCallId)>>,
115+
116+
diagnostics: Vec<DefDiagnostic>,
117+
118+
// FIXME: Arc this so we can share it with block def maps
119+
data: CrateData,
120+
}
121+
122+
#[derive(Debug, PartialEq, Eq)]
123+
struct CrateData {
112124
/// Side table for resolving derive helpers.
113125
exported_derives: FxHashMap<MacroDefId, Box<[Name]>>,
114126
fn_proc_macro_mapping: FxHashMap<FunctionId, ProcMacroId>,
115127
/// The error that occurred when failing to load the proc-macro dll.
116128
proc_macro_loading_error: Option<Box<str>>,
117-
/// Tracks which custom derives are in scope for an item, to allow resolution of derive helper
118-
/// attributes.
119-
derive_helpers_in_scope: FxHashMap<AstId<ast::Item>, Vec<(Name, MacroId, MacroCallId)>>,
120129

121130
/// Custom attributes registered with `#![register_attr]`.
122131
registered_attrs: Vec<SmolStr>,
@@ -131,7 +140,6 @@ pub struct DefMap {
131140

132141
edition: Edition,
133142
recursion_limit: Option<u32>,
134-
diagnostics: Vec<DefDiagnostic>,
135143
}
136144

137145
/// For `DefMap`s computed for a block expression, this stores its location in the parent map.
@@ -278,7 +286,7 @@ impl DefMap {
278286
let module_data =
279287
ModuleData::new(ModuleOrigin::BlockExpr { block: block.ast_id }, visibility);
280288

281-
let mut def_map = DefMap::empty(krate, parent_map.edition, module_data);
289+
let mut def_map = DefMap::empty(krate, parent_map.data.edition, module_data);
282290
def_map.block = Some(BlockInfo {
283291
block: block_id,
284292
parent: BlockRelativeModuleId {
@@ -300,23 +308,25 @@ impl DefMap {
300308
_c: Count::new(),
301309
block: None,
302310
krate,
303-
edition,
304-
recursion_limit: None,
305311
extern_prelude: FxHashMap::default(),
306312
macro_use_prelude: FxHashMap::default(),
307-
exported_derives: FxHashMap::default(),
308-
fn_proc_macro_mapping: FxHashMap::default(),
309-
proc_macro_loading_error: None,
310313
derive_helpers_in_scope: FxHashMap::default(),
311314
prelude: None,
312315
modules,
313-
registered_attrs: Vec::new(),
314-
registered_tools: Vec::new(),
315-
unstable_features: FxHashSet::default(),
316316
diagnostics: Vec::new(),
317-
rustc_coherence_is_core: false,
318-
no_core: false,
319-
no_std: false,
317+
data: CrateData {
318+
recursion_limit: None,
319+
exported_derives: FxHashMap::default(),
320+
fn_proc_macro_mapping: FxHashMap::default(),
321+
proc_macro_loading_error: None,
322+
registered_attrs: Vec::new(),
323+
registered_tools: Vec::new(),
324+
unstable_features: FxHashSet::default(),
325+
rustc_coherence_is_core: false,
326+
no_core: false,
327+
no_std: false,
328+
edition,
329+
},
320330
}
321331
}
322332

@@ -339,31 +349,31 @@ impl DefMap {
339349
}
340350

341351
pub fn registered_tools(&self) -> &[SmolStr] {
342-
&self.registered_tools
352+
&self.data.registered_tools
343353
}
344354

345355
pub fn registered_attrs(&self) -> &[SmolStr] {
346-
&self.registered_attrs
356+
&self.data.registered_attrs
347357
}
348358

349359
pub fn is_unstable_feature_enabled(&self, feature: &str) -> bool {
350-
self.unstable_features.contains(feature)
360+
self.data.unstable_features.contains(feature)
351361
}
352362

353363
pub fn is_rustc_coherence_is_core(&self) -> bool {
354-
self.rustc_coherence_is_core
364+
self.data.rustc_coherence_is_core
355365
}
356366

357367
pub fn is_no_std(&self) -> bool {
358-
self.no_std || self.no_core
368+
self.data.no_std || self.data.no_core
359369
}
360370

361371
pub fn fn_as_proc_macro(&self, id: FunctionId) -> Option<ProcMacroId> {
362-
self.fn_proc_macro_mapping.get(&id).copied()
372+
self.data.fn_proc_macro_mapping.get(&id).copied()
363373
}
364374

365375
pub fn proc_macro_loading_error(&self) -> Option<&str> {
366-
self.proc_macro_loading_error.as_deref()
376+
self.data.proc_macro_loading_error.as_deref()
367377
}
368378

369379
pub fn krate(&self) -> CrateId {
@@ -540,25 +550,28 @@ impl DefMap {
540550
// Exhaustive match to require handling new fields.
541551
let Self {
542552
_c: _,
543-
exported_derives,
544553
extern_prelude,
545554
macro_use_prelude,
546555
diagnostics,
547556
modules,
548-
registered_attrs,
549-
registered_tools,
550-
fn_proc_macro_mapping,
551557
derive_helpers_in_scope,
552-
unstable_features,
553-
proc_macro_loading_error: _,
554558
block: _,
555-
edition: _,
556-
recursion_limit: _,
557559
krate: _,
558560
prelude: _,
559-
rustc_coherence_is_core: _,
560-
no_core: _,
561-
no_std: _,
561+
data:
562+
CrateData {
563+
exported_derives,
564+
fn_proc_macro_mapping,
565+
registered_attrs,
566+
registered_tools,
567+
unstable_features,
568+
proc_macro_loading_error: _,
569+
rustc_coherence_is_core: _,
570+
no_core: _,
571+
no_std: _,
572+
edition: _,
573+
recursion_limit: _,
574+
},
562575
} = self;
563576

564577
extern_prelude.shrink_to_fit();
@@ -583,7 +596,7 @@ impl DefMap {
583596
}
584597

585598
pub fn recursion_limit(&self) -> Option<u32> {
586-
self.recursion_limit
599+
self.data.recursion_limit
587600
}
588601
}
589602

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ impl DefMap {
7878
let name = name.to_smol_str();
7979
let pred = |n: &_| *n == name;
8080

81-
let registered = self.registered_tools.iter().map(SmolStr::as_str);
81+
let registered = self.data.registered_tools.iter().map(SmolStr::as_str);
8282
let is_tool = TOOL_MODULES.iter().copied().chain(registered).any(pred);
8383
// FIXME: tool modules can be shadowed by actual modules
8484
if is_tool {
8585
return true;
8686
}
8787

8888
if segments.len() == 1 {
89-
let mut registered = self.registered_attrs.iter().map(SmolStr::as_str);
89+
let mut registered = self.data.registered_attrs.iter().map(SmolStr::as_str);
9090
let is_inert = find_builtin_attr_idx(&name).is_some() || registered.any(pred);
9191
return is_inert;
9292
}

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

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,11 @@ pub(super) fn collect_defs(db: &dyn DefDatabase, mut def_map: DefMap, tree_id: T
9898
.collect()
9999
}
100100
Some(Err(e)) => {
101-
def_map.proc_macro_loading_error = Some(e.clone().into_boxed_str());
101+
def_map.data.proc_macro_loading_error = Some(e.clone().into_boxed_str());
102102
Vec::new()
103103
}
104104
None => {
105-
def_map.proc_macro_loading_error =
105+
def_map.data.proc_macro_loading_error =
106106
Some("No proc-macros present for crate".to_owned().into_boxed_str());
107107
Vec::new()
108108
}
@@ -306,7 +306,7 @@ impl DefCollector<'_> {
306306
if *attr_name == hir_expand::name![recursion_limit] {
307307
if let Some(limit) = attr.string_value() {
308308
if let Ok(limit) = limit.parse() {
309-
self.def_map.recursion_limit = Some(limit);
309+
self.def_map.data.recursion_limit = Some(limit);
310310
}
311311
}
312312
continue;
@@ -320,17 +320,17 @@ impl DefCollector<'_> {
320320
}
321321

322322
if *attr_name == hir_expand::name![no_core] {
323-
self.def_map.no_core = true;
323+
self.def_map.data.no_core = true;
324324
continue;
325325
}
326326

327327
if *attr_name == hir_expand::name![no_std] {
328-
self.def_map.no_std = true;
328+
self.def_map.data.no_std = true;
329329
continue;
330330
}
331331

332332
if attr_name.as_text().as_deref() == Some("rustc_coherence_is_core") {
333-
self.def_map.rustc_coherence_is_core = true;
333+
self.def_map.data.rustc_coherence_is_core = true;
334334
continue;
335335
}
336336

@@ -344,7 +344,7 @@ impl DefCollector<'_> {
344344
[name] => Some(name.to_smol_str()),
345345
_ => None,
346346
});
347-
self.def_map.unstable_features.extend(features);
347+
self.def_map.data.unstable_features.extend(features);
348348
}
349349

350350
let attr_is_register_like = *attr_name == hir_expand::name![register_attr]
@@ -359,10 +359,10 @@ impl DefCollector<'_> {
359359
};
360360

361361
if *attr_name == hir_expand::name![register_attr] {
362-
self.def_map.registered_attrs.push(registered_name.to_smol_str());
362+
self.def_map.data.registered_attrs.push(registered_name.to_smol_str());
363363
cov_mark::hit!(register_attr);
364364
} else {
365-
self.def_map.registered_tools.push(registered_name.to_smol_str());
365+
self.def_map.data.registered_tools.push(registered_name.to_smol_str());
366366
cov_mark::hit!(register_tool);
367367
}
368368
}
@@ -530,12 +530,12 @@ impl DefCollector<'_> {
530530
fn inject_prelude(&mut self) {
531531
// See compiler/rustc_builtin_macros/src/standard_library_imports.rs
532532

533-
if self.def_map.no_core {
533+
if self.def_map.data.no_core {
534534
// libcore does not get a prelude.
535535
return;
536536
}
537537

538-
let krate = if self.def_map.no_std {
538+
let krate = if self.def_map.data.no_std {
539539
name![core]
540540
} else {
541541
let std = name![std];
@@ -548,13 +548,13 @@ impl DefCollector<'_> {
548548
}
549549
};
550550

551-
let edition = match self.def_map.edition {
551+
let edition = match self.def_map.data.edition {
552552
Edition::Edition2015 => name![rust_2015],
553553
Edition::Edition2018 => name![rust_2018],
554554
Edition::Edition2021 => name![rust_2021],
555555
};
556556

557-
let path_kind = match self.def_map.edition {
557+
let path_kind = match self.def_map.data.edition {
558558
Edition::Edition2015 => PathKind::Plain,
559559
_ => PathKind::Abs,
560560
};
@@ -611,10 +611,11 @@ impl DefCollector<'_> {
611611
self.define_proc_macro(def.name.clone(), proc_macro_id);
612612
if let ProcMacroKind::CustomDerive { helpers } = def.kind {
613613
self.def_map
614+
.data
614615
.exported_derives
615616
.insert(macro_id_to_def_id(self.db, proc_macro_id.into()), helpers);
616617
}
617-
self.def_map.fn_proc_macro_mapping.insert(fn_id, proc_macro_id);
618+
self.def_map.data.fn_proc_macro_mapping.insert(fn_id, proc_macro_id);
618619
}
619620

620621
/// Define a macro with `macro_rules`.
@@ -773,7 +774,7 @@ impl DefCollector<'_> {
773774
fn resolve_import(&self, module_id: LocalModuleId, import: &Import) -> PartialResolvedImport {
774775
let _p = profile::span("resolve_import")
775776
.detail(|| format!("{}", import.path.display(self.db.upcast())));
776-
tracing::debug!("resolving import: {:?} ({:?})", import, self.def_map.edition);
777+
tracing::debug!("resolving import: {:?} ({:?})", import, self.def_map.data.edition);
777778
if import.is_extern_crate {
778779
let name = import
779780
.path
@@ -1153,7 +1154,7 @@ impl DefCollector<'_> {
11531154
// Record its helper attributes.
11541155
if def_id.krate != self.def_map.krate {
11551156
let def_map = self.db.crate_def_map(def_id.krate);
1156-
if let Some(helpers) = def_map.exported_derives.get(&def_id) {
1157+
if let Some(helpers) = def_map.data.exported_derives.get(&def_id) {
11571158
self.def_map
11581159
.derive_helpers_in_scope
11591160
.entry(ast_id.ast_id.map(|it| it.upcast()))
@@ -2166,6 +2167,7 @@ impl ModCollector<'_, '_> {
21662167
if let Some(helpers) = helpers_opt {
21672168
self.def_collector
21682169
.def_map
2170+
.data
21692171
.exported_derives
21702172
.insert(macro_id_to_def_id(self.def_collector.db, macro_id.into()), helpers);
21712173
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ impl DefMap {
218218
// rust-lang/rust#57745)
219219
// FIXME there must be a nicer way to write this condition
220220
PathKind::Plain | PathKind::Abs
221-
if self.edition == Edition::Edition2015
221+
if self.data.edition == Edition::Edition2015
222222
&& (path.kind == PathKind::Abs || mode == ResolveMode::Import) =>
223223
{
224224
let (_, segment) = match segments.next() {

crates/hir-def/src/nameres/tests/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,8 +1094,8 @@ pub fn derive_macro_2(_item: TokenStream) -> TokenStream {
10941094
let krate = db.crate_graph().iter().next().unwrap();
10951095
let def_map = db.crate_def_map(krate);
10961096

1097-
assert_eq!(def_map.exported_derives.len(), 1);
1098-
match def_map.exported_derives.values().next() {
1097+
assert_eq!(def_map.data.exported_derives.len(), 1);
1098+
match def_map.data.exported_derives.values().next() {
10991099
Some(helpers) => match &**helpers {
11001100
[attr] => assert_eq!(attr.display(&db).to_string(), "helper_attr"),
11011101
_ => unreachable!(),

0 commit comments

Comments
 (0)