Use getFileAndProject in session provideInlayHints to ensure language service updates are applied (#45394)

This commit is contained in:
Wesley Wigham 2021-08-10 11:48:35 -07:00 committed by GitHub
parent d8e830d132
commit 68eb1a551f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 2 deletions

View File

@ -1453,9 +1453,9 @@ namespace ts.server {
}
private provideInlayHints(args: protocol.InlayHintsRequestArgs) {
const { file, languageService } = this.getFileAndLanguageServiceForSyntacticOperation(args);
const { file, project } = this.getFileAndProject(args);
const scriptInfo = this.projectService.getScriptInfoForNormalizedPath(file)!;
const hints = languageService.provideInlayHints(file, args, this.getPreferences(file));
const hints = project.getLanguageService().provideInlayHints(file, args, this.getPreferences(file));
return hints.map(hint => ({
...hint,

View File

@ -191,6 +191,7 @@
"unittests/tsserver/getExportReferences.ts",
"unittests/tsserver/getFileReferences.ts",
"unittests/tsserver/importHelpers.ts",
"unittests/tsserver/inlayHints.ts",
"unittests/tsserver/inferredProjects.ts",
"unittests/tsserver/jsdocTag.ts",
"unittests/tsserver/languageService.ts",

View File

@ -0,0 +1,63 @@
namespace ts.projectSystem {
describe("unittests:: tsserver:: inlayHints", () => {
const configFile: File = {
path: "/a/b/tsconfig.json",
content: "{}"
};
const app: File = {
path: "/a/b/app.ts",
content: "declare function foo(param: any): void;\nfoo(12);"
};
it("with updateOpen request does not corrupt documents", () => {
const host = createServerHost([app, commonFile1, commonFile2, libFile, configFile]);
const session = createSession(host);
session.executeCommandSeq<protocol.OpenRequest>({
command: protocol.CommandTypes.Open,
arguments: { file: app.path }
});
session.executeCommandSeq<protocol.ConfigureRequest>({
command: protocol.CommandTypes.Configure,
arguments: {
preferences: {
includeInlayParameterNameHints: "all"
} as UserPreferences
}
});
verifyInlayHintResponse(session);
session.executeCommandSeq<protocol.UpdateOpenRequest>({
command: protocol.CommandTypes.UpdateOpen,
arguments: {
changedFiles: [{ fileName: app.path, textChanges: [{ start: { line: 1, offset: 39 }, end: { line: 1, offset: 39 }, newText: "//" }] }]
}
});
verifyInlayHintResponse(session);
session.executeCommandSeq<protocol.UpdateOpenRequest>({
command: protocol.CommandTypes.UpdateOpen,
arguments: {
changedFiles: [{ fileName: app.path, textChanges: [{ start: { line: 1, offset: 41 }, end: { line: 1, offset: 41 }, newText: "c" }] }]
}
});
verifyInlayHintResponse(session);
function verifyInlayHintResponse(session: TestSession) {
verifyParamInlayHint(session.executeCommandSeq<protocol.InlayHintsRequest>({
command: protocol.CommandTypes.ProvideInlayHints,
arguments: {
file: app.path,
start: 0,
length: app.content.length,
}
}).response as protocol.InlayHintItem[] | undefined);
}
function verifyParamInlayHint(response: protocol.InlayHintItem[] | undefined) {
Debug.assert(response);
Debug.assert(response[0]);
Debug.assertEqual(response[0].text, "param:");
Debug.assertEqual(response[0].position.line, 2);
Debug.assertEqual(response[0].position.offset, 5);
}
});
});
}