Unnamed repository; edit this file 'description' to name the repository.
Move empty diagnostics workaround back into the server
Lukas Wirth 2022-08-28
parent 55bf51d · commit 9ad0a8c
-rw-r--r--crates/rust-analyzer/src/main_loop.rs27
-rw-r--r--editors/code/src/client.ts16
2 files changed, 26 insertions, 17 deletions
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index 122aba2f7d..3cfbc2e4e4 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -328,8 +328,33 @@ impl GlobalState {
}
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();
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index 719d273464..05d4d08f70 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -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,