Skip to content

Commit 6ff5188

Browse files
committed
Fix missing inactive code diagnostics for fields
1 parent 7e7ff86 commit 6ff5188

File tree

3 files changed

+34
-33
lines changed

3 files changed

+34
-33
lines changed

crates/hir-def/src/expr_store.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ pub struct ExpressionStoreSourceMap {
142142

143143
/// Diagnostics accumulated during lowering. These contain `AstPtr`s and so are stored in
144144
/// the source map (since they're just as volatile).
145-
diagnostics: Vec<ExpressionStoreDiagnostics>,
145+
pub diagnostics: Vec<ExpressionStoreDiagnostics>,
146146
}
147147

148148
/// The body of an item (function, const etc.).

crates/hir-def/src/signatures.rs

+33-30
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use hir_expand::{InFile, Lookup, name::Name};
66
use intern::{Symbol, sym};
77
use la_arena::{Arena, Idx};
88
use rustc_abi::{IntegerType, ReprOptions};
9-
use syntax::ast::{self, HasGenericParams, IsString};
9+
use syntax::{
10+
AstNode, SyntaxNodePtr,
11+
ast::{self, HasGenericParams, IsString},
12+
};
1013
use triomphe::Arc;
1114

1215
use crate::{
@@ -23,10 +26,9 @@ use crate::{
2326
hir::{ExprId, PatId, generics::GenericParams},
2427
item_tree::{
2528
AttrOwner, Field, FieldParent, FieldsShape, ItemTree, ModItem, RawVisibility,
26-
RawVisibilityId, TreeId,
29+
RawVisibilityId,
2730
},
2831
lang_item::LangItem,
29-
nameres::diagnostics::DefDiagnostic,
3032
src::HasSource,
3133
type_ref::{TraitRef, TypeBound, TypeRef, TypeRefId},
3234
};
@@ -732,8 +734,7 @@ impl VariantFields {
732734
db: &dyn DefDatabase,
733735
id: VariantId,
734736
) -> (Arc<Self>, Arc<ExpressionStoreSourceMap>) {
735-
// FIXME: Report def diagnostics
736-
let (shape, (fields, store, source_map, _diagnostics)) = match id {
737+
let (shape, (fields, store, source_map)) = match id {
737738
VariantId::EnumVariantId(id) => {
738739
let loc = id.lookup(db);
739740
let item_tree = loc.id.item_tree(db);
@@ -744,7 +745,6 @@ impl VariantFields {
744745
lower_fields(
745746
db,
746747
parent.container,
747-
loc.id.tree_id(),
748748
&item_tree,
749749
FieldParent::EnumVariant(loc.id.value),
750750
loc.source(db).map(|src| {
@@ -753,12 +753,14 @@ impl VariantFields {
753753
.map(|it| {
754754
match it {
755755
ast::FieldList::RecordFieldList(record_field_list) => {
756-
Either::Left(
757-
record_field_list.fields().map(|it| it.ty()),
758-
)
756+
Either::Left(record_field_list.fields().map(|it| {
757+
(SyntaxNodePtr::new(it.syntax()), it.ty())
758+
}))
759759
}
760760
ast::FieldList::TupleFieldList(field_list) => {
761-
Either::Right(field_list.fields().map(|it| it.ty()))
761+
Either::Right(field_list.fields().map(|it| {
762+
(SyntaxNodePtr::new(it.syntax()), it.ty())
763+
}))
762764
}
763765
}
764766
.into_iter()
@@ -780,7 +782,6 @@ impl VariantFields {
780782
lower_fields(
781783
db,
782784
loc.container,
783-
loc.id.tree_id(),
784785
&item_tree,
785786
FieldParent::Struct(loc.id.value),
786787
loc.source(db).map(|src| {
@@ -789,12 +790,14 @@ impl VariantFields {
789790
.map(|it| {
790791
match it {
791792
ast::FieldList::RecordFieldList(record_field_list) => {
792-
Either::Left(
793-
record_field_list.fields().map(|it| it.ty()),
794-
)
793+
Either::Left(record_field_list.fields().map(|it| {
794+
(SyntaxNodePtr::new(it.syntax()), it.ty())
795+
}))
795796
}
796797
ast::FieldList::TupleFieldList(field_list) => {
797-
Either::Right(field_list.fields().map(|it| it.ty()))
798+
Either::Right(field_list.fields().map(|it| {
799+
(SyntaxNodePtr::new(it.syntax()), it.ty())
800+
}))
798801
}
799802
}
800803
.into_iter()
@@ -816,13 +819,15 @@ impl VariantFields {
816819
lower_fields(
817820
db,
818821
loc.container,
819-
loc.id.tree_id(),
820822
&item_tree,
821823
FieldParent::Union(loc.id.value),
822824
loc.source(db).map(|src| {
823825
union.fields.iter().zip(
824826
src.record_field_list()
825-
.map(|it| it.fields().map(|it| it.ty()))
827+
.map(|it| {
828+
it.fields()
829+
.map(|it| (SyntaxNodePtr::new(it.syntax()), it.ty()))
830+
})
826831
.into_iter()
827832
.flatten(),
828833
)
@@ -852,17 +857,15 @@ impl VariantFields {
852857
fn lower_fields<'a>(
853858
db: &dyn DefDatabase,
854859
module: ModuleId,
855-
tree_id: TreeId,
856860
item_tree: &ItemTree,
857861
parent: FieldParent,
858-
fields: InFile<impl Iterator<Item = (&'a Field, Option<ast::Type>)>>,
862+
fields: InFile<impl Iterator<Item = (&'a Field, (SyntaxNodePtr, Option<ast::Type>))>>,
859863
override_visibility: Option<RawVisibilityId>,
860-
) -> (Arena<FieldData>, ExpressionStore, ExpressionStoreSourceMap, Vec<DefDiagnostic>) {
861-
let mut diagnostics = Vec::new();
864+
) -> (Arena<FieldData>, ExpressionStore, ExpressionStoreSourceMap) {
862865
let mut arena = Arena::new();
863866
let cfg_options = module.krate.cfg_options(db);
864867
let mut col = ExprCollector::new(db, module, fields.file_id);
865-
for (idx, (field, ty)) in fields.value.enumerate() {
868+
for (idx, (field, (ptr, ty))) in fields.value.enumerate() {
866869
let attr_owner = AttrOwner::make_field_indexed(parent, idx);
867870
let attrs = item_tree.attrs(db, module.krate, attr_owner);
868871
if attrs.is_cfg_enabled(cfg_options) {
@@ -873,17 +876,17 @@ fn lower_fields<'a>(
873876
is_unsafe: field.is_unsafe,
874877
});
875878
} else {
876-
diagnostics.push(DefDiagnostic::unconfigured_code(
877-
module.local_id,
878-
tree_id,
879-
attr_owner,
880-
attrs.cfg().unwrap(),
881-
cfg_options.clone(),
882-
))
879+
col.source_map.diagnostics.push(
880+
crate::expr_store::ExpressionStoreDiagnostics::InactiveCode {
881+
node: InFile::new(fields.file_id, ptr),
882+
cfg: attrs.cfg().unwrap(),
883+
opts: cfg_options.clone(),
884+
},
885+
);
883886
}
884887
}
885888
let store = col.store.finish();
886-
(arena, store, col.source_map, diagnostics)
889+
(arena, store, col.source_map)
887890
}
888891

889892
#[derive(Debug, Clone, PartialEq, Eq)]

crates/ide-diagnostics/src/handlers/inactive_code.rs

-2
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,6 @@ trait Bar {
146146
}
147147

148148
#[test]
149-
// FIXME
150-
#[should_panic]
151149
fn inactive_fields_and_variants() {
152150
check(
153151
r#"

0 commit comments

Comments
 (0)