Skip to content

Commit 2d72ec7

Browse files
committed
Deduplicate
1 parent d80d2fc commit 2d72ec7

File tree

13 files changed

+82
-95
lines changed

13 files changed

+82
-95
lines changed

crates/hir-def/src/body/pretty.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,21 @@ use super::*;
1818
pub(super) fn print_body_hir(db: &dyn DefDatabase, body: &Body, owner: DefWithBodyId) -> String {
1919
let header = match owner {
2020
DefWithBodyId::FunctionId(it) => {
21-
let item_tree_id = it.lookup(db).id;
22-
format!(
23-
"fn {}",
24-
item_tree_id.item_tree(db)[item_tree_id.value].name.display(db.upcast())
25-
)
21+
it.lookup(db).id.resolved(db, |it| format!("fn {} = ", it.name.display(db.upcast())))
2622
}
27-
DefWithBodyId::StaticId(it) => {
28-
let item_tree_id = it.lookup(db).id;
23+
DefWithBodyId::StaticId(it) => it
24+
.lookup(db)
25+
.id
26+
.resolved(db, |it| format!("static {} = ", it.name.display(db.upcast()))),
27+
DefWithBodyId::ConstId(it) => it.lookup(db).id.resolved(db, |it| {
2928
format!(
30-
"static {} = ",
31-
item_tree_id.item_tree(db)[item_tree_id.value].name.display(db.upcast())
29+
"const {} = ",
30+
match &it.name {
31+
Some(name) => name.display(db.upcast()).to_string(),
32+
None => "_".to_string(),
33+
}
3234
)
33-
}
34-
DefWithBodyId::ConstId(it) => {
35-
let item_tree_id = it.lookup(db).id;
36-
let name = match &item_tree_id.item_tree(db)[item_tree_id.value].name {
37-
Some(name) => name.display(db.upcast()).to_string(),
38-
None => "_".to_string(),
39-
};
40-
format!("const {name} = ")
41-
}
35+
}),
4236
DefWithBodyId::InTypeConstId(_) => format!("In type const = "),
4337
DefWithBodyId::VariantId(it) => {
4438
let loc = it.lookup(db);

crates/hir-def/src/child_by_source.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,15 +204,18 @@ impl ChildBySource for VariantId {
204204
}
205205

206206
impl ChildBySource for EnumId {
207-
fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, _: HirFileId) {
207+
fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId) {
208208
let loc = &self.lookup(db);
209+
if file_id != loc.id.file_id() {
210+
return;
211+
}
209212

210213
let tree = loc.id.item_tree(db);
211214
let ast_id_map = db.ast_id_map(loc.id.file_id());
212215
let root = db.parse_or_expand(loc.id.file_id());
213216

214217
db.enum_data(*self).variants.iter().for_each(|&(variant, _)| {
215-
res[keys::VARIANT].insert(
218+
res[keys::ENUM_VARIANT].insert(
216219
ast_id_map.get(tree[variant.lookup(db).id.value].ast_id).to_node(&root),
217220
variant,
218221
);

crates/hir-def/src/data/adt.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ impl EnumData {
298298

299299
Arc::new(EnumData {
300300
name: enum_.name.clone(),
301-
variants: loc.container.def_map(db)[loc.container.local_id].scope.enums[&e]
301+
variants: loc.container.def_map(db).enum_definitions[&e]
302302
.iter()
303303
.map(|&id| (id, item_tree[id.lookup(db).id.value].name.clone()))
304304
.collect(),
@@ -332,7 +332,7 @@ impl EnumVariantData {
332332
pub(crate) fn enum_variant_data_with_diagnostics_query(
333333
db: &dyn DefDatabase,
334334
e: EnumVariantId,
335-
) -> (Arc<EnumVariantData>, Arc<[DefDiagnostic]>) {
335+
) -> (Arc<EnumVariantData>, Option<Arc<Box<[DefDiagnostic]>>>) {
336336
let loc = e.lookup(db);
337337
let krate = loc.container.krate;
338338
let item_tree = loc.id.item_tree(db);
@@ -355,7 +355,11 @@ impl EnumVariantData {
355355
name: variant.name.clone(),
356356
variant_data: Arc::new(var_data),
357357
}),
358-
field_diagnostics.into(),
358+
if field_diagnostics.is_empty() {
359+
None
360+
} else {
361+
Some(Arc::new(field_diagnostics.into_boxed_slice()))
362+
},
359363
)
360364
}
361365
}

crates/hir-def/src/db.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
140140
fn enum_variant_data_with_diagnostics(
141141
&self,
142142
id: EnumVariantId,
143-
) -> (Arc<EnumVariantData>, Arc<[DefDiagnostic]>);
143+
) -> (Arc<EnumVariantData>, Option<Arc<Box<[DefDiagnostic]>>>);
144144

145145
#[salsa::invoke(ImplData::impl_data_query)]
146146
fn impl_data(&self, e: ImplId) -> Arc<ImplData>;

crates/hir-def/src/dyn_map/keys.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub const ENUM: Key<ast::Enum, EnumId> = Key::new();
2828
pub const EXTERN_CRATE: Key<ast::ExternCrate, ExternCrateId> = Key::new();
2929
pub const USE: Key<ast::Use, UseId> = Key::new();
3030

31-
pub const VARIANT: Key<ast::Variant, EnumVariantId> = Key::new();
31+
pub const ENUM_VARIANT: Key<ast::Variant, EnumVariantId> = Key::new();
3232
pub const TUPLE_FIELD: Key<ast::TupleField, FieldId> = Key::new();
3333
pub const RECORD_FIELD: Key<ast::RecordField, FieldId> = Key::new();
3434
pub const TYPE_PARAM: Key<ast::TypeParam, TypeOrConstParamId> = Key::new();

crates/hir-def/src/item_scope.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use crate::{
1818
db::DefDatabase,
1919
per_ns::PerNs,
2020
visibility::{Visibility, VisibilityExplicity},
21-
AdtId, BuiltinType, ConstId, EnumId, EnumVariantId, ExternCrateId, HasModule, ImplId,
22-
LocalModuleId, Lookup, MacroId, ModuleDefId, ModuleId, TraitId, UseId,
21+
AdtId, BuiltinType, ConstId, ExternCrateId, HasModule, ImplId, LocalModuleId, Lookup, MacroId,
22+
ModuleDefId, ModuleId, TraitId, UseId,
2323
};
2424

2525
#[derive(Debug, Default)]
@@ -79,7 +79,6 @@ pub struct ItemScope {
7979
/// declared.
8080
declarations: Vec<ModuleDefId>,
8181

82-
pub enums: FxHashMap<EnumId, Box<[EnumVariantId]>>,
8382
impls: Vec<ImplId>,
8483
unnamed_consts: Vec<ConstId>,
8584
/// Traits imported via `use Trait as _;`.
@@ -719,7 +718,6 @@ impl ItemScope {
719718
use_imports_types,
720719
use_imports_macros,
721720
macro_invocations,
722-
enums,
723721
} = self;
724722
types.shrink_to_fit();
725723
values.shrink_to_fit();
@@ -738,7 +736,6 @@ impl ItemScope {
738736
extern_crate_decls.shrink_to_fit();
739737
use_decls.shrink_to_fit();
740738
macro_invocations.shrink_to_fit();
741-
enums.shrink_to_fit();
742739
}
743740
}
744741

crates/hir-def/src/item_tree.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,13 @@ impl<N> ItemTreeId<N> {
445445
pub fn item_tree(self, db: &dyn DefDatabase) -> Arc<ItemTree> {
446446
self.tree.item_tree(db)
447447
}
448+
449+
pub fn resolved<R>(self, db: &dyn DefDatabase, cb: impl FnOnce(&N) -> R) -> R
450+
where
451+
ItemTree: Index<FileItemTreeId<N>, Output = N>,
452+
{
453+
cb(&self.tree.item_tree(db)[self.value])
454+
}
448455
}
449456

450457
impl<N> Copy for ItemTreeId<N> {}

crates/hir-def/src/lang_item.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ impl LangItems {
125125
}
126126
ModuleDefId::AdtId(AdtId::EnumId(e)) => {
127127
lang_items.collect_lang_item(db, e, LangItemTarget::EnumId);
128-
module_data.scope.enums[&e].iter().for_each(|&id| {
128+
crate_def_map.enum_definitions[&e].iter().for_each(|&id| {
129129
lang_items.collect_lang_item(db, id, LangItemTarget::EnumVariant);
130130
});
131131
}

crates/hir-def/src/nameres.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ use crate::{
8080
path::ModPath,
8181
per_ns::PerNs,
8282
visibility::{Visibility, VisibilityExplicity},
83-
AstId, BlockId, BlockLoc, CrateRootModuleId, ExternCrateId, FunctionId, LocalModuleId, Lookup,
84-
MacroExpander, MacroId, ModuleId, ProcMacroId, UseId,
83+
AstId, BlockId, BlockLoc, CrateRootModuleId, EnumId, EnumVariantId, ExternCrateId, FunctionId,
84+
LocalModuleId, Lookup, MacroExpander, MacroId, ModuleId, ProcMacroId, UseId,
8585
};
8686

8787
/// Contains the results of (early) name resolution.
@@ -113,6 +113,7 @@ pub struct DefMap {
113113
/// this contains all kinds of macro, not just `macro_rules!` macro.
114114
/// ExternCrateId being None implies it being imported from the general prelude import.
115115
macro_use_prelude: FxHashMap<Name, (MacroId, Option<ExternCrateId>)>,
116+
pub(crate) enum_definitions: FxHashMap<EnumId, Box<[EnumVariantId]>>,
116117

117118
/// Tracks which custom derives are in scope for an item, to allow resolution of derive helper
118119
/// attributes.
@@ -370,6 +371,7 @@ impl DefMap {
370371
macro_use_prelude: FxHashMap::default(),
371372
derive_helpers_in_scope: FxHashMap::default(),
372373
diagnostics: Vec::new(),
374+
enum_definitions: FxHashMap::default(),
373375
data: Arc::new(DefMapCrateData {
374376
extern_prelude: FxHashMap::default(),
375377
exported_derives: FxHashMap::default(),
@@ -612,12 +614,14 @@ impl DefMap {
612614
krate: _,
613615
prelude: _,
614616
data: _,
617+
enum_definitions,
615618
} = self;
616619

617620
macro_use_prelude.shrink_to_fit();
618621
diagnostics.shrink_to_fit();
619622
modules.shrink_to_fit();
620623
derive_helpers_in_scope.shrink_to_fit();
624+
enum_definitions.shrink_to_fit();
621625
for (_, module) in modules.iter_mut() {
622626
module.children.shrink_to_fit();
623627
module.scope.shrink_to_fit();

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

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -980,35 +980,26 @@ impl DefCollector<'_> {
980980
cov_mark::hit!(glob_enum);
981981
// glob import from enum => just import all the variants
982982

983-
// We need to check if the def map the enum is from is us, then we can't
983+
// We need to check if the def map the enum is from is us, if it is we can't
984984
// call the def-map query since we are currently constructing it!
985985
let loc = e.lookup(self.db);
986986
let tree = loc.id.item_tree(self.db);
987987
let current_def_map = self.def_map.krate == loc.container.krate
988988
&& self.def_map.block_id() == loc.container.block;
989+
let def_map;
989990
let resolutions = if current_def_map {
990-
self.def_map.modules[loc.container.local_id].scope.enums[&e]
991-
.iter()
992-
.map(|&variant| {
993-
let name = tree[variant.lookup(self.db).id.value].name.clone();
994-
let res =
995-
PerNs::both(variant.into(), variant.into(), vis, None);
996-
(Some(name), res)
997-
})
998-
.collect::<Vec<_>>()
991+
&self.def_map.enum_definitions[&e]
999992
} else {
1000-
loc.container.def_map(self.db).modules[loc.container.local_id]
1001-
.scope
1002-
.enums[&e]
1003-
.iter()
1004-
.map(|&variant| {
1005-
let name = tree[variant.lookup(self.db).id.value].name.clone();
1006-
let res =
1007-
PerNs::both(variant.into(), variant.into(), vis, None);
1008-
(Some(name), res)
1009-
})
1010-
.collect::<Vec<_>>()
1011-
};
993+
def_map = loc.container.def_map(self.db);
994+
&def_map.enum_definitions[&e]
995+
}
996+
.iter()
997+
.map(|&variant| {
998+
let name = tree[variant.lookup(self.db).id.value].name.clone();
999+
let res = PerNs::both(variant.into(), variant.into(), vis, None);
1000+
(Some(name), res)
1001+
})
1002+
.collect::<Vec<_>>();
10121003
self.update(module_id, &resolutions, vis, Some(ImportType::Glob(id)));
10131004
}
10141005
Some(d) => {
@@ -1749,10 +1740,7 @@ impl ModCollector<'_, '_> {
17491740
)
17501741
})
17511742
.collect();
1752-
self.def_collector.def_map.modules[module_id]
1753-
.scope
1754-
.enums
1755-
.insert(enum_, variants);
1743+
self.def_collector.def_map.enum_definitions.insert(enum_, variants);
17561744
}
17571745
ModItem::Const(id) => {
17581746
let it = &self.item_tree[id];

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

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -360,41 +360,28 @@ impl DefMap {
360360
let tree = loc.id.item_tree(db);
361361
let current_def_map =
362362
self.krate == loc.container.krate && self.block_id() == loc.container.block;
363+
let def_map;
363364
let res = if current_def_map {
364-
self.modules[loc.container.local_id].scope.enums[&e].iter().find_map(
365-
|&variant| {
366-
let variant_data = &tree[variant.lookup(db).id.value];
367-
(variant_data.name == *segment).then(|| match variant_data.fields {
368-
Fields::Record(_) => {
369-
PerNs::types(variant.into(), Visibility::Public, None)
370-
}
371-
Fields::Tuple(_) | Fields::Unit => PerNs::both(
372-
variant.into(),
373-
variant.into(),
374-
Visibility::Public,
375-
None,
376-
),
377-
})
378-
},
379-
)
365+
&self.enum_definitions[&e]
380366
} else {
381-
loc.container.def_map(db).modules[loc.container.local_id].scope.enums[&e]
382-
.iter()
383-
.find_map(|&variant| {
384-
let variant_data = &tree[variant.lookup(db).id.value];
385-
(variant_data.name == *segment).then(|| match variant_data.fields {
386-
Fields::Record(_) => {
387-
PerNs::types(variant.into(), Visibility::Public, None)
388-
}
389-
Fields::Tuple(_) | Fields::Unit => PerNs::both(
390-
variant.into(),
391-
variant.into(),
392-
Visibility::Public,
393-
None,
394-
),
395-
})
396-
})
397-
};
367+
def_map = loc.container.def_map(db);
368+
&def_map.enum_definitions[&e]
369+
}
370+
.iter()
371+
.find_map(|&variant| {
372+
let variant_data = &tree[variant.lookup(db).id.value];
373+
(variant_data.name == *segment).then(|| match variant_data.fields {
374+
Fields::Record(_) => {
375+
PerNs::types(variant.into(), Visibility::Public, None)
376+
}
377+
Fields::Tuple(_) | Fields::Unit => PerNs::both(
378+
variant.into(),
379+
variant.into(),
380+
Visibility::Public,
381+
None,
382+
),
383+
})
384+
});
398385
match res {
399386
Some(res) => res,
400387
None => {

crates/hir/src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,11 @@ impl Module {
584584
Adt::Enum(e) => {
585585
for v in e.variants(db) {
586586
acc.extend(ModuleDef::Variant(v).diagnostics(db));
587-
for diag in db.enum_variant_data_with_diagnostics(v.id).1.iter() {
588-
emit_def_diagnostic(db, acc, diag);
587+
if let Some(diags) = &db.enum_variant_data_with_diagnostics(v.id).1
588+
{
589+
for diag in &***diags {
590+
emit_def_diagnostic(db, acc, diag);
591+
}
589592
}
590593
}
591594
}

crates/hir/src/semantics/source_to_def.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ impl SourceToDefCtx<'_, '_> {
201201
&mut self,
202202
src: InFile<ast::Variant>,
203203
) -> Option<EnumVariantId> {
204-
self.to_def(src, keys::VARIANT)
204+
self.to_def(src, keys::ENUM_VARIANT)
205205
}
206206
pub(super) fn extern_crate_to_def(
207207
&mut self,

0 commit comments

Comments
 (0)