aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ide/src/diagnostics.rs84
-rw-r--r--crates/ide/src/diagnostics/field_shorthand.rs23
-rw-r--r--crates/ide/src/diagnostics/unresolved_module.rs12
-rw-r--r--crates/rust-analyzer/src/handlers.rs11
4 files changed, 51 insertions, 79 deletions
diff --git a/crates/ide/src/diagnostics.rs b/crates/ide/src/diagnostics.rs
index c024e3e1e..815a633e5 100644
--- a/crates/ide/src/diagnostics.rs
+++ b/crates/ide/src/diagnostics.rs
@@ -51,28 +51,26 @@ impl DiagnosticCode {
51 51
52#[derive(Debug)] 52#[derive(Debug)]
53pub struct Diagnostic { 53pub struct Diagnostic {
54 // pub name: Option<String>, 54 pub code: DiagnosticCode,
55 pub message: String, 55 pub message: String,
56 pub range: TextRange, 56 pub range: TextRange,
57 pub severity: Severity, 57 pub severity: Severity,
58 pub fixes: Option<Vec<Assist>>,
59 pub unused: bool, 58 pub unused: bool,
60 pub code: Option<DiagnosticCode>,
61 pub experimental: bool, 59 pub experimental: bool,
60 pub fixes: Option<Vec<Assist>>,
62} 61}
63 62
64impl Diagnostic { 63impl Diagnostic {
65 fn new(code: &'static str, message: impl Into<String>, range: TextRange) -> Diagnostic { 64 fn new(code: &'static str, message: impl Into<String>, range: TextRange) -> Diagnostic {
66 let message = message.into(); 65 let message = message.into();
67 let code = Some(DiagnosticCode(code)); 66 Diagnostic {
68 Self { 67 code: DiagnosticCode(code),
69 message, 68 message,
70 range, 69 range,
71 severity: Severity::Error, 70 severity: Severity::Error,
72 fixes: None,
73 unused: false, 71 unused: false,
74 code,
75 experimental: false, 72 experimental: false,
73 fixes: None,
76 } 74 }
77 } 75 }
78 76
@@ -86,36 +84,14 @@ impl Diagnostic {
86 self 84 self
87 } 85 }
88 86
89 fn error(range: TextRange, message: String) -> Self { 87 fn with_fixes(mut self, fixes: Option<Vec<Assist>>) -> Diagnostic {
90 Self { 88 self.fixes = fixes;
91 message, 89 self
92 range,
93 severity: Severity::Error,
94 fixes: None,
95 unused: false,
96 code: None,
97 experimental: false,
98 }
99 }
100
101 fn hint(range: TextRange, message: String) -> Self {
102 Self {
103 message,
104 range,
105 severity: Severity::WeakWarning,
106 fixes: None,
107 unused: false,
108 code: None,
109 experimental: false,
110 }
111 }
112
113 fn with_fixes(self, fixes: Option<Vec<Assist>>) -> Self {
114 Self { fixes, ..self }
115 } 90 }
116 91
117 fn with_unused(self, unused: bool) -> Self { 92 fn with_unused(mut self, unused: bool) -> Diagnostic {
118 Self { unused, ..self } 93 self.unused = unused;
94 self
119 } 95 }
120} 96}
121 97
@@ -150,11 +126,9 @@ pub(crate) fn diagnostics(
150 126
151 // [#34344] Only take first 128 errors to prevent slowing down editor/ide, the number 128 is chosen arbitrarily. 127 // [#34344] Only take first 128 errors to prevent slowing down editor/ide, the number 128 is chosen arbitrarily.
152 res.extend( 128 res.extend(
153 parse 129 parse.errors().iter().take(128).map(|err| {
154 .errors() 130 Diagnostic::new("syntax-error", format!("Syntax Error: {}", err), err.range())
155 .iter() 131 }),
156 .take(128)
157 .map(|err| Diagnostic::error(err.range(), format!("Syntax Error: {}", err))),
158 ); 132 );
159 133
160 for node in parse.tree().syntax().descendants() { 134 for node in parse.tree().syntax().descendants() {
@@ -205,15 +179,8 @@ pub(crate) fn diagnostics(
205 } 179 }
206 180
207 res.retain(|d| { 181 res.retain(|d| {
208 if let Some(code) = d.code { 182 !ctx.config.disabled.contains(d.code.as_str())
209 if ctx.config.disabled.contains(code.as_str()) { 183 && !(ctx.config.disable_experimental && d.experimental)
210 return false;
211 }
212 }
213 if ctx.config.disable_experimental && d.experimental {
214 return false;
215 }
216 true
217 }); 184 });
218 185
219 res 186 res
@@ -244,13 +211,18 @@ fn check_unnecessary_braces_in_use_statement(
244 }); 211 });
245 212
246 acc.push( 213 acc.push(
247 Diagnostic::hint(use_range, "Unnecessary braces in use statement".to_string()) 214 Diagnostic::new(
248 .with_fixes(Some(vec![fix( 215 "unnecessary-braces",
249 "remove_braces", 216 "Unnecessary braces in use statement".to_string(),
250 "Remove unnecessary braces", 217 use_range,
251 SourceChange::from_text_edit(file_id, edit), 218 )
252 use_range, 219 .severity(Severity::WeakWarning)
253 )])), 220 .with_fixes(Some(vec![fix(
221 "remove_braces",
222 "Remove unnecessary braces",
223 SourceChange::from_text_edit(file_id, edit),
224 use_range,
225 )])),
254 ); 226 );
255 } 227 }
256 228
diff --git a/crates/ide/src/diagnostics/field_shorthand.rs b/crates/ide/src/diagnostics/field_shorthand.rs
index e885a398e..c7f4dab8e 100644
--- a/crates/ide/src/diagnostics/field_shorthand.rs
+++ b/crates/ide/src/diagnostics/field_shorthand.rs
@@ -5,7 +5,7 @@ use ide_db::{base_db::FileId, source_change::SourceChange};
5use syntax::{ast, match_ast, AstNode, SyntaxNode}; 5use syntax::{ast, match_ast, AstNode, SyntaxNode};
6use text_edit::TextEdit; 6use text_edit::TextEdit;
7 7
8use crate::{diagnostics::fix, Diagnostic}; 8use crate::{diagnostics::fix, Diagnostic, Severity};
9 9
10pub(super) fn check(acc: &mut Vec<Diagnostic>, file_id: FileId, node: &SyntaxNode) { 10pub(super) fn check(acc: &mut Vec<Diagnostic>, file_id: FileId, node: &SyntaxNode) {
11 match_ast! { 11 match_ast! {
@@ -46,7 +46,8 @@ fn check_expr_field_shorthand(
46 46
47 let field_range = record_field.syntax().text_range(); 47 let field_range = record_field.syntax().text_range();
48 acc.push( 48 acc.push(
49 Diagnostic::hint(field_range, "Shorthand struct initialization".to_string()) 49 Diagnostic::new("use-field-shorthand", "Shorthand struct initialization", field_range)
50 .severity(Severity::WeakWarning)
50 .with_fixes(Some(vec![fix( 51 .with_fixes(Some(vec![fix(
51 "use_expr_field_shorthand", 52 "use_expr_field_shorthand",
52 "Use struct shorthand initialization", 53 "Use struct shorthand initialization",
@@ -85,14 +86,16 @@ fn check_pat_field_shorthand(
85 let edit = edit_builder.finish(); 86 let edit = edit_builder.finish();
86 87
87 let field_range = record_pat_field.syntax().text_range(); 88 let field_range = record_pat_field.syntax().text_range();
88 acc.push(Diagnostic::hint(field_range, "Shorthand struct pattern".to_string()).with_fixes( 89 acc.push(
89 Some(vec![fix( 90 Diagnostic::new("use-field-shorthand", "Shorthand struct pattern", field_range)
90 "use_pat_field_shorthand", 91 .severity(Severity::WeakWarning)
91 "Use struct field shorthand", 92 .with_fixes(Some(vec![fix(
92 SourceChange::from_text_edit(file_id, edit), 93 "use_pat_field_shorthand",
93 field_range, 94 "Use struct field shorthand",
94 )]), 95 SourceChange::from_text_edit(file_id, edit),
95 )); 96 field_range,
97 )])),
98 );
96 } 99 }
97} 100}
98 101
diff --git a/crates/ide/src/diagnostics/unresolved_module.rs b/crates/ide/src/diagnostics/unresolved_module.rs
index b1da8f0e1..977b46414 100644
--- a/crates/ide/src/diagnostics/unresolved_module.rs
+++ b/crates/ide/src/diagnostics/unresolved_module.rs
@@ -65,9 +65,14 @@ mod baz {}
65 expect![[r#" 65 expect![[r#"
66 [ 66 [
67 Diagnostic { 67 Diagnostic {
68 code: DiagnosticCode(
69 "unresolved-module",
70 ),
68 message: "unresolved module", 71 message: "unresolved module",
69 range: 0..8, 72 range: 0..8,
70 severity: Error, 73 severity: Error,
74 unused: false,
75 experimental: false,
71 fixes: Some( 76 fixes: Some(
72 [ 77 [
73 Assist { 78 Assist {
@@ -98,13 +103,6 @@ mod baz {}
98 }, 103 },
99 ], 104 ],
100 ), 105 ),
101 unused: false,
102 code: Some(
103 DiagnosticCode(
104 "unresolved-module",
105 ),
106 ),
107 experimental: false,
108 }, 106 },
109 ] 107 ]
110 "#]], 108 "#]],
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs
index a81e398c4..ccf66294f 100644
--- a/crates/rust-analyzer/src/handlers.rs
+++ b/crates/rust-analyzer/src/handlers.rs
@@ -1229,14 +1229,13 @@ pub(crate) fn publish_diagnostics(
1229 .map(|d| Diagnostic { 1229 .map(|d| Diagnostic {
1230 range: to_proto::range(&line_index, d.range), 1230 range: to_proto::range(&line_index, d.range),
1231 severity: Some(to_proto::diagnostic_severity(d.severity)), 1231 severity: Some(to_proto::diagnostic_severity(d.severity)),
1232 code: d.code.map(|d| d.as_str().to_owned()).map(NumberOrString::String), 1232 code: Some(NumberOrString::String(d.code.as_str().to_string())),
1233 code_description: d.code.and_then(|code| { 1233 code_description: Some(lsp_types::CodeDescription {
1234 lsp_types::Url::parse(&format!( 1234 href: lsp_types::Url::parse(&format!(
1235 "https://rust-analyzer.github.io/manual.html#{}", 1235 "https://rust-analyzer.github.io/manual.html#{}",
1236 code.as_str() 1236 d.code.as_str()
1237 )) 1237 ))
1238 .ok() 1238 .unwrap(),
1239 .map(|href| lsp_types::CodeDescription { href })
1240 }), 1239 }),
1241 source: Some("rust-analyzer".to_string()), 1240 source: Some("rust-analyzer".to_string()),
1242 message: d.message, 1241 message: d.message,