Fix #5430: Use FileMap instead of a simple Map for storing file list in tsserver
This commit is contained in:
parent
0aef9440f2
commit
0d71ec3120
|
@ -86,17 +86,19 @@ namespace ts.server {
|
|||
export class LSHost implements ts.LanguageServiceHost {
|
||||
ls: ts.LanguageService = null;
|
||||
compilationSettings: ts.CompilerOptions;
|
||||
filenameToScript: ts.Map<ScriptInfo> = {};
|
||||
filenameToScript: ts.FileMap<ScriptInfo>;
|
||||
roots: ScriptInfo[] = [];
|
||||
private resolvedModuleNames: ts.FileMap<Map<TimestampedResolvedModule>>;
|
||||
private moduleResolutionHost: ts.ModuleResolutionHost;
|
||||
|
||||
constructor(public host: ServerHost, public project: Project) {
|
||||
this.resolvedModuleNames = ts.createFileMap<Map<TimestampedResolvedModule>>(ts.createGetCanonicalFileName(host.useCaseSensitiveFileNames))
|
||||
var getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames);
|
||||
this.resolvedModuleNames = createFileMap<Map<TimestampedResolvedModule>>(getCanonicalFileName);
|
||||
this.filenameToScript = createFileMap<ScriptInfo>(getCanonicalFileName);
|
||||
this.moduleResolutionHost = {
|
||||
fileExists: fileName => this.fileExists(fileName),
|
||||
readFile: fileName => this.host.readFile(fileName)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
resolveModuleNames(moduleNames: string[], containingFile: string): ResolvedModule[] {
|
||||
|
@ -199,36 +201,32 @@ namespace ts.server {
|
|||
|
||||
removeReferencedFile(info: ScriptInfo) {
|
||||
if (!info.isOpen) {
|
||||
this.filenameToScript[info.fileName] = undefined;
|
||||
this.filenameToScript.remove(info.fileName);
|
||||
this.resolvedModuleNames.remove(info.fileName);
|
||||
}
|
||||
}
|
||||
|
||||
getScriptInfo(filename: string): ScriptInfo {
|
||||
var scriptInfo = ts.lookUp(this.filenameToScript, filename);
|
||||
var scriptInfo = this.filenameToScript.get(filename);
|
||||
if (!scriptInfo) {
|
||||
scriptInfo = this.project.openReferencedFile(filename);
|
||||
if (scriptInfo) {
|
||||
this.filenameToScript[scriptInfo.fileName] = scriptInfo;
|
||||
this.filenameToScript.set(scriptInfo.fileName, scriptInfo);
|
||||
}
|
||||
}
|
||||
else {
|
||||
}
|
||||
return scriptInfo;
|
||||
}
|
||||
|
||||
addRoot(info: ScriptInfo) {
|
||||
var scriptInfo = ts.lookUp(this.filenameToScript, info.fileName);
|
||||
if (!scriptInfo) {
|
||||
this.filenameToScript[info.fileName] = info;
|
||||
if (!this.filenameToScript.contains(info.fileName)) {
|
||||
this.filenameToScript.set(info.fileName, info);
|
||||
this.roots.push(info);
|
||||
}
|
||||
}
|
||||
|
||||
removeRoot(info: ScriptInfo) {
|
||||
var scriptInfo = ts.lookUp(this.filenameToScript, info.fileName);
|
||||
if (scriptInfo) {
|
||||
this.filenameToScript[info.fileName] = undefined;
|
||||
if (!this.filenameToScript.contains(info.fileName)) {
|
||||
this.filenameToScript.remove(info.fileName);
|
||||
this.roots = copyListRemovingItem(info, this.roots);
|
||||
this.resolvedModuleNames.remove(info.fileName);
|
||||
}
|
||||
|
@ -279,7 +277,7 @@ namespace ts.server {
|
|||
* @param line 1 based index
|
||||
*/
|
||||
lineToTextSpan(filename: string, line: number): ts.TextSpan {
|
||||
var script: ScriptInfo = this.filenameToScript[filename];
|
||||
var script: ScriptInfo = this.filenameToScript.get(filename);
|
||||
var index = script.snap().index;
|
||||
|
||||
var lineInfo = index.lineNumberToInfo(line + 1);
|
||||
|
@ -299,7 +297,7 @@ namespace ts.server {
|
|||
* @param offset 1 based index
|
||||
*/
|
||||
lineOffsetToPosition(filename: string, line: number, offset: number): number {
|
||||
var script: ScriptInfo = this.filenameToScript[filename];
|
||||
var script: ScriptInfo = this.filenameToScript.get(filename);
|
||||
var index = script.snap().index;
|
||||
|
||||
var lineInfo = index.lineNumberToInfo(line);
|
||||
|
@ -312,7 +310,7 @@ namespace ts.server {
|
|||
* @param offset 1-based index
|
||||
*/
|
||||
positionToLineOffset(filename: string, position: number): ILineInfo {
|
||||
var script: ScriptInfo = this.filenameToScript[filename];
|
||||
var script: ScriptInfo = this.filenameToScript.get(filename);
|
||||
var index = script.snap().index;
|
||||
var lineOffset = index.charOffsetToLineNumberAndPos(position);
|
||||
return { line: lineOffset.line, offset: lineOffset.offset + 1 };
|
||||
|
@ -386,7 +384,7 @@ namespace ts.server {
|
|||
}
|
||||
|
||||
getFileNames() {
|
||||
let sourceFiles = this.program.getSourceFiles();
|
||||
var sourceFiles = this.program.getSourceFiles();
|
||||
return sourceFiles.map(sourceFile => sourceFile.fileName);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue