diff options
| author | Maybe Waffle <waffle.lapkin@gmail.com> | 2023-12-06 22:11:16 +0000 |
|---|---|---|
| committer | Maybe Waffle <waffle.lapkin@gmail.com> | 2023-12-10 22:21:59 +0000 |
| commit | 1630477985097fcc9457dbd5f11b75ddb52bfe5b (patch) | |
| tree | 73a7385ae8529cad0e1a28cc262e5c6d20a8c7f1 | |
| parent | 6557151dca7e76832ff770caf1293f3062ea98e9 (diff) | |
| download | rust-1630477985097fcc9457dbd5f11b75ddb52bfe5b.tar.gz rust-1630477985097fcc9457dbd5f11b75ddb52bfe5b.zip | |
fix: Don't emit "missing items" diagnostic for negative impls
| -rw-r--r-- | crates/hir/src/lib.rs | 3 | ||||
| -rw-r--r-- | crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs | 14 |
2 files changed, 16 insertions, 1 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 4a0c384e8a3..a5281ec32bb 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -671,7 +671,8 @@ impl Module { _ => (), }; - if let Some(trait_) = trait_ { + // Negative impls can't have items, don't emit missing items diagnostic for them + if let (false, Some(trait_)) = (impl_is_negative, trait_) { 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(), 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 51923797ac9..56188cddf0b 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 @@ -112,4 +112,18 @@ impl Trait for () { "#, ); } + + #[test] + fn negative_impl() { + check_diagnostics( + r#" +trait Trait { + fn item(); +} + +// Negative impls don't require any items (in fact, the forbid providing any) +impl !Trait for () {} +"#, + ) + } } |
