diff options
Diffstat (limited to 'crates/ide')
-rw-r--r-- | crates/ide/src/diagnostics.rs | 3 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/fixes.rs | 26 |
2 files changed, 23 insertions, 6 deletions
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs index c8453edb3..9157704dc 100644 --- a/crates/ide/src/diagnostics.rs +++ b/crates/ide/src/diagnostics.rs | |||
@@ -131,6 +131,9 @@ pub(crate) fn diagnostics( | |||
131 | .on::<hir::diagnostics::NoSuchField, _>(|d| { | 131 | .on::<hir::diagnostics::NoSuchField, _>(|d| { |
132 | res.borrow_mut().push(diagnostic_with_fix(d, &sema)); | 132 | res.borrow_mut().push(diagnostic_with_fix(d, &sema)); |
133 | }) | 133 | }) |
134 | .on::<hir::diagnostics::RemoveThisSemicolon, _>(|d| { | ||
135 | res.borrow_mut().push(diagnostic_with_fix(d, &sema)); | ||
136 | }) | ||
134 | .on::<hir::diagnostics::IncorrectCase, _>(|d| { | 137 | .on::<hir::diagnostics::IncorrectCase, _>(|d| { |
135 | res.borrow_mut().push(warning_with_fix(d, &sema)); | 138 | res.borrow_mut().push(warning_with_fix(d, &sema)); |
136 | }) | 139 | }) |
diff --git a/crates/ide/src/diagnostics/fixes.rs b/crates/ide/src/diagnostics/fixes.rs index d275dd75b..cb4d49ad9 100644 --- a/crates/ide/src/diagnostics/fixes.rs +++ b/crates/ide/src/diagnostics/fixes.rs | |||
@@ -4,7 +4,7 @@ use hir::{ | |||
4 | db::AstDatabase, | 4 | db::AstDatabase, |
5 | diagnostics::{ | 5 | diagnostics::{ |
6 | Diagnostic, IncorrectCase, MissingFields, MissingOkInTailExpr, NoSuchField, | 6 | Diagnostic, IncorrectCase, MissingFields, MissingOkInTailExpr, NoSuchField, |
7 | UnresolvedModule, | 7 | RemoveThisSemicolon, UnresolvedModule, |
8 | }, | 8 | }, |
9 | HasSource, HirDisplay, Semantics, VariantDef, | 9 | HasSource, HirDisplay, Semantics, VariantDef, |
10 | }; | 10 | }; |
@@ -13,11 +13,7 @@ use ide_db::{ | |||
13 | source_change::{FileSystemEdit, SourceFileEdit}, | 13 | source_change::{FileSystemEdit, SourceFileEdit}, |
14 | RootDatabase, | 14 | RootDatabase, |
15 | }; | 15 | }; |
16 | use syntax::{ | 16 | use syntax::{AstNode, Direction, T, algo, ast::{self, ExprStmt, edit::IndentLevel, make}}; |
17 | algo, | ||
18 | ast::{self, edit::IndentLevel, make}, | ||
19 | AstNode, | ||
20 | }; | ||
21 | use text_edit::TextEdit; | 17 | use text_edit::TextEdit; |
22 | 18 | ||
23 | use crate::{diagnostics::Fix, references::rename::rename_with_semantics, FilePosition}; | 19 | use crate::{diagnostics::Fix, references::rename::rename_with_semantics, FilePosition}; |
@@ -102,6 +98,24 @@ impl DiagnosticWithFix for MissingOkInTailExpr { | |||
102 | } | 98 | } |
103 | } | 99 | } |
104 | 100 | ||
101 | impl DiagnosticWithFix for RemoveThisSemicolon { | ||
102 | fn fix(&self, sema: &Semantics<RootDatabase>) -> Option<Fix> { | ||
103 | let root = sema.db.parse_or_expand(self.file)?; | ||
104 | |||
105 | let semicolon = self.expr.to_node(&root) | ||
106 | .syntax() | ||
107 | .siblings_with_tokens(Direction::Next) | ||
108 | .filter_map(|it| it.into_token()) | ||
109 | .find(|it| it.kind() == T![;])? | ||
110 | .text_range(); | ||
111 | |||
112 | let edit = TextEdit::delete(semicolon); | ||
113 | let source_change = SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(); | ||
114 | |||
115 | Some(Fix::new("Remove this semicolon", source_change, semicolon)) | ||
116 | } | ||
117 | } | ||
118 | |||
105 | impl DiagnosticWithFix for IncorrectCase { | 119 | impl DiagnosticWithFix for IncorrectCase { |
106 | fn fix(&self, sema: &Semantics<RootDatabase>) -> Option<Fix> { | 120 | fn fix(&self, sema: &Semantics<RootDatabase>) -> Option<Fix> { |
107 | let root = sema.db.parse_or_expand(self.file)?; | 121 | let root = sema.db.parse_or_expand(self.file)?; |