From 9f8cddaea8c598096405d54f45615b8842dd883c Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson Date: Mon, 27 Jan 2025 20:04:53 -0800 Subject: [PATCH 1/2] Address a potential race between didChange and didOpen --- Extension/src/LanguageServer/extension.ts | 15 +++++++++++++-- Extension/src/LanguageServer/protocolFilter.ts | 1 - 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index a7fbecb07..1855d4880 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -172,8 +172,14 @@ export async function activate(): Promise { getCustomConfigProviders().forEach(provider => void client.onRegisterCustomConfigurationProvider(provider)); }); - disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings)); + // These handlers for didChangeTextDocument and didOpenTextDocument are intentionally non-async and are + // intended primarily to maintain openFileVersions with the most recent versions of files, as quickly as + // possible, without being invoked before complete, delayed by awaits or queued behind other LSP messages, etc.. disposables.push(vscode.workspace.onDidChangeTextDocument(onDidChangeTextDocument)); + disposables.push(vscode.workspace.onDidOpenTextDocument(onDidOpenTextDocument)); + + + disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings)); disposables.push(vscode.window.onDidChangeTextEditorVisibleRanges((e) => clients.ActiveClient.enqueue(async () => onDidChangeTextEditorVisibleRanges(e)))); disposables.push(vscode.window.onDidChangeActiveTextEditor((e) => clients.ActiveClient.enqueue(async () => onDidChangeActiveTextEditor(e)))); ui.didChangeActiveEditor(); // Handle already active documents (for non-cpp files that we don't register didOpen). @@ -298,11 +304,16 @@ async function onDidChangeSettings(event: vscode.ConfigurationChangeEvent): Prom } } -async function onDidChangeTextDocument(event: vscode.TextDocumentChangeEvent): Promise { +function onDidChangeTextDocument(event: vscode.TextDocumentChangeEvent): void { const me: Client = clients.getClientFor(event.document.uri); me.onDidChangeTextDocument(event); } +function onDidOpenTextDocument(document: vscode.TextDocument): void { + const me: Client = clients.getClientFor(document.uri); + me.onDidOpenTextDocument(document); +} + let noActiveEditorTimeout: NodeJS.Timeout | undefined; async function onDidChangeTextEditorVisibleRanges(event: vscode.TextEditorVisibleRangesChangeEvent): Promise { diff --git a/Extension/src/LanguageServer/protocolFilter.ts b/Extension/src/LanguageServer/protocolFilter.ts index 9829f0a13..372d62e3a 100644 --- a/Extension/src/LanguageServer/protocolFilter.ts +++ b/Extension/src/LanguageServer/protocolFilter.ts @@ -38,7 +38,6 @@ export function createProtocolFilter(): Middleware { return; } // client.takeOwnership() will call client.TrackedDocuments.add() again, but that's ok. It's a Set. - client.onDidOpenTextDocument(document); client.takeOwnership(document); void sendMessage(document); } From 958969fcacddd917828d8198c0a9124818be4ee1 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson Date: Mon, 27 Jan 2025 20:06:08 -0800 Subject: [PATCH 2/2] Address a potential race between didChange and didOpen --- Extension/src/LanguageServer/extension.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 1855d4880..895097598 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -172,13 +172,12 @@ export async function activate(): Promise { getCustomConfigProviders().forEach(provider => void client.onRegisterCustomConfigurationProvider(provider)); }); - // These handlers for didChangeTextDocument and didOpenTextDocument are intentionally non-async and are + // These handlers for didChangeTextDocument and didOpenTextDocument are intentionally synchronous and are // intended primarily to maintain openFileVersions with the most recent versions of files, as quickly as - // possible, without being invoked before complete, delayed by awaits or queued behind other LSP messages, etc.. + // possible, without being delayed by awaits or queued behind other LSP messages, etc.. disposables.push(vscode.workspace.onDidChangeTextDocument(onDidChangeTextDocument)); disposables.push(vscode.workspace.onDidOpenTextDocument(onDidOpenTextDocument)); - disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings)); disposables.push(vscode.window.onDidChangeTextEditorVisibleRanges((e) => clients.ActiveClient.enqueue(async () => onDidChangeTextEditorVisibleRanges(e)))); disposables.push(vscode.window.onDidChangeActiveTextEditor((e) => clients.ActiveClient.enqueue(async () => onDidChangeActiveTextEditor(e))));