Skip to content

Commit 0d71ec3

Browse files
committed
Fix #5430: Use FileMap instead of a simple Map for storing file list in tsserver
1 parent 0aef944 commit 0d71ec3

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

src/server/editorServices.ts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,19 @@ namespace ts.server {
8686
export class LSHost implements ts.LanguageServiceHost {
8787
ls: ts.LanguageService = null;
8888
compilationSettings: ts.CompilerOptions;
89-
filenameToScript: ts.Map<ScriptInfo> = {};
89+
filenameToScript: ts.FileMap<ScriptInfo>;
9090
roots: ScriptInfo[] = [];
9191
private resolvedModuleNames: ts.FileMap<Map<TimestampedResolvedModule>>;
9292
private moduleResolutionHost: ts.ModuleResolutionHost;
9393

9494
constructor(public host: ServerHost, public project: Project) {
95-
this.resolvedModuleNames = ts.createFileMap<Map<TimestampedResolvedModule>>(ts.createGetCanonicalFileName(host.useCaseSensitiveFileNames))
95+
var getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames);
96+
this.resolvedModuleNames = createFileMap<Map<TimestampedResolvedModule>>(getCanonicalFileName);
97+
this.filenameToScript = createFileMap<ScriptInfo>(getCanonicalFileName);
9698
this.moduleResolutionHost = {
9799
fileExists: fileName => this.fileExists(fileName),
98100
readFile: fileName => this.host.readFile(fileName)
99-
}
101+
};
100102
}
101103

102104
resolveModuleNames(moduleNames: string[], containingFile: string): ResolvedModule[] {
@@ -199,36 +201,32 @@ namespace ts.server {
199201

200202
removeReferencedFile(info: ScriptInfo) {
201203
if (!info.isOpen) {
202-
this.filenameToScript[info.fileName] = undefined;
204+
this.filenameToScript.remove(info.fileName);
203205
this.resolvedModuleNames.remove(info.fileName);
204206
}
205207
}
206208

207209
getScriptInfo(filename: string): ScriptInfo {
208-
var scriptInfo = ts.lookUp(this.filenameToScript, filename);
210+
var scriptInfo = this.filenameToScript.get(filename);
209211
if (!scriptInfo) {
210212
scriptInfo = this.project.openReferencedFile(filename);
211213
if (scriptInfo) {
212-
this.filenameToScript[scriptInfo.fileName] = scriptInfo;
214+
this.filenameToScript.set(scriptInfo.fileName, scriptInfo);
213215
}
214216
}
215-
else {
216-
}
217217
return scriptInfo;
218218
}
219219

220220
addRoot(info: ScriptInfo) {
221-
var scriptInfo = ts.lookUp(this.filenameToScript, info.fileName);
222-
if (!scriptInfo) {
223-
this.filenameToScript[info.fileName] = info;
221+
if (!this.filenameToScript.contains(info.fileName)) {
222+
this.filenameToScript.set(info.fileName, info);
224223
this.roots.push(info);
225224
}
226225
}
227226

228227
removeRoot(info: ScriptInfo) {
229-
var scriptInfo = ts.lookUp(this.filenameToScript, info.fileName);
230-
if (scriptInfo) {
231-
this.filenameToScript[info.fileName] = undefined;
228+
if (!this.filenameToScript.contains(info.fileName)) {
229+
this.filenameToScript.remove(info.fileName);
232230
this.roots = copyListRemovingItem(info, this.roots);
233231
this.resolvedModuleNames.remove(info.fileName);
234232
}
@@ -279,7 +277,7 @@ namespace ts.server {
279277
* @param line 1 based index
280278
*/
281279
lineToTextSpan(filename: string, line: number): ts.TextSpan {
282-
var script: ScriptInfo = this.filenameToScript[filename];
280+
var script: ScriptInfo = this.filenameToScript.get(filename);
283281
var index = script.snap().index;
284282

285283
var lineInfo = index.lineNumberToInfo(line + 1);
@@ -299,7 +297,7 @@ namespace ts.server {
299297
* @param offset 1 based index
300298
*/
301299
lineOffsetToPosition(filename: string, line: number, offset: number): number {
302-
var script: ScriptInfo = this.filenameToScript[filename];
300+
var script: ScriptInfo = this.filenameToScript.get(filename);
303301
var index = script.snap().index;
304302

305303
var lineInfo = index.lineNumberToInfo(line);
@@ -312,7 +310,7 @@ namespace ts.server {
312310
* @param offset 1-based index
313311
*/
314312
positionToLineOffset(filename: string, position: number): ILineInfo {
315-
var script: ScriptInfo = this.filenameToScript[filename];
313+
var script: ScriptInfo = this.filenameToScript.get(filename);
316314
var index = script.snap().index;
317315
var lineOffset = index.charOffsetToLineNumberAndPos(position);
318316
return { line: lineOffset.line, offset: lineOffset.offset + 1 };
@@ -386,7 +384,7 @@ namespace ts.server {
386384
}
387385

388386
getFileNames() {
389-
let sourceFiles = this.program.getSourceFiles();
387+
var sourceFiles = this.program.getSourceFiles();
390388
return sourceFiles.map(sourceFile => sourceFile.fileName);
391389
}
392390

0 commit comments

Comments
 (0)