Auto merge of #13133 - Veykril:diag-hack, r=Veykril
Move empty diagnostics workaround back into the server This only touches on the diagnostics in one place instead of multiple as was previously done, since all published diagnostics will go through this code path anyways. Closes https://github.com/rust-lang/rust-analyzer/issues/13130
This commit is contained in:
commit
e8e598f641
@ -328,8 +328,33 @@ fn handle_event(&mut self, event: Event) -> Result<()> {
|
||||
}
|
||||
|
||||
let uri = file_id_to_url(&self.vfs.read().0, file_id);
|
||||
let diagnostics =
|
||||
let mut diagnostics =
|
||||
self.diagnostics.diagnostics_for(file_id).cloned().collect::<Vec<_>>();
|
||||
|
||||
// VSCode assumes diagnostic messages to be non-empty strings, so we need to patch
|
||||
// empty diagnostics. Neither the docs of VSCode nor the LSP spec say whether
|
||||
// diagnostic messages are actually allowed to be empty or not and patching this
|
||||
// in the VSCode client does not work as the assertion happens in the protocol
|
||||
// conversion. So this hack is here to stay, and will be considered a hack
|
||||
// until the LSP decides to state that empty messages are allowed.
|
||||
|
||||
// See https://github.com/rust-lang/rust-analyzer/issues/11404
|
||||
// See https://github.com/rust-lang/rust-analyzer/issues/13130
|
||||
let patch_empty = |message: &mut String| {
|
||||
if message.is_empty() {
|
||||
*message = " ".to_string();
|
||||
}
|
||||
};
|
||||
|
||||
for d in &mut diagnostics {
|
||||
patch_empty(&mut d.message);
|
||||
if let Some(dri) = &mut d.related_information {
|
||||
for dri in dri {
|
||||
patch_empty(&mut dri.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let version = from_proto::vfs_path(&uri)
|
||||
.map(|path| self.mem_docs.get(&path).map(|it| it.version))
|
||||
.unwrap_or_default();
|
||||
|
@ -99,22 +99,6 @@ export async function createClient(
|
||||
traceOutputChannel: traceOutputChannel(),
|
||||
outputChannel: outputChannel(),
|
||||
middleware: {
|
||||
async handleDiagnostics(uri, diagnostics, next) {
|
||||
// Workaround for https://github.com/microsoft/vscode/issues/155531
|
||||
for (const diagnostic of diagnostics) {
|
||||
if (!diagnostic.message) {
|
||||
diagnostic.message = " ";
|
||||
}
|
||||
if (diagnostic.relatedInformation) {
|
||||
for (const relatedInformation of diagnostic.relatedInformation) {
|
||||
if (!relatedInformation.message) {
|
||||
relatedInformation.message = " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
next(uri, diagnostics);
|
||||
},
|
||||
async provideHover(
|
||||
document: vscode.TextDocument,
|
||||
position: vscode.Position,
|
||||
|
Loading…
Reference in New Issue
Block a user