From 59d19251cfcb20083222f7882adfca0204c5aada Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 15 May 2018 16:11:25 -0700 Subject: [PATCH] Add test to verify the document is released from source file when info is orphan --- .../unittests/tsserverProjectSystem.ts | 43 +++++++++++++++++++ src/server/editorServices.ts | 3 +- src/services/documentRegistry.ts | 8 ++++ .../reference/api/tsserverlibrary.d.ts | 1 - 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index 8524d46e09..10bd2f2ac7 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -8383,4 +8383,47 @@ new C();` verifyCompletionListWithNewFileInSubFolder(TestFSWithWatch.Tsc_WatchDirectory.DynamicPolling); }); }); + + describe("document registry in project service", () => { + it("Caches the source file if script info is orphan", () => { + const projectRootPath = "/user/username/projects/project"; + const importModuleContent = `import {a} from "./module1"`; + const file: File = { + path: `${projectRootPath}/index.ts`, + content: importModuleContent + }; + const moduleFile: File = { + path: `${projectRootPath}/module1.d.ts`, + content: "export const a: number;" + }; + const configFile: File = { + path: `${projectRootPath}/tsconfig.json`, + content: JSON.stringify({ files: ["index.ts"] }) + }; + const host = createServerHost([file, moduleFile, libFile, configFile]); + const service = createProjectService(host); + service.openClientFile(file.path); + const project = service.configuredProjects.get(configFile.path); + checkProject(/*moduleIsOrphan*/ false); + + // edit file + const info = service.getScriptInfo(file.path); + service.applyChangesToFile(info, [{ span: { start: 0, length: importModuleContent.length }, newText: "" }]); + checkProject(/*moduleIsOrphan*/ true); + + // write content back + service.applyChangesToFile(info, [{ span: { start: 0, length: 0 }, newText: importModuleContent }]); + checkProject(/*moduleIsOrphan*/ false); + + function checkProject(moduleIsOrphan: boolean) { + // Update the project + project.getLanguageService(); + checkProjectActualFiles(project, [file.path, libFile.path, configFile.path, ...(moduleIsOrphan ? [] : [moduleFile.path])]); + const moduleInfo = service.getScriptInfo(moduleFile.path); + assert.isDefined(moduleInfo); + assert.equal(moduleInfo.isOrphan(), moduleIsOrphan); + assert.equal(service.documentRegistry.hasDocument(moduleInfo.path), !moduleIsOrphan); + } + }); + }); } diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index bb3560cbde..f3fb198e68 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -339,7 +339,8 @@ namespace ts.server { /*@internal*/ readonly typingsCache: TypingsCache; - private readonly documentRegistry: DocumentRegistry; + /*@internal*/ + readonly documentRegistry: DocumentRegistry; /** * Container of all known scripts diff --git a/src/services/documentRegistry.ts b/src/services/documentRegistry.ts index d464f7a408..b49f0d5c2c 100644 --- a/src/services/documentRegistry.ts +++ b/src/services/documentRegistry.ts @@ -87,6 +87,9 @@ namespace ts { releaseDocumentWithKey(path: Path, key: DocumentRegistryBucketKey): void; + /*@internal*/ + hasDocument(path: Path): boolean; + reportStats(): string; } @@ -225,6 +228,10 @@ namespace ts { } } + function hasDocument(path: Path) { + return !!forEachEntry(buckets, bucket => bucket.has(path)); + } + return { acquireDocument, acquireDocumentWithKey, @@ -232,6 +239,7 @@ namespace ts { updateDocumentWithKey, releaseDocument, releaseDocumentWithKey, + hasDocument, reportStats, getKeyForCompilationSettings }; diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 1cf0b12522..ef51c00448 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -8124,7 +8124,6 @@ declare namespace ts.server { syntaxOnly?: boolean; } class ProjectService { - private readonly documentRegistry; /** * Container of all known scripts */