diff options
-rw-r--r-- | crates/hir/src/diagnostics.rs | 2 | ||||
-rw-r--r-- | crates/hir_ty/src/diagnostics/expr.rs | 17 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/fixes.rs | 13 |
3 files changed, 24 insertions, 8 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index 0f2ed4bb1..b1c924167 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs | |||
@@ -5,5 +5,5 @@ pub use hir_expand::diagnostics::{ | |||
5 | }; | 5 | }; |
6 | pub use hir_ty::diagnostics::{ | 6 | pub use hir_ty::diagnostics::{ |
7 | IncorrectCase, MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkInTailExpr, | 7 | IncorrectCase, MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkInTailExpr, |
8 | NoSuchField, RemoveThisSemicolon | 8 | NoSuchField, RemoveThisSemicolon, |
9 | }; | 9 | }; |
diff --git a/crates/hir_ty/src/diagnostics/expr.rs b/crates/hir_ty/src/diagnostics/expr.rs index 6ec15c180..98b3cade2 100644 --- a/crates/hir_ty/src/diagnostics/expr.rs +++ b/crates/hir_ty/src/diagnostics/expr.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | 2 | ||
3 | use std::sync::Arc; | 3 | use std::sync::Arc; |
4 | 4 | ||
5 | use hir_def::{AdtId, DefWithBodyId, expr::Statement, path::path, resolver::HasResolver}; | 5 | use hir_def::{expr::Statement, path::path, resolver::HasResolver, AdtId, DefWithBodyId}; |
6 | use hir_expand::diagnostics::DiagnosticSink; | 6 | use hir_expand::diagnostics::DiagnosticSink; |
7 | use rustc_hash::FxHashSet; | 7 | use rustc_hash::FxHashSet; |
8 | use syntax::{ast, AstPtr}; | 8 | use syntax::{ast, AstPtr}; |
@@ -11,7 +11,8 @@ use crate::{ | |||
11 | db::HirDatabase, | 11 | db::HirDatabase, |
12 | diagnostics::{ | 12 | diagnostics::{ |
13 | match_check::{is_useful, MatchCheckCtx, Matrix, PatStack, Usefulness}, | 13 | match_check::{is_useful, MatchCheckCtx, Matrix, PatStack, Usefulness}, |
14 | MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkInTailExpr, MissingPatFields, RemoveThisSemicolon | 14 | MismatchedArgCount, MissingFields, MissingMatchArms, MissingOkInTailExpr, MissingPatFields, |
15 | RemoveThisSemicolon, | ||
15 | }, | 16 | }, |
16 | utils::variant_data, | 17 | utils::variant_data, |
17 | ApplicationTy, InferenceResult, Ty, TypeCtor, | 18 | ApplicationTy, InferenceResult, Ty, TypeCtor, |
@@ -324,7 +325,12 @@ impl<'a, 'b> ExprValidator<'a, 'b> { | |||
324 | } | 325 | } |
325 | } | 326 | } |
326 | 327 | ||
327 | fn validate_missing_tail_expr(&mut self, body_id: ExprId, possible_tail_id: ExprId, db: &dyn HirDatabase) { | 328 | fn validate_missing_tail_expr( |
329 | &mut self, | ||
330 | body_id: ExprId, | ||
331 | possible_tail_id: ExprId, | ||
332 | db: &dyn HirDatabase, | ||
333 | ) { | ||
328 | let mismatch = match self.infer.type_mismatch_for_expr(body_id) { | 334 | let mismatch = match self.infer.type_mismatch_for_expr(body_id) { |
329 | Some(m) => m, | 335 | Some(m) => m, |
330 | None => return, | 336 | None => return, |
@@ -335,7 +341,10 @@ impl<'a, 'b> ExprValidator<'a, 'b> { | |||
335 | let (_, source_map) = db.body_with_source_map(self.owner.into()); | 341 | let (_, source_map) = db.body_with_source_map(self.owner.into()); |
336 | 342 | ||
337 | if let Ok(source_ptr) = source_map.expr_syntax(possible_tail_id) { | 343 | if let Ok(source_ptr) = source_map.expr_syntax(possible_tail_id) { |
338 | self.sink.push(RemoveThisSemicolon { file: source_ptr.file_id, expr: source_ptr.value }); | 344 | self.sink.push(RemoveThisSemicolon { |
345 | file: source_ptr.file_id, | ||
346 | expr: source_ptr.value, | ||
347 | }); | ||
339 | } | 348 | } |
340 | } | 349 | } |
341 | } | 350 | } |
diff --git a/crates/ide/src/diagnostics/fixes.rs b/crates/ide/src/diagnostics/fixes.rs index 7b05e87f2..c235b5bf4 100644 --- a/crates/ide/src/diagnostics/fixes.rs +++ b/crates/ide/src/diagnostics/fixes.rs | |||
@@ -13,7 +13,11 @@ use ide_db::{ | |||
13 | source_change::{FileSystemEdit, SourceFileEdit}, | 13 | source_change::{FileSystemEdit, SourceFileEdit}, |
14 | RootDatabase, | 14 | RootDatabase, |
15 | }; | 15 | }; |
16 | use syntax::{AstNode, Direction, T, algo, ast::{self, edit::IndentLevel, make}}; | 16 | use syntax::{ |
17 | algo, | ||
18 | ast::{self, edit::IndentLevel, make}, | ||
19 | AstNode, Direction, T, | ||
20 | }; | ||
17 | use text_edit::TextEdit; | 21 | use text_edit::TextEdit; |
18 | 22 | ||
19 | use crate::{diagnostics::Fix, references::rename::rename_with_semantics, FilePosition}; | 23 | use crate::{diagnostics::Fix, references::rename::rename_with_semantics, FilePosition}; |
@@ -102,7 +106,9 @@ impl DiagnosticWithFix for RemoveThisSemicolon { | |||
102 | fn fix(&self, sema: &Semantics<RootDatabase>) -> Option<Fix> { | 106 | fn fix(&self, sema: &Semantics<RootDatabase>) -> Option<Fix> { |
103 | let root = sema.db.parse_or_expand(self.file)?; | 107 | let root = sema.db.parse_or_expand(self.file)?; |
104 | 108 | ||
105 | let semicolon = self.expr.to_node(&root) | 109 | let semicolon = self |
110 | .expr | ||
111 | .to_node(&root) | ||
106 | .syntax() | 112 | .syntax() |
107 | .siblings_with_tokens(Direction::Next) | 113 | .siblings_with_tokens(Direction::Next) |
108 | .filter_map(|it| it.into_token()) | 114 | .filter_map(|it| it.into_token()) |
@@ -110,7 +116,8 @@ impl DiagnosticWithFix for RemoveThisSemicolon { | |||
110 | .text_range(); | 116 | .text_range(); |
111 | 117 | ||
112 | let edit = TextEdit::delete(semicolon); | 118 | let edit = TextEdit::delete(semicolon); |
113 | let source_change = SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(); | 119 | let source_change = |
120 | SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into(); | ||
114 | 121 | ||
115 | Some(Fix::new("Remove this semicolon", source_change, semicolon)) | 122 | Some(Fix::new("Remove this semicolon", source_change, semicolon)) |
116 | } | 123 | } |