Skip to content

Commit 8431b37

Browse files
authored
Await in protocol filter (#10306)
1 parent 23f3b47 commit 8431b37

File tree

3 files changed

+49
-55
lines changed

3 files changed

+49
-55
lines changed

Extension/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5976,7 +5976,7 @@
59765976
"ssh-config": "^4.1.0",
59775977
"tmp": "^0.2.1",
59785978
"vscode-cpptools": "^6.1.0",
5979-
"vscode-languageclient": "^8.0.1",
5979+
"vscode-languageclient": "^8.1.0-next.4",
59805980
"vscode-nls": "^5.0.0",
59815981
"vscode-tas-client": "^0.1.27",
59825982
"which": "^2.0.2",

Extension/src/LanguageServer/protocolFilter.ts

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,14 @@ import { shouldChangeFromCToCpp } from './utils';
1313

1414
export function createProtocolFilter(): Middleware {
1515
// Disabling lint for invoke handlers
16-
const defaultHandler: (data: any, callback: (data: any) => Promise<void>) => Promise<void> = async (data, callback: (data: any) => void) => { clients.ActiveClient.notifyWhenLanguageClientReady(() => callback(data)); };
17-
// const invoke1 = async (a: any, next: (a: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a); };
16+
const invoke1 = async (a: any, next: (a: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a); };
1817
const invoke2 = async (a: any, b: any, next: (a: any, b: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a, b); };
1918
const invoke3 = async (a: any, b: any, c: any, next: (a: any, b: any, c: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a, b, c); };
20-
const invoke4 = async (a: any, b: any, c: any, d: any, next: (a: any, b: any, c: any, d: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a, b, c, d); };
21-
// const invoke5 = async (a: any, b: any, c: any, d: any, e: any, next: (a: any, b: any, c: any, d: any, e: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a, b, c, d, e); };
22-
/* tslint:enable */
19+
const invoke4 = async (a: any, b: any, c: any, d: any, next: (a: any, b: any, c: any, d: any) => any) => { await clients.ActiveClient.awaitUntilLanguageClientReady(); return next(a, b, c, d); }; /* tslint:enable */
2320

2421
return {
2522
didOpen: async (document, sendMessage) => {
23+
await clients.ActiveClient.awaitUntilLanguageClientReady();
2624
const editor: vscode.TextEditor | undefined = vscode.window.visibleTextEditors.find(e => e.document === document);
2725
if (editor) {
2826
// If the file was visible editor when we were activated, we will not get a call to
@@ -34,28 +32,22 @@ export function createProtocolFilter(): Middleware {
3432
clients.timeTelemetryCollector.setDidOpenTime(document.uri);
3533
if (clients.checkOwnership(me, document)) {
3634
me.TrackedDocuments.add(document);
37-
const finishDidOpen = (doc: vscode.TextDocument) => {
38-
me.provideCustomConfiguration(doc.uri, undefined);
39-
sendMessage(doc);
35+
const finishDidOpen = async (doc: vscode.TextDocument) => {
36+
await me.provideCustomConfiguration(doc.uri, undefined);
37+
await sendMessage(doc);
4038
me.onDidOpenTextDocument(doc);
4139
if (editor && editor === vscode.window.activeTextEditor) {
4240
onDidChangeActiveTextEditor(editor);
4341
}
4442
};
45-
let languageChanged: boolean = false;
4643
if (document.languageId === "c" && shouldChangeFromCToCpp(document)) {
4744
const baesFileName: string = path.basename(document.fileName);
4845
const mappingString: string = baesFileName + "@" + document.fileName;
4946
me.addFileAssociations(mappingString, "cpp");
5047
me.sendDidChangeSettings();
51-
vscode.languages.setTextDocumentLanguage(document, "cpp").then((newDoc: vscode.TextDocument) => {
52-
finishDidOpen(newDoc);
53-
});
54-
languageChanged = true;
55-
}
56-
if (!languageChanged) {
57-
finishDidOpen(document);
48+
document = await vscode.languages.setTextDocumentLanguage(document, "cpp");
5849
}
50+
await finishDidOpen(document);
5951
}
6052
}
6153
} else {
@@ -69,47 +61,49 @@ export function createProtocolFilter(): Middleware {
6961
}
7062
},
7163
didChange: async (textDocumentChangeEvent, sendMessage) => {
64+
await clients.ActiveClient.awaitUntilLanguageClientReady();
7265
const me: Client = clients.getClientFor(textDocumentChangeEvent.document.uri);
7366
me.onDidChangeTextDocument(textDocumentChangeEvent);
74-
sendMessage(textDocumentChangeEvent);
67+
await sendMessage(textDocumentChangeEvent);
7568
},
76-
willSave: defaultHandler,
69+
willSave: invoke1,
7770
willSaveWaitUntil: async (event, sendMessage) => {
71+
// await clients.ActiveClient.awaitUntilLanguageClientReady();
72+
// Don't use awaitUntilLanguageClientReady.
73+
// Otherwise, the message can be delayed too long.
7874
const me: Client = clients.getClientFor(event.document.uri);
7975
if (me.TrackedDocuments.has(event.document)) {
80-
// Don't use me.requestWhenReady or notifyWhenLanguageClientReady;
81-
// otherwise, the message can be delayed too long.
8276
return sendMessage(event);
8377
}
84-
return Promise.resolve([]);
78+
return [];
8579
},
86-
didSave: defaultHandler,
80+
didSave: invoke1,
8781
didClose: async (document, sendMessage) => {
82+
await clients.ActiveClient.awaitUntilLanguageClientReady();
8883
const me: Client = clients.getClientFor(document.uri);
8984
if (me.TrackedDocuments.has(document)) {
9085
me.onDidCloseTextDocument(document);
9186
me.TrackedDocuments.delete(document);
92-
sendMessage(document);
87+
await sendMessage(document);
9388
}
9489
},
95-
9690
provideCompletionItem: invoke4,
9791
resolveCompletionItem: invoke2,
98-
provideHover: (document, position, token, next: (document: any, position: any, token: any) => any) => {
92+
provideHover: async (document, position, token, next: (document: any, position: any, token: any) => any) => {
93+
await clients.ActiveClient.awaitUntilLanguageClientReady();
9994
const me: Client = clients.getClientFor(document.uri);
100-
if (clients.checkOwnership(me, document)) {
101-
return clients.ActiveClient.requestWhenReady(() => next(document, position, token));
95+
if (me.TrackedDocuments.has(document)) {
96+
return next(document, position, token);
10297
}
10398
return null;
10499
},
105100
provideSignatureHelp: invoke4,
106101
provideDefinition: invoke3,
107102
provideReferences: invoke4,
108103
provideDocumentHighlights: invoke3,
109-
provideDeclaration: invoke3
110-
// I believe the default handler will do the same thing.
111-
// workspace: {
112-
// didChangeConfiguration: (sections, sendMessage) => sendMessage(sections)
113-
// }
104+
provideDeclaration: invoke3,
105+
workspace: {
106+
didChangeConfiguration: invoke1
107+
}
114108
};
115109
}

Extension/yarn.lock

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3846,7 +3846,7 @@ mimic-fn@^2.1.0:
38463846
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
38473847
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
38483848

3849-
[email protected], minimatch@^3.0.4, minimatch@^3.0.5:
3849+
[email protected], minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^5.1.0:
38503850
version "3.1.2"
38513851
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
38523852
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -5930,32 +5930,32 @@ vscode-dts@^0.3.2:
59305930
prompts "^2.1.0"
59315931
rimraf "^3.0.0"
59325932

5933-
vscode-jsonrpc@8.0.1:
5934-
version "8.0.1"
5935-
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e"
5936-
integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==
5933+
vscode-jsonrpc@8.1.0-next.5:
5934+
version "8.1.0-next.5"
5935+
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0-next.5.tgz#93fede04082a05268c735b77dae1edbb31708f33"
5936+
integrity sha512-9l9lB8gXW1kPECKLC5Goc41pFztSCfODY3dvGaNTJ0KfRgwKIUyIhEBSdlWT2IU4uL4Tcl/zcitpb+Lj6QP7aQ==
59375937

5938-
vscode-languageclient@^8.0.1:
5939-
version "8.0.1"
5940-
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.0.1.tgz#bf5535c4463a78daeaca0bcb4f5868aec86bb301"
5941-
integrity sha512-9XoE+HJfaWvu7Y75H3VmLo5WLCtsbxEgEhrLPqwt7eyoR49lUIyyrjb98Yfa50JCMqF2cePJAEVI6oe2o1sIhw==
5938+
vscode-languageclient@^8.1.0-next.4:
5939+
version "8.1.0-next.4"
5940+
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-8.1.0-next.4.tgz#f56aae6350cb7602d3ac60f9cdf0c7b1bf5feb79"
5941+
integrity sha512-dwo3Vf1aAb3o62mDhLHRGqYaLAYWN5RXAbHKL85Cs+yCJghxYzseuGGBvOUOH3BF5scnCU2BFrghekyP1xCUmQ==
59425942
dependencies:
5943-
minimatch "^3.0.4"
5944-
semver "^7.3.5"
5945-
vscode-languageserver-protocol "3.17.1"
5943+
minimatch "^5.1.0"
5944+
semver "^7.3.7"
5945+
vscode-languageserver-protocol "3.17.3-next.4"
59465946

5947-
5948-
version "3.17.1"
5949-
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed"
5950-
integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==
5947+
5948+
version "3.17.3-next.4"
5949+
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3-next.4.tgz#28b30c556910e6d35080c764543b263eea16aa43"
5950+
integrity sha512-G6XrjZGSe2LIo7uDa860JKX97sLKc1vQF4AU4SW8DI7NNVKxnCB+vEs8gYHmle7kD9v13PvFkDCBD5ApeONGNQ==
59515951
dependencies:
5952-
vscode-jsonrpc "8.0.1"
5953-
vscode-languageserver-types "3.17.1"
5952+
vscode-jsonrpc "8.1.0-next.5"
5953+
vscode-languageserver-types "3.17.3-next.1"
59545954

5955-
5956-
version "3.17.1"
5957-
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16"
5958-
integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ==
5955+
5956+
version "3.17.3-next.1"
5957+
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3-next.1.tgz#0f9c65cf9d30b4236d4f20f2169b0ddbeb7646e7"
5958+
integrity sha512-i7HXZs5CdNibVHXZORZw9m5Bm0mfXiGhD/tZv6f7arBtz4iatgiiHu2qInxn0fKeahhMJoBbp6irhsL9+E3UAA==
59595959

59605960
vscode-nls-dev@^4.0.0-next.1:
59615961
version "4.0.0-next.1"

0 commit comments

Comments
 (0)