From fa754cd9dbdabfb3710e26e64394db7889f66ebd Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 11 May 2022 17:45:30 -0700 Subject: [PATCH] fix(language-service): Prevent TSServer from removing templates from project (#45965) As part of the `updateProjectIfDirty` process and inside `updateNonInferredProjectFiles` TS Server will remove the template files that we added as roots in `readResource`. https://sourcegraph.com/github.com/microsoft/TypeScript@c300fea3250abd7f75920d95a58d9e742ac730ee/-/blob/src/server/editorServices.ts?L2363 The external files are added to the list here so ensuring that the templates are included in the `getExternalFiles` will prevent this from happening https://sourcegraph.com/github.com/microsoft/TypeScript@c300fea3250abd7f75920d95a58d9e742ac730ee/-/blob/src/server/editorServices.ts?L2395:18 PR Close #45965 --- packages/language-service/src/ts_plugin.ts | 11 ++++++++++- .../language-service/test/legacy/ts_plugin_spec.ts | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/language-service/src/ts_plugin.ts b/packages/language-service/src/ts_plugin.ts index c02dec405f2..4ad8736eb6f 100644 --- a/packages/language-service/src/ts_plugin.ts +++ b/packages/language-service/src/ts_plugin.ts @@ -189,6 +189,7 @@ export function getExternalFiles(project: ts.server.Project): string[] { return []; // project has not been initialized } const typecheckFiles: string[] = []; + const resourceFiles: string[] = []; for (const scriptInfo of project.getScriptInfos()) { if (scriptInfo.scriptKind === ts.ScriptKind.External) { // script info for typecheck file is marked as external, see @@ -196,6 +197,14 @@ export function getExternalFiles(project: ts.server.Project): string[] { // packages/language-service/src/language_service.ts typecheckFiles.push(scriptInfo.fileName); } + if (scriptInfo.scriptKind === ts.ScriptKind.Unknown) { + // script info for resource file is marked as unknown. + // Including these as external files is necessary because otherwise they will get removed from + // the project when `updateNonInferredProjectFiles` is called as part of the + // `updateProjectIfDirty` cycle. + // https://sourcegraph.com/github.com/microsoft/TypeScript@c300fea3250abd7f75920d95a58d9e742ac730ee/-/blob/src/server/editorServices.ts?L2363 + resourceFiles.push(scriptInfo.fileName); + } } - return typecheckFiles; + return [...typecheckFiles, ...resourceFiles]; } diff --git a/packages/language-service/test/legacy/ts_plugin_spec.ts b/packages/language-service/test/legacy/ts_plugin_spec.ts index 4a7a5596ba8..4f8aed5a7a1 100644 --- a/packages/language-service/test/legacy/ts_plugin_spec.ts +++ b/packages/language-service/test/legacy/ts_plugin_spec.ts @@ -23,7 +23,8 @@ describe('getExternalFiles()', () => { ngLS.getSemanticDiagnostics(APP_COMPONENT); // Now that global analysis is run, we should have all the typecheck files externalFiles = getExternalFiles(project); - expect(externalFiles.length).toBe(1); + // Includes 1 typecheck file, 1 template, and 1 css files + expect(externalFiles.length).toBe(3); expect(externalFiles[0].endsWith('app.component.ngtypecheck.ts')).toBeTrue(); }); });