Skip to content

Commit dcf3cc2

Browse files
committed
more tests
1 parent f6b9c0b commit dcf3cc2

2 files changed

Lines changed: 94 additions & 7 deletions

File tree

src/server/editorServices.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -983,10 +983,11 @@ namespace ts.server {
983983
if (configFiles) {
984984
for (const configFile of configFiles) {
985985
const configuredProject = this.findConfiguredProjectByProjectName(configFile);
986-
if (configuredProject) {
986+
if (configuredProject && configuredProject.deleteOpenRef() === 0) {
987987
this.removeProject(configuredProject);
988988
}
989989
}
990+
// TODO: do this only if ownership of files is changed
990991
this.refreshInferredProjects();
991992
}
992993
else {
@@ -1019,9 +1020,14 @@ namespace ts.server {
10191020
// store the list of tsconfig files that belong to the external project
10201021
this.externalProjectToConfiguredProjectMap[proj.projectFileName] = tsConfigFiles;
10211022
for (const tsconfigFile of tsConfigFiles) {
1022-
const { success, project, errors } = this.openConfigFile(tsconfigFile);
1023-
if (success) {
1024-
// keep project alive - its lifetime is bound to the lifetime of containing external project
1023+
let project = this.findConfiguredProjectByProjectName(tsconfigFile);
1024+
if (!project) {
1025+
const result = this.openConfigFile(tsconfigFile);
1026+
// TODO: save errors
1027+
project = result.success && result.project;
1028+
}
1029+
if (project) {
1030+
// keep project alive even if no documents are opened - its lifetime is bound to the lifetime of containing external project
10251031
project.addOpenRef();
10261032
}
10271033
}

tests/cases/unittests/tsserverProjectSystem.ts

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -857,19 +857,100 @@ namespace ts {
857857

858858
projectService.closeExternalProject(externalProjectName);
859859
checkNumberOfExternalProjects(projectService, 0);
860-
// open file 'file1' from configured project is moved to its own inferred project + inferred project for file3
861-
checkNumberOfInferredProjects(projectService, 2);
860+
// open file 'file1' from configured project keeps project alive
861+
checkNumberOfConfiguredProjects(projectService, 1);
862+
checkNumberOfInferredProjects(projectService, 1);
862863

863864
projectService.closeClientFile(file3.path);
864865
checkNumberOfExternalProjects(projectService, 0);
866+
checkNumberOfConfiguredProjects(projectService, 1);
867+
checkNumberOfInferredProjects(projectService, 0);
868+
869+
projectService.closeClientFile(file1.path);
870+
checkNumberOfExternalProjects(projectService, 0);
865871
checkNumberOfConfiguredProjects(projectService, 0);
866-
checkNumberOfInferredProjects(projectService, 1);
872+
checkNumberOfInferredProjects(projectService, 0);
873+
});
874+
875+
it("external project with included config file opened after configured project", () => {
876+
const file1 = {
877+
path: "/a/b/f1.ts",
878+
content: "let x = 1"
879+
};
880+
const configFile = {
881+
path: "/a/b/tsconfig.json",
882+
content: JSON.stringify({ compilerOptions: {} })
883+
};
884+
const externalProjectName = "externalproject";
885+
const host = createServerHost({ fileOrFolderList: [file1, configFile], libFile });
886+
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false);
887+
888+
projectService.openClientFile(file1.path);
889+
checkNumberOfExternalProjects(projectService, 0);
890+
checkNumberOfConfiguredProjects(projectService, 1);
891+
checkNumberOfInferredProjects(projectService, 0);
892+
893+
projectService.openExternalProject({
894+
rootFiles: [ configFile.path ],
895+
options: {},
896+
projectFileName: externalProjectName
897+
});
898+
899+
checkNumberOfExternalProjects(projectService, 0);
900+
checkNumberOfConfiguredProjects(projectService, 1);
901+
checkNumberOfInferredProjects(projectService, 0);
867902

868903
projectService.closeClientFile(file1.path);
869904
checkNumberOfExternalProjects(projectService, 0);
905+
// configured project is alive since it is opened as part of external project
906+
checkNumberOfConfiguredProjects(projectService, 1);
907+
checkNumberOfInferredProjects(projectService, 0);
908+
909+
projectService.closeExternalProject(externalProjectName);
910+
checkNumberOfExternalProjects(projectService, 0);
911+
// configured project is alive since it is opened as part of external project
870912
checkNumberOfConfiguredProjects(projectService, 0);
871913
checkNumberOfInferredProjects(projectService, 0);
872914
});
915+
it("external project with included config file opened after configured project and then closed", () => {
916+
const file1 = {
917+
path: "/a/b/f1.ts",
918+
content: "let x = 1"
919+
};
920+
const configFile = {
921+
path: "/a/b/tsconfig.json",
922+
content: JSON.stringify({ compilerOptions: {} })
923+
};
924+
const externalProjectName = "externalproject";
925+
const host = createServerHost({ fileOrFolderList: [file1, configFile], libFile });
926+
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false);
873927

928+
projectService.openClientFile(file1.path);
929+
checkNumberOfExternalProjects(projectService, 0);
930+
checkNumberOfConfiguredProjects(projectService, 1);
931+
checkNumberOfInferredProjects(projectService, 0);
932+
933+
projectService.openExternalProject({
934+
rootFiles: [ configFile.path ],
935+
options: {},
936+
projectFileName: externalProjectName
937+
});
938+
939+
checkNumberOfExternalProjects(projectService, 0);
940+
checkNumberOfConfiguredProjects(projectService, 1);
941+
checkNumberOfInferredProjects(projectService, 0);
942+
943+
projectService.closeExternalProject(externalProjectName);
944+
checkNumberOfExternalProjects(projectService, 0);
945+
// configured project is alive since file is still open
946+
checkNumberOfConfiguredProjects(projectService, 1);
947+
checkNumberOfInferredProjects(projectService, 0);
948+
949+
projectService.closeClientFile(file1.path);
950+
checkNumberOfExternalProjects(projectService, 0);
951+
// configured project is alive since it is opened as part of external project
952+
checkNumberOfConfiguredProjects(projectService, 0);
953+
checkNumberOfInferredProjects(projectService, 0);
954+
});
874955
});
875956
}

0 commit comments

Comments
 (0)