|
1 | | -use hir::{db::AstDatabase, diagnostics::IncorrectCase, InFile, Semantics}; |
2 | | -use ide_assists::{Assist, AssistResolveStrategy}; |
3 | | -use ide_db::{base_db::FilePosition, RootDatabase}; |
| 1 | +use hir::{db::AstDatabase, InFile}; |
| 2 | +use ide_assists::Assist; |
| 3 | +use ide_db::base_db::FilePosition; |
4 | 4 | use syntax::AstNode; |
5 | 5 |
|
6 | 6 | use crate::{ |
7 | | - diagnostics::{unresolved_fix, DiagnosticWithFixes}, |
| 7 | + diagnostics::{unresolved_fix, Diagnostic, DiagnosticsContext}, |
8 | 8 | references::rename::rename_with_semantics, |
| 9 | + Severity, |
9 | 10 | }; |
10 | 11 |
|
11 | | -impl DiagnosticWithFixes for IncorrectCase { |
12 | | - fn fixes( |
13 | | - &self, |
14 | | - sema: &Semantics<RootDatabase>, |
15 | | - resolve: &AssistResolveStrategy, |
16 | | - ) -> Option<Vec<Assist>> { |
17 | | - let root = sema.db.parse_or_expand(self.file)?; |
18 | | - let name_node = self.ident.to_node(&root); |
19 | | - |
20 | | - let name_node = InFile::new(self.file, name_node.syntax()); |
21 | | - let frange = name_node.original_file_range(sema.db); |
22 | | - let file_position = FilePosition { file_id: frange.file_id, offset: frange.range.start() }; |
23 | | - |
24 | | - let label = format!("Rename to {}", self.suggested_text); |
25 | | - let mut res = unresolved_fix("change_case", &label, frange.range); |
26 | | - if resolve.should_resolve(&res.id) { |
27 | | - let source_change = rename_with_semantics(sema, file_position, &self.suggested_text); |
28 | | - res.source_change = Some(source_change.ok().unwrap_or_default()); |
29 | | - } |
30 | | - |
31 | | - Some(vec![res]) |
| 12 | +// Diagnostic: incorrect-ident-case |
| 13 | +// |
| 14 | +// This diagnostic is triggered if an item name doesn't follow https://doc.rust-lang.org/1.0.0/style/style/naming/README.html[Rust naming convention]. |
| 15 | +pub(super) fn incorrect_case(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCase) -> Diagnostic { |
| 16 | + Diagnostic::new( |
| 17 | + "incorrect-ident-case", |
| 18 | + format!( |
| 19 | + "{} `{}` should have {} name, e.g. `{}`", |
| 20 | + d.ident_type, d.ident_text, d.expected_case, d.suggested_text |
| 21 | + ), |
| 22 | + ctx.sema.diagnostics_display_range(InFile::new(d.file, d.ident.clone().into())).range, |
| 23 | + ) |
| 24 | + .severity(Severity::WeakWarning) |
| 25 | + .with_fixes(fixes(ctx, d)) |
| 26 | +} |
| 27 | + |
| 28 | +fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::IncorrectCase) -> Option<Vec<Assist>> { |
| 29 | + let root = ctx.sema.db.parse_or_expand(d.file)?; |
| 30 | + let name_node = d.ident.to_node(&root); |
| 31 | + |
| 32 | + let name_node = InFile::new(d.file, name_node.syntax()); |
| 33 | + let frange = name_node.original_file_range(ctx.sema.db); |
| 34 | + let file_position = FilePosition { file_id: frange.file_id, offset: frange.range.start() }; |
| 35 | + |
| 36 | + let label = format!("Rename to {}", d.suggested_text); |
| 37 | + let mut res = unresolved_fix("change_case", &label, frange.range); |
| 38 | + if ctx.resolve.should_resolve(&res.id) { |
| 39 | + let source_change = rename_with_semantics(&ctx.sema, file_position, &d.suggested_text); |
| 40 | + res.source_change = Some(source_change.ok().unwrap_or_default()); |
32 | 41 | } |
| 42 | + |
| 43 | + Some(vec![res]) |
33 | 44 | } |
34 | 45 |
|
35 | 46 | #[cfg(test)] |
|
0 commit comments