Skip to content

Commit efe662d

Browse files
Include suggested replacement in diagnostics
1 parent 85d80df commit efe662d

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

crates/rust-analyzer/src/diagnostics/to_proto.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::collections::HashMap;
44

55
use flycheck::{DiagnosticLevel, DiagnosticSpan};
6+
use itertools::Itertools;
67
use stdx::format_to;
78
use vfs::{AbsPath, AbsPathBuf};
89

@@ -134,30 +135,42 @@ fn map_rust_child_diagnostic(
134135
}
135136

136137
let mut edit_map: HashMap<lsp_types::Url, Vec<lsp_types::TextEdit>> = HashMap::new();
138+
let mut suggested_replacements = Vec::new();
137139
for &span in &spans {
138140
if let Some(suggested_replacement) = &span.suggested_replacement {
141+
suggested_replacements.push(suggested_replacement);
139142
let location = location(config, workspace_root, span);
140143
let edit = lsp_types::TextEdit::new(location.range, suggested_replacement.clone());
141144
edit_map.entry(location.uri).or_default().push(edit);
142145
}
143146
}
144147

148+
// rustc renders suggestion diagnostics by appending the suggested replacement, so do the same
149+
// here, otherwise the diagnostic text is missing useful information.
150+
let mut message = rd.message.clone();
151+
if !suggested_replacements.is_empty() {
152+
message.push_str(": ");
153+
let suggestions =
154+
suggested_replacements.iter().map(|suggestion| format!("`{}`", suggestion)).join(", ");
155+
message.push_str(&suggestions);
156+
}
157+
145158
if edit_map.is_empty() {
146159
MappedRustChildDiagnostic::SubDiagnostic(SubDiagnostic {
147160
related: lsp_types::DiagnosticRelatedInformation {
148161
location: location(config, workspace_root, spans[0]),
149-
message: rd.message.clone(),
162+
message,
150163
},
151164
suggested_fix: None,
152165
})
153166
} else {
154167
MappedRustChildDiagnostic::SubDiagnostic(SubDiagnostic {
155168
related: lsp_types::DiagnosticRelatedInformation {
156169
location: location(config, workspace_root, spans[0]),
157-
message: rd.message.clone(),
170+
message: message.clone(),
158171
},
159172
suggested_fix: Some(lsp_ext::CodeAction {
160-
title: rd.message.clone(),
173+
title: message,
161174
group: None,
162175
kind: Some(lsp_types::CodeActionKind::QUICKFIX),
163176
edit: Some(lsp_ext::SnippetWorkspaceEdit {

0 commit comments

Comments
 (0)