@@ -958,7 +958,42 @@ namespace ts.projectSystem {
958
958
checkProjectActualFiles(projectService.inferredProjects[0], [file2.path, file3.path, libFile.path]);
959
959
});
960
960
961
- it("should close configured project after closing last open file", () => {
961
+ it("should resuse same project if file is opened from the configured project that has no open files", () => {
962
+ const file1 = {
963
+ path: "/a/b/main.ts",
964
+ content: "let x =1;"
965
+ };
966
+ const file2 = {
967
+ path: "/a/b/main2.ts",
968
+ content: "let y =1;"
969
+ };
970
+ const configFile: FileOrFolder = {
971
+ path: "/a/b/tsconfig.json",
972
+ content: `{
973
+ "compilerOptions": {
974
+ "target": "es6"
975
+ },
976
+ "files": [ "main.ts", "main2.ts" ]
977
+ }`
978
+ };
979
+ const host = createServerHost([file1, file2, configFile, libFile]);
980
+ const projectService = createProjectService(host, { useSingleInferredProject: true });
981
+ projectService.openClientFile(file1.path);
982
+ checkNumberOfConfiguredProjects(projectService, 1);
983
+ const project = projectService.configuredProjects.get(configFile.path);
984
+
985
+ projectService.closeClientFile(file1.path);
986
+ checkNumberOfConfiguredProjects(projectService, 1);
987
+ assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
988
+ assert.equal(project.openRefCount, 0);
989
+
990
+ projectService.openClientFile(file2.path);
991
+ checkNumberOfConfiguredProjects(projectService, 1);
992
+ assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
993
+ assert.equal(project.openRefCount, 1);
994
+ });
995
+
996
+ it("should not close configured project after closing last open file, but should be closed on next file open if its not the file from same project", () => {
962
997
const file1 = {
963
998
path: "/a/b/main.ts",
964
999
content: "let x =1;"
@@ -976,8 +1011,14 @@ namespace ts.projectSystem {
976
1011
const projectService = createProjectService(host, { useSingleInferredProject: true });
977
1012
projectService.openClientFile(file1.path);
978
1013
checkNumberOfConfiguredProjects(projectService, 1);
1014
+ const project = projectService.configuredProjects.get(configFile.path);
979
1015
980
1016
projectService.closeClientFile(file1.path);
1017
+ checkNumberOfConfiguredProjects(projectService, 1);
1018
+ assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
1019
+ assert.equal(project.openRefCount, 0);
1020
+
1021
+ projectService.openClientFile(libFile.path);
981
1022
checkNumberOfConfiguredProjects(projectService, 0);
982
1023
});
983
1024
@@ -1058,23 +1099,43 @@ namespace ts.projectSystem {
1058
1099
});
1059
1100
1060
1101
checkNumberOfProjects(projectService, { configuredProjects: 2 });
1102
+ const proj1 = projectService.configuredProjects.get(config1.path);
1103
+ const proj2 = projectService.configuredProjects.get(config2.path);
1104
+ assert.isDefined(proj1);
1105
+ assert.isDefined(proj2);
1061
1106
1062
1107
// open client file - should not lead to creation of inferred project
1063
1108
projectService.openClientFile(file1.path, file1.content);
1064
1109
checkNumberOfProjects(projectService, { configuredProjects: 2 });
1110
+ assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1111
+ assert.strictEqual(projectService.configuredProjects.get(config2.path), proj2);
1065
1112
1066
1113
projectService.openClientFile(file3.path, file3.content);
1067
1114
checkNumberOfProjects(projectService, { configuredProjects: 2, inferredProjects: 1 });
1115
+ assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1116
+ assert.strictEqual(projectService.configuredProjects.get(config2.path), proj2);
1068
1117
1069
1118
projectService.closeExternalProject(externalProjectName);
1070
1119
// open file 'file1' from configured project keeps project alive
1071
1120
checkNumberOfProjects(projectService, { configuredProjects: 1, inferredProjects: 1 });
1121
+ assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1122
+ assert.isUndefined(projectService.configuredProjects.get(config2.path));
1072
1123
1073
1124
projectService.closeClientFile(file3.path);
1074
1125
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1126
+ assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1127
+ assert.isUndefined(projectService.configuredProjects.get(config2.path));
1075
1128
1076
1129
projectService.closeClientFile(file1.path);
1077
- checkNumberOfProjects(projectService, {});
1130
+ checkNumberOfProjects(projectService, { configuredProjects: 1 });
1131
+ assert.strictEqual(projectService.configuredProjects.get(config1.path), proj1);
1132
+ assert.isUndefined(projectService.configuredProjects.get(config2.path));
1133
+
1134
+ projectService.openClientFile(file2.path, file2.content);
1135
+ checkNumberOfProjects(projectService, { configuredProjects: 1 });
1136
+ assert.isUndefined(projectService.configuredProjects.get(config1.path));
1137
+ assert.isDefined(projectService.configuredProjects.get(config2.path));
1138
+
1078
1139
});
1079
1140
1080
1141
it("reload regular file after closing", () => {
@@ -1177,16 +1238,21 @@ namespace ts.projectSystem {
1177
1238
path: "/a/b/f1.ts",
1178
1239
content: "let x = 1"
1179
1240
};
1241
+ const file2 = {
1242
+ path: "/a/f2.ts",
1243
+ content: "let x = 1"
1244
+ };
1180
1245
const configFile = {
1181
1246
path: "/a/b/tsconfig.json",
1182
1247
content: JSON.stringify({ compilerOptions: {} })
1183
1248
};
1184
1249
const externalProjectName = "externalproject";
1185
- const host = createServerHost([file1, configFile]);
1250
+ const host = createServerHost([file1, file2, libFile, configFile]);
1186
1251
const projectService = createProjectService(host);
1187
1252
1188
1253
projectService.openClientFile(file1.path);
1189
1254
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1255
+ const project = projectService.configuredProjects.get(configFile.path);
1190
1256
1191
1257
projectService.openExternalProject({
1192
1258
rootFiles: toExternalFiles([configFile.path]),
@@ -1195,13 +1261,20 @@ namespace ts.projectSystem {
1195
1261
});
1196
1262
1197
1263
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1264
+ assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
1198
1265
1199
1266
projectService.closeExternalProject(externalProjectName);
1200
1267
// configured project is alive since file is still open
1201
1268
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1269
+ assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
1202
1270
1203
1271
projectService.closeClientFile(file1.path);
1204
- checkNumberOfProjects(projectService, {});
1272
+ checkNumberOfProjects(projectService, { configuredProjects: 1 });
1273
+ assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
1274
+
1275
+ projectService.openClientFile(file2.path);
1276
+ checkNumberOfProjects(projectService, { inferredProjects: 1 });
1277
+ assert.isUndefined(projectService.configuredProjects.get(configFile.path));
1205
1278
});
1206
1279
1207
1280
it("changes in closed files are reflected in project structure", () => {
@@ -1607,11 +1680,12 @@ namespace ts.projectSystem {
1607
1680
projectService.checkNumberOfProjects({ configuredProjects: 1 });
1608
1681
checkProjectActualFiles(configuredProjectAt(projectService, 0), [f1.path, config.path]);
1609
1682
1683
+ // Should close configured project with next file open
1610
1684
projectService.closeClientFile(f1.path);
1611
1685
1612
1686
projectService.openClientFile(f2.path);
1613
- projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: 1 });
1614
- checkProjectActualFiles(configuredProjectAt( projectService, 0), [f1.path, config.path] );
1687
+ projectService.checkNumberOfProjects({ inferredProjects: 1 });
1688
+ assert.isUndefined( projectService.configuredProjects.get( config.path) );
1615
1689
checkProjectActualFiles(projectService.inferredProjects[0], [f2.path]);
1616
1690
});
1617
1691
@@ -1910,15 +1984,16 @@ namespace ts.projectSystem {
1910
1984
1911
1985
projectService.openClientFile(file2.path);
1912
1986
checkNumberOfProjects(projectService, { configuredProjects: 1 });
1913
- const project1 = configuredProjectAt( projectService, 0 );
1987
+ const project1 = projectService.configuredProjects.get(tsconfig1.path );
1914
1988
assert.equal(project1.openRefCount, 1, "Open ref count in project1 - 1");
1915
1989
assert.equal(project1.getScriptInfo(file2.path).containingProjects.length, 1, "containing projects count");
1916
1990
1917
1991
projectService.openClientFile(file1.path);
1918
1992
checkNumberOfProjects(projectService, { configuredProjects: 2 });
1919
1993
assert.equal(project1.openRefCount, 2, "Open ref count in project1 - 2");
1994
+ assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
1920
1995
1921
- const project2 = configuredProjectAt( projectService, 1 );
1996
+ const project2 = projectService.configuredProjects.get(tsconfig2.path );
1922
1997
assert.equal(project2.openRefCount, 1, "Open ref count in project2 - 2");
1923
1998
1924
1999
assert.equal(project1.getScriptInfo(file1.path).containingProjects.length, 2, `${file1.path} containing projects count`);
@@ -1928,9 +2003,21 @@ namespace ts.projectSystem {
1928
2003
checkNumberOfProjects(projectService, { configuredProjects: 2 });
1929
2004
assert.equal(project1.openRefCount, 1, "Open ref count in project1 - 3");
1930
2005
assert.equal(project2.openRefCount, 1, "Open ref count in project2 - 3");
2006
+ assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
2007
+ assert.strictEqual(projectService.configuredProjects.get(tsconfig2.path), project2);
1931
2008
1932
2009
projectService.closeClientFile(file1.path);
1933
- checkNumberOfProjects(projectService, { configuredProjects: 0 });
2010
+ checkNumberOfProjects(projectService, { configuredProjects: 2 });
2011
+ assert.equal(project1.openRefCount, 0, "Open ref count in project1 - 4");
2012
+ assert.equal(project2.openRefCount, 0, "Open ref count in project2 - 4");
2013
+ assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
2014
+ assert.strictEqual(projectService.configuredProjects.get(tsconfig2.path), project2);
2015
+
2016
+ projectService.openClientFile(file2.path);
2017
+ checkNumberOfProjects(projectService, { configuredProjects: 1 });
2018
+ assert.strictEqual(projectService.configuredProjects.get(tsconfig1.path), project1);
2019
+ assert.isUndefined(projectService.configuredProjects.get(tsconfig2.path));
2020
+ assert.equal(project1.openRefCount, 1, "Open ref count in project1 - 5");
1934
2021
});
1935
2022
1936
2023
it("language service disabled state is updated in external projects", () => {
@@ -2000,14 +2087,18 @@ namespace ts.projectSystem {
2000
2087
const projectService = createProjectService(host);
2001
2088
projectService.openClientFile(f1.path);
2002
2089
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2090
+ const project = projectService.configuredProjects.get(config.path);
2003
2091
2004
2092
projectService.closeClientFile(f1.path);
2005
- projectService.checkNumberOfProjects({});
2093
+ projectService.checkNumberOfProjects({ configuredProjects: 1 });
2094
+ assert.strictEqual(projectService.configuredProjects.get(config.path), project);
2095
+ assert.equal(project.openRefCount, 0);
2006
2096
2007
2097
for (const f of [f1, f2, f3]) {
2008
2098
// There shouldnt be any script info as we closed the file that resulted in creation of it
2009
2099
const scriptInfo = projectService.getScriptInfoForNormalizedPath(server.toNormalizedPath(f.path));
2010
- assert.equal(scriptInfo.containingProjects.length, 0, `expect 0 containing projects for '${f.path}'`);
2100
+ assert.equal(scriptInfo.containingProjects.length, 1, `expect 1 containing projects for '${f.path}'`);
2101
+ assert.equal(scriptInfo.containingProjects[0], project, `expect configured project to be the only containing project for '${f.path}'`);
2011
2102
}
2012
2103
});
2013
2104
@@ -2551,12 +2642,18 @@ namespace ts.projectSystem {
2551
2642
const projectService = createProjectService(host);
2552
2643
projectService.openClientFile(f.path);
2553
2644
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2645
+ const project = projectService.configuredProjects.get(config.path);
2646
+ assert.equal(project.openRefCount, 1);
2554
2647
2555
2648
projectService.closeClientFile(f.path);
2556
- projectService.checkNumberOfProjects({ configuredProjects: 0 });
2649
+ projectService.checkNumberOfProjects({ configuredProjects: 1 });
2650
+ assert.strictEqual(projectService.configuredProjects.get(config.path), project);
2651
+ assert.equal(project.openRefCount, 0);
2557
2652
2558
2653
projectService.openClientFile(f.path);
2559
2654
projectService.checkNumberOfProjects({ configuredProjects: 1 });
2655
+ assert.strictEqual(projectService.configuredProjects.get(config.path), project);
2656
+ assert.equal(project.openRefCount, 1);
2560
2657
});
2561
2658
});
2562
2659
@@ -3237,12 +3334,10 @@ namespace ts.projectSystem {
3237
3334
const projectService = createProjectService(host);
3238
3335
projectService.openClientFile(file1.path);
3239
3336
host.runQueuedTimeoutCallbacks();
3240
- checkNumberOfConfiguredProjects(projectService, 1);
3337
+ // Since there is no file open from configFile it would be closed
3338
+ checkNumberOfConfiguredProjects(projectService, 0);
3241
3339
checkNumberOfInferredProjects(projectService, 1);
3242
3340
3243
- const configuredProject = configuredProjectAt(projectService, 0);
3244
- checkProjectActualFiles(configuredProject, [configFile.path]);
3245
-
3246
3341
const inferredProject = projectService.inferredProjects[0];
3247
3342
assert.isTrue(inferredProject.containsFile(<server.NormalizedPath>file1.path));
3248
3343
});
@@ -3271,7 +3366,8 @@ namespace ts.projectSystem {
3271
3366
const projectService = createProjectService(host);
3272
3367
3273
3368
projectService.openClientFile(f.path);
3274
- projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: 1 });
3369
+ // Since no file from the configured project is open, it would be closed immediately
3370
+ projectService.checkNumberOfProjects({ configuredProjects: 0, inferredProjects: 1 });
3275
3371
});
3276
3372
});
3277
3373
0 commit comments