diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/invalid_derive_target.rs')
-rw-r--r-- | src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/invalid_derive_target.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/invalid_derive_target.rs b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/invalid_derive_target.rs new file mode 100644 index 000000000..c779266bc --- /dev/null +++ b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/invalid_derive_target.rs @@ -0,0 +1,38 @@ +use crate::{Diagnostic, DiagnosticsContext, Severity}; + +// Diagnostic: invalid-derive-target +// +// This diagnostic is shown when the derive attribute is used on an item other than a `struct`, +// `enum` or `union`. +pub(crate) fn invalid_derive_target( + ctx: &DiagnosticsContext<'_>, + d: &hir::InvalidDeriveTarget, +) -> Diagnostic { + let display_range = ctx.sema.diagnostics_display_range(d.node.clone()).range; + + Diagnostic::new( + "invalid-derive-target", + "`derive` may only be applied to `struct`s, `enum`s and `union`s", + display_range, + ) + .severity(Severity::Error) +} + +#[cfg(test)] +mod tests { + use crate::tests::check_diagnostics; + + #[test] + fn fails_on_function() { + check_diagnostics( + r#" +//- minicore:derive +mod __ { + #[derive()] + //^^^^^^^^^^^ error: `derive` may only be applied to `struct`s, `enum`s and `union`s + fn main() {} +} + "#, + ); + } +} |