diff options
-rw-r--r-- | crates/rust-analyzer/src/diagnostics/to_proto.rs | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/crates/rust-analyzer/src/diagnostics/to_proto.rs b/crates/rust-analyzer/src/diagnostics/to_proto.rs index d3720de33..324019614 100644 --- a/crates/rust-analyzer/src/diagnostics/to_proto.rs +++ b/crates/rust-analyzer/src/diagnostics/to_proto.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | //! `cargo check` json format to the LSP diagnostic format. | 2 | //! `cargo check` json format to the LSP diagnostic format. |
3 | use std::{collections::HashMap, path::Path}; | 3 | use std::{collections::HashMap, path::Path}; |
4 | 4 | ||
5 | use flycheck::{Applicability, DiagnosticCode, DiagnosticLevel, DiagnosticSpan}; | 5 | use flycheck::{Applicability, DiagnosticLevel, DiagnosticSpan}; |
6 | use stdx::format_to; | 6 | use stdx::format_to; |
7 | 7 | ||
8 | use crate::{lsp_ext, to_proto::url_from_abs_path}; | 8 | use crate::{lsp_ext, to_proto::url_from_abs_path}; |
@@ -211,7 +211,11 @@ pub(crate) fn map_rust_diagnostic_to_lsp( | |||
211 | } | 211 | } |
212 | } | 212 | } |
213 | 213 | ||
214 | let code_description = rustc_code_description(rd.code.as_ref()); | 214 | let code_description = match source.as_str() { |
215 | "rustc" => rustc_code_description(code.as_deref()), | ||
216 | "clippy" => clippy_code_description(code.as_deref()), | ||
217 | _ => None, | ||
218 | }; | ||
215 | 219 | ||
216 | primary_spans | 220 | primary_spans |
217 | .iter() | 221 | .iter() |
@@ -294,20 +298,31 @@ pub(crate) fn map_rust_diagnostic_to_lsp( | |||
294 | .collect() | 298 | .collect() |
295 | } | 299 | } |
296 | 300 | ||
297 | fn rustc_code_description(code: Option<&DiagnosticCode>) -> Option<lsp_types::CodeDescription> { | 301 | fn rustc_code_description(code: Option<&str>) -> Option<lsp_types::CodeDescription> { |
298 | code.filter(|c| { | 302 | code.filter(|code| { |
299 | let mut chars = c.code.chars(); | 303 | let mut chars = code.chars(); |
300 | chars.next().map_or(false, |c| c == 'E') | 304 | chars.next().map_or(false, |c| c == 'E') |
301 | && chars.by_ref().take(4).all(|c| c.is_ascii_digit()) | 305 | && chars.by_ref().take(4).all(|c| c.is_ascii_digit()) |
302 | && chars.next().is_none() | 306 | && chars.next().is_none() |
303 | }) | 307 | }) |
304 | .and_then(|c| { | 308 | .and_then(|code| { |
305 | lsp_types::Url::parse(&format!("https://doc.rust-lang.org/error-index.html#{}", c.code)) | 309 | lsp_types::Url::parse(&format!("https://doc.rust-lang.org/error-index.html#{}", code)) |
306 | .ok() | 310 | .ok() |
307 | .map(|href| lsp_types::CodeDescription { href }) | 311 | .map(|href| lsp_types::CodeDescription { href }) |
308 | }) | 312 | }) |
309 | } | 313 | } |
310 | 314 | ||
315 | fn clippy_code_description(code: Option<&str>) -> Option<lsp_types::CodeDescription> { | ||
316 | code.and_then(|code| { | ||
317 | lsp_types::Url::parse(&format!( | ||
318 | "https://rust-lang.github.io/rust-clippy/master/index.html#{}", | ||
319 | code | ||
320 | )) | ||
321 | .ok() | ||
322 | .map(|href| lsp_types::CodeDescription { href }) | ||
323 | }) | ||
324 | } | ||
325 | |||
311 | #[cfg(test)] | 326 | #[cfg(test)] |
312 | #[cfg(not(windows))] | 327 | #[cfg(not(windows))] |
313 | mod tests { | 328 | mod tests { |