Skip to content

Commit e3bb8a7

Browse files
authored
Fix a potential race between didChange and didOpen (#13209)
1 parent 99864b0 commit e3bb8a7

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

Diff for: Extension/src/LanguageServer/extension.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,13 @@ export async function activate(): Promise<void> {
172172
getCustomConfigProviders().forEach(provider => void client.onRegisterCustomConfigurationProvider(provider));
173173
});
174174

175-
disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings));
175+
// These handlers for didChangeTextDocument and didOpenTextDocument are intentionally synchronous and are
176+
// intended primarily to maintain openFileVersions with the most recent versions of files, as quickly as
177+
// possible, without being delayed by awaits or queued behind other LSP messages, etc..
176178
disposables.push(vscode.workspace.onDidChangeTextDocument(onDidChangeTextDocument));
179+
disposables.push(vscode.workspace.onDidOpenTextDocument(onDidOpenTextDocument));
180+
181+
disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings));
177182
disposables.push(vscode.window.onDidChangeTextEditorVisibleRanges((e) => clients.ActiveClient.enqueue(async () => onDidChangeTextEditorVisibleRanges(e))));
178183
disposables.push(vscode.window.onDidChangeActiveTextEditor((e) => clients.ActiveClient.enqueue(async () => onDidChangeActiveTextEditor(e))));
179184
ui.didChangeActiveEditor(); // Handle already active documents (for non-cpp files that we don't register didOpen).
@@ -303,6 +308,11 @@ function onDidChangeTextDocument(event: vscode.TextDocumentChangeEvent): void {
303308
me.onDidChangeTextDocument(event);
304309
}
305310

311+
function onDidOpenTextDocument(document: vscode.TextDocument): void {
312+
const me: Client = clients.getClientFor(document.uri);
313+
me.onDidOpenTextDocument(document);
314+
}
315+
306316
let noActiveEditorTimeout: NodeJS.Timeout | undefined;
307317

308318
async function onDidChangeTextEditorVisibleRanges(event: vscode.TextEditorVisibleRangesChangeEvent): Promise<void> {

Diff for: Extension/src/LanguageServer/protocolFilter.ts

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ export function createProtocolFilter(): Middleware {
3838
return;
3939
}
4040
// client.takeOwnership() will call client.TrackedDocuments.add() again, but that's ok. It's a Set.
41-
client.onDidOpenTextDocument(document);
4241
client.takeOwnership(document);
4342
void sendMessage(document);
4443
}

0 commit comments

Comments
 (0)