Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #15911 - Young-Flash:fix_missing_assoc_item, r=lnicola
fix: handle default constant values in `trait_impl_missing_assoc_item` diagnostic A patch of https://github.com/rust-lang/rust-analyzer/pull/15895, close https://github.com/rust-lang/rust-analyzer/issues/15909 cc `@Veykril`
bors 2023-11-21
parent 3751429 · parent cfc881a · commit 1a5cee1
-rw-r--r--crates/hir/src/lib.rs10
-rw-r--r--crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs13
2 files changed, 18 insertions, 5 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index bdc11aa356..1bfbf7212b 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -667,21 +667,21 @@ impl Module {
let items = &db.trait_data(trait_.into()).items;
let required_items = items.iter().filter(|&(_, assoc)| match *assoc {
AssocItemId::FunctionId(it) => !db.function_data(it).has_body(),
- AssocItemId::ConstId(_) => true,
+ AssocItemId::ConstId(id) => Const::from(id).value(db).is_none(),
AssocItemId::TypeAliasId(it) => db.type_alias_data(it).type_ref.is_none(),
});
- impl_assoc_items_scratch.extend(db.impl_data(impl_def.id).items.iter().map(
+ impl_assoc_items_scratch.extend(db.impl_data(impl_def.id).items.iter().filter_map(
|&item| {
- (
+ Some((
item,
match item {
AssocItemId::FunctionId(it) => db.function_data(it).name.clone(),
AssocItemId::ConstId(it) => {
- db.const_data(it).name.as_ref().unwrap().clone()
+ db.const_data(it).name.as_ref()?.clone()
}
AssocItemId::TypeAliasId(it) => db.type_alias_data(it).name.clone(),
},
- )
+ ))
},
));
diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs
index 40d0b6fdd4..51923797ac 100644
--- a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs
+++ b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs
@@ -36,6 +36,19 @@ mod tests {
use crate::tests::check_diagnostics;
#[test]
+ fn trait_with_default_value() {
+ check_diagnostics(
+ r#"
+trait Marker {
+ const FLAG: bool = false;
+}
+struct Foo;
+impl Marker for Foo {}
+ "#,
+ )
+ }
+
+ #[test]
fn simple() {
check_diagnostics(
r#"