Skip to content

Commit 1669344

Browse files
committed
Thinner DefDiagnostics
1 parent 2d72ec7 commit 1669344

File tree

6 files changed

+39
-29
lines changed

6 files changed

+39
-29
lines changed

crates/hir-def/src/data.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::{
1919
macro_call_as_call_id,
2020
nameres::{
2121
attr_resolution::ResolvedAttr,
22-
diagnostics::DefDiagnostic,
22+
diagnostics::{DefDiagnostic, DefDiagnostics},
2323
proc_macro::{parse_macro_name_and_helper_attrs, ProcMacroKind},
2424
DefMap, MacroSubNs,
2525
},
@@ -240,7 +240,7 @@ impl TraitData {
240240
pub(crate) fn trait_data_with_diagnostics_query(
241241
db: &dyn DefDatabase,
242242
tr: TraitId,
243-
) -> (Arc<TraitData>, Arc<[DefDiagnostic]>) {
243+
) -> (Arc<TraitData>, DefDiagnostics) {
244244
let tr_loc @ ItemLoc { container: module_id, id: tree_id } = tr.lookup(db);
245245
let item_tree = tree_id.item_tree(db);
246246
let tr_def = &item_tree[tree_id.value];
@@ -274,7 +274,7 @@ impl TraitData {
274274
rustc_has_incoherent_inherent_impls,
275275
fundamental,
276276
}),
277-
diagnostics.into(),
277+
DefDiagnostics::new(diagnostics),
278278
)
279279
}
280280

@@ -340,7 +340,7 @@ impl ImplData {
340340
pub(crate) fn impl_data_with_diagnostics_query(
341341
db: &dyn DefDatabase,
342342
id: ImplId,
343-
) -> (Arc<ImplData>, Arc<[DefDiagnostic]>) {
343+
) -> (Arc<ImplData>, DefDiagnostics) {
344344
let _p = profile::span("impl_data_with_diagnostics_query");
345345
let ItemLoc { container: module_id, id: tree_id } = id.lookup(db);
346346

@@ -367,7 +367,7 @@ impl ImplData {
367367
is_unsafe,
368368
attribute_calls,
369369
}),
370-
diagnostics.into(),
370+
DefDiagnostics::new(diagnostics),
371371
)
372372
}
373373

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::{
2121
item_tree::{AttrOwner, Field, FieldAstId, Fields, ItemTree, ModItem, RawVisibilityId},
2222
lang_item::LangItem,
2323
lower::LowerCtx,
24-
nameres::diagnostics::DefDiagnostic,
24+
nameres::diagnostics::{DefDiagnostic, DefDiagnostics},
2525
src::HasChildSource,
2626
src::HasSource,
2727
trace::Trace,
@@ -187,7 +187,7 @@ impl StructData {
187187
pub(crate) fn struct_data_with_diagnostics_query(
188188
db: &dyn DefDatabase,
189189
id: StructId,
190-
) -> (Arc<StructData>, Arc<[DefDiagnostic]>) {
190+
) -> (Arc<StructData>, DefDiagnostics) {
191191
let loc = id.lookup(db);
192192
let krate = loc.container.krate;
193193
let item_tree = loc.id.item_tree(db);
@@ -232,7 +232,7 @@ impl StructData {
232232
visibility: item_tree[strukt.visibility].clone(),
233233
flags,
234234
}),
235-
diagnostics.into(),
235+
DefDiagnostics::new(diagnostics),
236236
)
237237
}
238238

@@ -243,7 +243,7 @@ impl StructData {
243243
pub(crate) fn union_data_with_diagnostics_query(
244244
db: &dyn DefDatabase,
245245
id: UnionId,
246-
) -> (Arc<StructData>, Arc<[DefDiagnostic]>) {
246+
) -> (Arc<StructData>, DefDiagnostics) {
247247
let loc = id.lookup(db);
248248
let krate = loc.container.krate;
249249
let item_tree = loc.id.item_tree(db);
@@ -278,7 +278,7 @@ impl StructData {
278278
visibility: item_tree[union.visibility].clone(),
279279
flags,
280280
}),
281-
diagnostics.into(),
281+
DefDiagnostics::new(diagnostics),
282282
)
283283
}
284284
}
@@ -332,14 +332,14 @@ impl EnumVariantData {
332332
pub(crate) fn enum_variant_data_with_diagnostics_query(
333333
db: &dyn DefDatabase,
334334
e: EnumVariantId,
335-
) -> (Arc<EnumVariantData>, Option<Arc<Box<[DefDiagnostic]>>>) {
335+
) -> (Arc<EnumVariantData>, DefDiagnostics) {
336336
let loc = e.lookup(db);
337337
let krate = loc.container.krate;
338338
let item_tree = loc.id.item_tree(db);
339339
let cfg_options = db.crate_graph()[krate].cfg_options.clone();
340340
let variant = &item_tree[loc.id.value];
341341

342-
let (var_data, field_diagnostics) = lower_fields(
342+
let (var_data, diagnostics) = lower_fields(
343343
db,
344344
krate,
345345
loc.id.file_id(),
@@ -355,11 +355,7 @@ impl EnumVariantData {
355355
name: variant.name.clone(),
356356
variant_data: Arc::new(var_data),
357357
}),
358-
if field_diagnostics.is_empty() {
359-
None
360-
} else {
361-
Some(Arc::new(field_diagnostics.into_boxed_slice()))
362-
},
358+
DefDiagnostics::new(diagnostics),
363359
)
364360
}
365361
}

crates/hir-def/src/db.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::{
1919
import_map::ImportMap,
2020
item_tree::{AttrOwner, ItemTree},
2121
lang_item::{self, LangItem, LangItemTarget, LangItems},
22-
nameres::{diagnostics::DefDiagnostic, DefMap},
22+
nameres::{diagnostics::DefDiagnostics, DefMap},
2323
visibility::{self, Visibility},
2424
AttrDefId, BlockId, BlockLoc, ConstBlockId, ConstBlockLoc, ConstId, ConstLoc, DefWithBodyId,
2525
EnumId, EnumLoc, EnumVariantId, EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId,
@@ -121,14 +121,13 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
121121
fn struct_data(&self, id: StructId) -> Arc<StructData>;
122122

123123
#[salsa::invoke(StructData::struct_data_with_diagnostics_query)]
124-
fn struct_data_with_diagnostics(&self, id: StructId)
125-
-> (Arc<StructData>, Arc<[DefDiagnostic]>);
124+
fn struct_data_with_diagnostics(&self, id: StructId) -> (Arc<StructData>, DefDiagnostics);
126125

127126
#[salsa::invoke(StructData::union_data_query)]
128127
fn union_data(&self, id: UnionId) -> Arc<StructData>;
129128

130129
#[salsa::invoke(StructData::union_data_with_diagnostics_query)]
131-
fn union_data_with_diagnostics(&self, id: UnionId) -> (Arc<StructData>, Arc<[DefDiagnostic]>);
130+
fn union_data_with_diagnostics(&self, id: UnionId) -> (Arc<StructData>, DefDiagnostics);
132131

133132
#[salsa::invoke(EnumData::enum_data_query)]
134133
fn enum_data(&self, e: EnumId) -> Arc<EnumData>;
@@ -140,19 +139,19 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
140139
fn enum_variant_data_with_diagnostics(
141140
&self,
142141
id: EnumVariantId,
143-
) -> (Arc<EnumVariantData>, Option<Arc<Box<[DefDiagnostic]>>>);
142+
) -> (Arc<EnumVariantData>, DefDiagnostics);
144143

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

148147
#[salsa::invoke(ImplData::impl_data_with_diagnostics_query)]
149-
fn impl_data_with_diagnostics(&self, e: ImplId) -> (Arc<ImplData>, Arc<[DefDiagnostic]>);
148+
fn impl_data_with_diagnostics(&self, e: ImplId) -> (Arc<ImplData>, DefDiagnostics);
150149

151150
#[salsa::invoke(TraitData::trait_data_query)]
152151
fn trait_data(&self, e: TraitId) -> Arc<TraitData>;
153152

154153
#[salsa::invoke(TraitData::trait_data_with_diagnostics_query)]
155-
fn trait_data_with_diagnostics(&self, tr: TraitId) -> (Arc<TraitData>, Arc<[DefDiagnostic]>);
154+
fn trait_data_with_diagnostics(&self, tr: TraitId) -> (Arc<TraitData>, DefDiagnostics);
156155

157156
#[salsa::invoke(TraitAliasData::trait_alias_query)]
158157
fn trait_alias_data(&self, e: TraitAliasId) -> Arc<TraitAliasData>;

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,23 @@ pub enum DefDiagnosticKind {
4040
MacroDefError { ast: AstId<ast::Macro>, message: String },
4141
}
4242

43+
#[derive(Clone, Debug, PartialEq, Eq)]
44+
pub struct DefDiagnostics(Option<triomphe::Arc<Box<[DefDiagnostic]>>>);
45+
46+
impl DefDiagnostics {
47+
pub fn new(diagnostics: Vec<DefDiagnostic>) -> Self {
48+
Self(if diagnostics.is_empty() {
49+
None
50+
} else {
51+
Some(triomphe::Arc::new(diagnostics.into_boxed_slice()))
52+
})
53+
}
54+
55+
pub fn iter(&self) -> impl Iterator<Item = &DefDiagnostic> {
56+
self.0.as_ref().into_iter().flat_map(|it| &***it)
57+
}
58+
}
59+
4360
#[derive(Debug, PartialEq, Eq)]
4461
pub struct DefDiagnostic {
4562
pub in_module: LocalModuleId,

crates/hir-ty/src/mir/lower.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ struct MirLowerCtx<'a> {
6969
drop_scopes: Vec<DropScope>,
7070
}
7171

72+
// FIXME: Make this smaller, its stored in database queries
7273
#[derive(Debug, Clone, PartialEq, Eq)]
7374
pub enum MirLowerError {
7475
ConstEvalError(Box<str>, Box<ConstEvalError>),

crates/hir/src/lib.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -584,11 +584,8 @@ impl Module {
584584
Adt::Enum(e) => {
585585
for v in e.variants(db) {
586586
acc.extend(ModuleDef::Variant(v).diagnostics(db));
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-
}
587+
for diag in db.enum_variant_data_with_diagnostics(v.id).1.iter() {
588+
emit_def_diagnostic(db, acc, diag);
592589
}
593590
}
594591
}

0 commit comments

Comments
 (0)