Skip to content

Commit 92a48d8

Browse files
author
Andy
authored
Improve error message when scriptInfo is missing in mapTextChangeToCodeEdit (#28258)
* Improve error message when scriptInfo is missing in mapTextChangeToCodeEdit * Include both fileName and path, and use in more places * Move logErrorForScriptInfoNotFound to editorServices.ts * Update API
1 parent ce85ee5 commit 92a48d8

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

Diff for: src/server/editorServices.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ namespace ts.server {
867867
private doEnsureDefaultProjectForFile(fileName: NormalizedPath): Project {
868868
this.ensureProjectStructuresUptoDate();
869869
const scriptInfo = this.getScriptInfoForNormalizedPath(fileName);
870-
return scriptInfo ? scriptInfo.getDefaultProject() : Errors.ThrowNoProject();
870+
return scriptInfo ? scriptInfo.getDefaultProject() : (this.logErrorForScriptInfoNotFound(fileName), Errors.ThrowNoProject());
871871
}
872872

873873
getScriptInfoEnsuringProjectsUptoDate(uncheckedFileName: string) {
@@ -1966,6 +1966,12 @@ namespace ts.server {
19661966
return configProject && configProject.getCompilerOptions().configFile;
19671967
}
19681968

1969+
/* @internal */
1970+
logErrorForScriptInfoNotFound(fileName: string): void {
1971+
const names = arrayFrom(this.filenameToScriptInfo.entries()).map(([path, scriptInfo]) => ({ path, fileName: scriptInfo.fileName }));
1972+
this.logger.msg(`Could not find file ${JSON.stringify(fileName)}.\nAll files are: ${JSON.stringify(names)}`, Msg.Err);
1973+
}
1974+
19691975
/**
19701976
* Returns the projects that contain script info through SymLink
19711977
* Note that this does not return projects in info.containingProjects

Diff for: src/server/session.ts

+15-10
Original file line numberDiff line numberDiff line change
@@ -1157,14 +1157,17 @@ namespace ts.server {
11571157
this.projectService.getScriptInfoEnsuringProjectsUptoDate(args.file) :
11581158
this.projectService.getScriptInfo(args.file);
11591159
if (!scriptInfo) {
1160-
return ignoreNoProjectError ? emptyArray : Errors.ThrowNoProject();
1160+
if (ignoreNoProjectError) return emptyArray;
1161+
this.projectService.logErrorForScriptInfoNotFound(args.file);
1162+
return Errors.ThrowNoProject();
11611163
}
11621164
projects = scriptInfo.containingProjects;
11631165
symLinkedProjects = this.projectService.getSymlinkedProjects(scriptInfo);
11641166
}
11651167
// filter handles case when 'projects' is undefined
11661168
projects = filter(projects, p => p.languageServiceEnabled && !p.isOrphan());
11671169
if (!ignoreNoProjectError && (!projects || !projects.length) && !symLinkedProjects) {
1170+
this.projectService.logErrorForScriptInfoNotFound(args.file);
11681171
return Errors.ThrowNoProject();
11691172
}
11701173
return symLinkedProjects ? { projects: projects!, symLinkedProjects } : projects!; // TODO: GH#18217
@@ -1908,8 +1911,17 @@ namespace ts.server {
19081911
return textChanges.map(change => this.mapTextChangeToCodeEdit(change));
19091912
}
19101913

1911-
private mapTextChangeToCodeEdit(change: FileTextChanges): protocol.FileCodeEdits {
1912-
return mapTextChangesToCodeEdits(change, this.projectService.getScriptInfoOrConfig(change.fileName));
1914+
private mapTextChangeToCodeEdit(textChanges: FileTextChanges): protocol.FileCodeEdits {
1915+
const scriptInfo = this.projectService.getScriptInfoOrConfig(textChanges.fileName);
1916+
if (!!textChanges.isNewFile === !!scriptInfo) {
1917+
if (!scriptInfo) { // and !isNewFile
1918+
this.projectService.logErrorForScriptInfoNotFound(textChanges.fileName);
1919+
}
1920+
Debug.fail("Expected isNewFile for (only) new files. " + JSON.stringify({ isNewFile: !!textChanges.isNewFile, hasScriptInfo: !!scriptInfo }));
1921+
}
1922+
return scriptInfo
1923+
? { fileName: textChanges.fileName, textChanges: textChanges.textChanges.map(textChange => convertTextChangeToCodeEdit(textChange, scriptInfo)) }
1924+
: convertNewFileTextChangeToCodeEdit(textChanges);
19131925
}
19141926

19151927
private convertTextChangeToCodeEdit(change: TextChange, scriptInfo: ScriptInfo): protocol.CodeEdit {
@@ -2431,13 +2443,6 @@ namespace ts.server {
24312443
return { file: fileName, start: scriptInfo.positionToLineOffset(textSpan.start), end: scriptInfo.positionToLineOffset(textSpanEnd(textSpan)) };
24322444
}
24332445

2434-
function mapTextChangesToCodeEdits(textChanges: FileTextChanges, scriptInfo: ScriptInfoOrConfig | undefined): protocol.FileCodeEdits {
2435-
Debug.assert(!!textChanges.isNewFile === !scriptInfo, "Expected isNewFile for (only) new files", () => JSON.stringify({ isNewFile: !!textChanges.isNewFile, hasScriptInfo: !!scriptInfo }));
2436-
return scriptInfo
2437-
? { fileName: textChanges.fileName, textChanges: textChanges.textChanges.map(textChange => convertTextChangeToCodeEdit(textChange, scriptInfo)) }
2438-
: convertNewFileTextChangeToCodeEdit(textChanges);
2439-
}
2440-
24412446
function convertTextChangeToCodeEdit(change: TextChange, scriptInfo: ScriptInfoOrConfig): protocol.CodeEdit {
24422447
return { start: positionToLineOffset(scriptInfo, change.span.start), end: positionToLineOffset(scriptInfo, textSpanEnd(change.span)), newText: change.newText };
24432448
}

0 commit comments

Comments
 (0)