Skip to content

Commit 24a6e50

Browse files
committed
added tests
1 parent 74d3881 commit 24a6e50

4 files changed

Lines changed: 54 additions & 16 deletions

File tree

src/server/editorServices.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ namespace ts.server {
167167
return undefined;
168168
}
169169
if (isInferredProjectName(projectName)) {
170-
return forEach(this.inferredProjects, p => p.getProjectName() === projectName && p);
170+
return findProjectByName(projectName, this.inferredProjects);
171171
}
172172
return this.findExternalProjectByProjectName(projectName) || this.findConfiguredProjectByProjectName(toNormalizedPath(projectName));
173173
}
@@ -209,17 +209,19 @@ namespace ts.server {
209209

210210
info.detachAllProjects();
211211

212+
if (!this.eventHandler) {
213+
return;
214+
}
215+
212216
for (const openFile of this.openFileRoots) {
213-
if (this.eventHandler) {
214-
this.eventHandler("context", openFile.getDefaultProject(), openFile.fileName);
215-
}
217+
this.eventHandler("context", openFile.getDefaultProject(), openFile.fileName);
216218
}
217219

218220
for (const openFile of this.openFilesReferenced) {
219-
if (this.eventHandler) {
220-
this.eventHandler("context", openFile.getDefaultProject(), openFile.fileName);
221-
}
221+
this.eventHandler("context", openFile.getDefaultProject(), openFile.fileName);
222222
}
223+
224+
// TODO: project system view is inconsistent
223225
}
224226

225227
this.printProjects();

src/server/lsHost.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ namespace ts.server {
8989
}
9090

9191
getDefaultLibFileName() {
92-
const nodeModuleBinDir = ts.getDirectoryPath(ts.normalizePath(this.host.getExecutingFilePath()));
93-
return ts.combinePaths(nodeModuleBinDir, ts.getDefaultLibFileName(this.compilationSettings));
92+
const nodeModuleBinDir = getDirectoryPath(normalizePath(this.host.getExecutingFilePath()));
93+
return combinePaths(nodeModuleBinDir, getDefaultLibFileName(this.compilationSettings));
9494
}
9595

9696
getScriptSnapshot(filename: string): ts.IScriptSnapshot {

src/server/project.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ namespace ts.server {
1919
}
2020

2121
export abstract class Project {
22-
private readonly rootFiles: ScriptInfo[] = [];
23-
private readonly rootFilesMap: FileMap<ScriptInfo> = createFileMap<ScriptInfo>();
22+
private rootFiles: ScriptInfo[] = [];
23+
private rootFilesMap: FileMap<ScriptInfo> = createFileMap<ScriptInfo>();
2424
private lsHost: ServerLanguageServiceHost;
2525
private program: ts.Program;
2626

@@ -96,11 +96,24 @@ namespace ts.server {
9696
abstract getProjectName(): string;
9797

9898
close() {
99-
for (const fileName of this.getFileNames()) {
100-
const info = this.projectService.getScriptInfoForNormalizedPath(fileName);
101-
info.detachFromProject(this);
99+
if (this.program) {
100+
// if we have a program - release all files that are enlisted in program
101+
for (const f of this.program.getSourceFiles()) {
102+
const info = this.projectService.getScriptInfo(f.fileName);
103+
info.detachFromProject(this);
104+
}
105+
}
106+
else {
107+
// release all root files
108+
for (const root of this.rootFiles) {
109+
root.detachFromProject(this);
110+
}
102111
}
103-
// signal language service to release files acquired from document registry
112+
this.rootFiles = undefined;
113+
this.rootFilesMap = undefined;
114+
this.program = undefined;
115+
116+
// signal language service to release source files acquired from document registry
104117
this.languageService.dispose();
105118
}
106119

@@ -137,7 +150,7 @@ namespace ts.server {
137150
}
138151

139152
containsScriptInfo(info: ScriptInfo): boolean {
140-
return this.program && this.program.getSourceFileByPath(info.path) !== undefined;
153+
return this.isRoot(info) || (this.program && this.program.getSourceFileByPath(info.path) !== undefined);
141154
}
142155

143156
containsFile(filename: NormalizedPath, requireOpen?: boolean) {

tests/cases/unittests/tsserverProjectSystem.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,5 +698,28 @@ namespace ts {
698698
checkNumberOfInferredProjects(projectService, 1);
699699
checkProjectActualFiles(projectService.inferredProjects[0], [file2.path, file3.path, libFile.path]);
700700
});
701+
702+
it ("should close configured project after closing last open file", () => {
703+
const file1 = {
704+
path: "/a/b/main.ts",
705+
content: "let x =1;"
706+
};
707+
const configFile: FileOrFolder = {
708+
path: "/a/b/tsconfig.json",
709+
content: `{
710+
"compilerOptions": {
711+
"target": "es6"
712+
},
713+
"files": [ "main.ts" ]
714+
}`
715+
};
716+
const host = createServerHost({ fileOrFolderList: [file1, configFile, libFile], libFile });
717+
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true);
718+
projectService.openClientFile(file1.path);
719+
checkNumberOfConfiguredProjects(projectService, 1);
720+
721+
projectService.closeClientFile(file1.path);
722+
checkNumberOfConfiguredProjects(projectService, 0);
723+
})
701724
});
702725
}

0 commit comments

Comments
 (0)