diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ide/src/diagnostics.rs | 73 | ||||
-rw-r--r-- | crates/ide/src/diagnostics/field_shorthand.rs | 32 | ||||
-rw-r--r-- | crates/rust-analyzer/src/handlers.rs | 14 |
3 files changed, 55 insertions, 64 deletions
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs index 1e5ea4617..c92c1c066 100644 --- a/crates/ide/src/diagnostics.rs +++ b/crates/ide/src/diagnostics.rs | |||
@@ -31,6 +31,21 @@ pub struct Diagnostic { | |||
31 | pub range: TextRange, | 31 | pub range: TextRange, |
32 | pub severity: Severity, | 32 | pub severity: Severity, |
33 | pub fix: Option<Fix>, | 33 | pub fix: Option<Fix>, |
34 | pub unused: bool, | ||
35 | } | ||
36 | |||
37 | impl Diagnostic { | ||
38 | fn error(range: TextRange, message: String) -> Self { | ||
39 | Self { message, range, severity: Severity::Error, fix: None, unused: false } | ||
40 | } | ||
41 | |||
42 | fn hint(range: TextRange, message: String) -> Self { | ||
43 | Self { message, range, severity: Severity::WeakWarning, fix: None, unused: false } | ||
44 | } | ||
45 | |||
46 | fn with_fix(self, fix: Option<Fix>) -> Self { | ||
47 | Self { fix, ..self } | ||
48 | } | ||
34 | } | 49 | } |
35 | 50 | ||
36 | #[derive(Debug)] | 51 | #[derive(Debug)] |
@@ -71,13 +86,13 @@ pub(crate) fn diagnostics( | |||
71 | let mut res = Vec::new(); | 86 | let mut res = Vec::new(); |
72 | 87 | ||
73 | // [#34344] Only take first 128 errors to prevent slowing down editor/ide, the number 128 is chosen arbitrarily. | 88 | // [#34344] Only take first 128 errors to prevent slowing down editor/ide, the number 128 is chosen arbitrarily. |
74 | res.extend(parse.errors().iter().take(128).map(|err| Diagnostic { | 89 | res.extend( |
75 | // name: None, | 90 | parse |
76 | range: err.range(), | 91 | .errors() |
77 | message: format!("Syntax Error: {}", err), | 92 | .iter() |
78 | severity: Severity::Error, | 93 | .take(128) |
79 | fix: None, | 94 | .map(|err| Diagnostic::error(err.range(), format!("Syntax Error: {}", err))), |
80 | })); | 95 | ); |
81 | 96 | ||
82 | for node in parse.tree().syntax().descendants() { | 97 | for node in parse.tree().syntax().descendants() { |
83 | check_unnecessary_braces_in_use_statement(&mut res, file_id, &node); | 98 | check_unnecessary_braces_in_use_statement(&mut res, file_id, &node); |
@@ -108,13 +123,8 @@ pub(crate) fn diagnostics( | |||
108 | let mut sink = sink_builder | 123 | let mut sink = sink_builder |
109 | // Diagnostics not handled above get no fix and default treatment. | 124 | // Diagnostics not handled above get no fix and default treatment. |
110 | .build(|d| { | 125 | .build(|d| { |
111 | res.borrow_mut().push(Diagnostic { | 126 | res.borrow_mut() |
112 | // name: Some(d.name().into()), | 127 | .push(Diagnostic::error(sema.diagnostics_display_range(d).range, d.message())); |
113 | message: d.message(), | ||
114 | range: sema.diagnostics_display_range(d).range, | ||
115 | severity: Severity::Error, | ||
116 | fix: None, | ||
117 | }) | ||
118 | }); | 128 | }); |
119 | 129 | ||
120 | if let Some(m) = sema.to_module_def(file_id) { | 130 | if let Some(m) = sema.to_module_def(file_id) { |
@@ -125,22 +135,11 @@ pub(crate) fn diagnostics( | |||
125 | } | 135 | } |
126 | 136 | ||
127 | fn diagnostic_with_fix<D: DiagnosticWithFix>(d: &D, sema: &Semantics<RootDatabase>) -> Diagnostic { | 137 | fn diagnostic_with_fix<D: DiagnosticWithFix>(d: &D, sema: &Semantics<RootDatabase>) -> Diagnostic { |
128 | Diagnostic { | 138 | Diagnostic::error(sema.diagnostics_display_range(d).range, d.message()).with_fix(d.fix(&sema)) |
129 | // name: Some(d.name().into()), | ||
130 | range: sema.diagnostics_display_range(d).range, | ||
131 | message: d.message(), | ||
132 | severity: Severity::Error, | ||
133 | fix: d.fix(&sema), | ||
134 | } | ||
135 | } | 139 | } |
136 | 140 | ||
137 | fn warning_with_fix<D: DiagnosticWithFix>(d: &D, sema: &Semantics<RootDatabase>) -> Diagnostic { | 141 | fn warning_with_fix<D: DiagnosticWithFix>(d: &D, sema: &Semantics<RootDatabase>) -> Diagnostic { |
138 | Diagnostic { | 142 | Diagnostic::hint(sema.diagnostics_display_range(d).range, d.message()).with_fix(d.fix(&sema)) |
139 | range: sema.diagnostics_display_range(d).range, | ||
140 | message: d.message(), | ||
141 | severity: Severity::WeakWarning, | ||
142 | fix: d.fix(&sema), | ||
143 | } | ||
144 | } | 143 | } |
145 | 144 | ||
146 | fn check_unnecessary_braces_in_use_statement( | 145 | fn check_unnecessary_braces_in_use_statement( |
@@ -161,17 +160,14 @@ fn check_unnecessary_braces_in_use_statement( | |||
161 | edit_builder.finish() | 160 | edit_builder.finish() |
162 | }); | 161 | }); |
163 | 162 | ||
164 | acc.push(Diagnostic { | 163 | acc.push( |
165 | // name: None, | 164 | Diagnostic::hint(use_range, "Unnecessary braces in use statement".to_string()) |
166 | range: use_range, | 165 | .with_fix(Some(Fix::new( |
167 | message: "Unnecessary braces in use statement".to_string(), | 166 | "Remove unnecessary braces", |
168 | severity: Severity::WeakWarning, | 167 | SourceFileEdit { file_id, edit }.into(), |
169 | fix: Some(Fix::new( | 168 | use_range, |
170 | "Remove unnecessary braces", | 169 | ))), |
171 | SourceFileEdit { file_id, edit }.into(), | 170 | ); |
172 | use_range, | ||
173 | )), | ||
174 | }); | ||
175 | } | 171 | } |
176 | 172 | ||
177 | Some(()) | 173 | Some(()) |
@@ -578,6 +574,7 @@ fn test_fn() { | |||
578 | fix_trigger_range: 0..8, | 574 | fix_trigger_range: 0..8, |
579 | }, | 575 | }, |
580 | ), | 576 | ), |
577 | unused: false, | ||
581 | }, | 578 | }, |
582 | ] | 579 | ] |
583 | "#]], | 580 | "#]], |
diff --git a/crates/ide/src/diagnostics/field_shorthand.rs b/crates/ide/src/diagnostics/field_shorthand.rs index 2c4acd783..54e9fce9e 100644 --- a/crates/ide/src/diagnostics/field_shorthand.rs +++ b/crates/ide/src/diagnostics/field_shorthand.rs | |||
@@ -6,7 +6,7 @@ use ide_db::source_change::SourceFileEdit; | |||
6 | use syntax::{ast, match_ast, AstNode, SyntaxNode}; | 6 | use syntax::{ast, match_ast, AstNode, SyntaxNode}; |
7 | use text_edit::TextEdit; | 7 | use text_edit::TextEdit; |
8 | 8 | ||
9 | use crate::{Diagnostic, Fix, Severity}; | 9 | use crate::{Diagnostic, Fix}; |
10 | 10 | ||
11 | pub(super) fn check(acc: &mut Vec<Diagnostic>, file_id: FileId, node: &SyntaxNode) { | 11 | pub(super) fn check(acc: &mut Vec<Diagnostic>, file_id: FileId, node: &SyntaxNode) { |
12 | match_ast! { | 12 | match_ast! { |
@@ -46,17 +46,15 @@ fn check_expr_field_shorthand( | |||
46 | let edit = edit_builder.finish(); | 46 | let edit = edit_builder.finish(); |
47 | 47 | ||
48 | let field_range = record_field.syntax().text_range(); | 48 | let field_range = record_field.syntax().text_range(); |
49 | acc.push(Diagnostic { | 49 | acc.push( |
50 | // name: None, | 50 | Diagnostic::hint(field_range, "Shorthand struct initialization".to_string()).with_fix( |
51 | range: field_range, | 51 | Some(Fix::new( |
52 | message: "Shorthand struct initialization".to_string(), | 52 | "Use struct shorthand initialization", |
53 | severity: Severity::WeakWarning, | 53 | SourceFileEdit { file_id, edit }.into(), |
54 | fix: Some(Fix::new( | 54 | field_range, |
55 | "Use struct shorthand initialization", | 55 | )), |
56 | SourceFileEdit { file_id, edit }.into(), | 56 | ), |
57 | field_range, | 57 | ); |
58 | )), | ||
59 | }); | ||
60 | } | 58 | } |
61 | } | 59 | } |
62 | 60 | ||
@@ -88,17 +86,13 @@ fn check_pat_field_shorthand( | |||
88 | let edit = edit_builder.finish(); | 86 | let edit = edit_builder.finish(); |
89 | 87 | ||
90 | let field_range = record_pat_field.syntax().text_range(); | 88 | let field_range = record_pat_field.syntax().text_range(); |
91 | acc.push(Diagnostic { | 89 | acc.push(Diagnostic::hint(field_range, "Shorthand struct pattern".to_string()).with_fix( |
92 | // name: None, | 90 | Some(Fix::new( |
93 | range: field_range, | ||
94 | message: "Shorthand struct pattern".to_string(), | ||
95 | severity: Severity::WeakWarning, | ||
96 | fix: Some(Fix::new( | ||
97 | "Use struct field shorthand", | 91 | "Use struct field shorthand", |
98 | SourceFileEdit { file_id, edit }.into(), | 92 | SourceFileEdit { file_id, edit }.into(), |
99 | field_range, | 93 | field_range, |
100 | )), | 94 | )), |
101 | }); | 95 | )); |
102 | } | 96 | } |
103 | } | 97 | } |
104 | 98 | ||
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 215be850f..f2d57f986 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs | |||
@@ -16,12 +16,12 @@ use lsp_server::ErrorCode; | |||
16 | use lsp_types::{ | 16 | use lsp_types::{ |
17 | CallHierarchyIncomingCall, CallHierarchyIncomingCallsParams, CallHierarchyItem, | 17 | CallHierarchyIncomingCall, CallHierarchyIncomingCallsParams, CallHierarchyItem, |
18 | CallHierarchyOutgoingCall, CallHierarchyOutgoingCallsParams, CallHierarchyPrepareParams, | 18 | CallHierarchyOutgoingCall, CallHierarchyOutgoingCallsParams, CallHierarchyPrepareParams, |
19 | CodeActionKind, CodeLens, Command, CompletionItem, Diagnostic, DocumentFormattingParams, | 19 | CodeActionKind, CodeLens, Command, CompletionItem, Diagnostic, DiagnosticTag, |
20 | DocumentHighlight, DocumentSymbol, FoldingRange, FoldingRangeParams, HoverContents, Location, | 20 | DocumentFormattingParams, DocumentHighlight, DocumentSymbol, FoldingRange, FoldingRangeParams, |
21 | Position, PrepareRenameResponse, Range, RenameParams, SemanticTokensDeltaParams, | 21 | HoverContents, Location, Position, PrepareRenameResponse, Range, RenameParams, |
22 | SemanticTokensFullDeltaResult, SemanticTokensParams, SemanticTokensRangeParams, | 22 | SemanticTokensDeltaParams, SemanticTokensFullDeltaResult, SemanticTokensParams, |
23 | SemanticTokensRangeResult, SemanticTokensResult, SymbolInformation, SymbolTag, | 23 | SemanticTokensRangeParams, SemanticTokensRangeResult, SemanticTokensResult, SymbolInformation, |
24 | TextDocumentIdentifier, Url, WorkspaceEdit, | 24 | SymbolTag, TextDocumentIdentifier, Url, WorkspaceEdit, |
25 | }; | 25 | }; |
26 | use project_model::TargetKind; | 26 | use project_model::TargetKind; |
27 | use serde::{Deserialize, Serialize}; | 27 | use serde::{Deserialize, Serialize}; |
@@ -1124,7 +1124,7 @@ pub(crate) fn publish_diagnostics( | |||
1124 | source: Some("rust-analyzer".to_string()), | 1124 | source: Some("rust-analyzer".to_string()), |
1125 | message: d.message, | 1125 | message: d.message, |
1126 | related_information: None, | 1126 | related_information: None, |
1127 | tags: None, | 1127 | tags: if d.unused { Some(vec![DiagnosticTag::Unnecessary]) } else { None }, |
1128 | }) | 1128 | }) |
1129 | .collect(); | 1129 | .collect(); |
1130 | Ok(diagnostics) | 1130 | Ok(diagnostics) |