diff --git a/crates/rust-analyzer/src/diagnostics/to_proto.rs b/crates/rust-analyzer/src/diagnostics/to_proto.rs index d64909add38..e60b939015a 100644 --- a/crates/rust-analyzer/src/diagnostics/to_proto.rs +++ b/crates/rust-analyzer/src/diagnostics/to_proto.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use flycheck::{DiagnosticLevel, DiagnosticSpan}; +use itertools::Itertools; use stdx::format_to; use vfs::{AbsPath, AbsPathBuf}; @@ -134,19 +135,31 @@ fn map_rust_child_diagnostic( } let mut edit_map: HashMap> = HashMap::new(); + let mut suggested_replacements = Vec::new(); for &span in &spans { if let Some(suggested_replacement) = &span.suggested_replacement { + suggested_replacements.push(suggested_replacement); let location = location(config, workspace_root, span); let edit = lsp_types::TextEdit::new(location.range, suggested_replacement.clone()); edit_map.entry(location.uri).or_default().push(edit); } } + // rustc renders suggestion diagnostics by appending the suggested replacement, so do the same + // here, otherwise the diagnostic text is missing useful information. + let mut message = rd.message.clone(); + if !suggested_replacements.is_empty() { + message.push_str(": "); + let suggestions = + suggested_replacements.iter().map(|suggestion| format!("`{}`", suggestion)).join(", "); + message.push_str(&suggestions); + } + if edit_map.is_empty() { MappedRustChildDiagnostic::SubDiagnostic(SubDiagnostic { related: lsp_types::DiagnosticRelatedInformation { location: location(config, workspace_root, spans[0]), - message: rd.message.clone(), + message, }, suggested_fix: None, }) @@ -154,10 +167,10 @@ fn map_rust_child_diagnostic( MappedRustChildDiagnostic::SubDiagnostic(SubDiagnostic { related: lsp_types::DiagnosticRelatedInformation { location: location(config, workspace_root, spans[0]), - message: rd.message.clone(), + message: message.clone(), }, suggested_fix: Some(lsp_ext::CodeAction { - title: rd.message.clone(), + title: message, group: None, kind: Some(lsp_types::CodeActionKind::QUICKFIX), edit: Some(lsp_ext::SnippetWorkspaceEdit {