Skip to content

Commit b2ce6db

Browse files
author
zhengbli
committed
Add API for project level GetErr
1 parent 42bff6b commit b2ce6db

3 files changed

Lines changed: 83 additions & 5 deletions

File tree

src/server/editorServices.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ namespace ts.server {
304304
return this.projectService.openFile(filename, false);
305305
}
306306

307-
getFileNameList() {
307+
getFileNames() {
308308
let sourceFiles = this.program.getSourceFiles();
309309
return sourceFiles.map(sourceFile => sourceFile.fileName);
310310
}

src/server/protocol.d.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ declare namespace ts.server.protocol {
116116
/**
117117
* The list of normalized file name in the project, including 'lib.d.ts'
118118
*/
119-
fileNameList?: string[];
119+
fileNames?: string[];
120120
}
121121

122122
/**
@@ -854,6 +854,31 @@ declare namespace ts.server.protocol {
854854
export interface SignatureHelpResponse extends Response {
855855
body?: SignatureHelpItems;
856856
}
857+
858+
/**
859+
* Arguments for geterrForProject request.
860+
*/
861+
export interface GeterrForProjectRequestArgs {
862+
/**
863+
* the file requesting project error list
864+
*/
865+
file: string;
866+
867+
/**
868+
* Delay in milliseconds to wait before starting to compute
869+
* errors for the files in the file list
870+
*/
871+
delay: number;
872+
}
873+
874+
/**
875+
* GeterrForProjectRequest request; value of command field is
876+
* "geterrForProject". It works similarly with 'Geterr', only
877+
* it request for every file in this project.
878+
*/
879+
export interface GeterrForProjectRequest extends Request {
880+
arguments: GeterrForProjectRequestArgs
881+
}
857882

858883
/**
859884
* Arguments for geterr messages.

src/server/session.ts

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ namespace ts.server {
8686
export const Format = "format";
8787
export const Formatonkey = "formatonkey";
8888
export const Geterr = "geterr";
89+
export const GeterrForProject = "geterrForProject";
8990
export const NavBar = "navbar";
9091
export const Navto = "navto";
9192
export const Occurrences = "occurrences";
@@ -344,15 +345,15 @@ namespace ts.server {
344345
}
345346

346347
getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo {
347-
fileName = ts.normalizePath(fileName)
348-
let project = this.projectService.getProjectForFile(fileName)
348+
fileName = ts.normalizePath(fileName);
349+
let project = this.projectService.getProjectForFile(fileName);
349350

350351
let projectInfo: protocol.ProjectInfo = {
351352
configFileName: project.projectFilename
352353
}
353354

354355
if (needFileNameList) {
355-
projectInfo.fileNameList = project.getFileNameList();
356+
projectInfo.fileNames = project.getFileNames();
356357
}
357358

358359
return projectInfo;
@@ -836,6 +837,51 @@ namespace ts.server {
836837
}));
837838
}
838839

840+
getDiagnosticsForProject(delay: number, fileName: string) {
841+
let { configFileName, fileNames: fileNamesInProject } = this.getProjectInfo(fileName, true);
842+
// No need to analyze lib.d.ts
843+
fileNamesInProject = fileNamesInProject.filter((value, index, array) => value.indexOf("lib.d.ts") < 0);
844+
845+
// Sort the file name list to make the recently touched files come first
846+
let highPriorityFiles: string[] = [];
847+
let mediumPriorityFiles: string[] = [];
848+
let lowPriorityFiles: string[] = [];
849+
let veryLowPriorityFiles: string[] = [];
850+
let normalizedFileName = ts.normalizePath(fileName);
851+
let project = this.projectService.getProjectForFile(normalizedFileName);
852+
for (let fileNameInProject of fileNamesInProject) {
853+
if (this.getCanonicalFileName(fileNameInProject) == this.getCanonicalFileName(fileName))
854+
highPriorityFiles.push(fileNameInProject);
855+
else {
856+
let info = this.projectService.getScriptInfo(fileNameInProject);
857+
if (!info || !info.isOpen) {
858+
if (fileNameInProject.indexOf(".d.ts") > 0)
859+
veryLowPriorityFiles.push(fileNameInProject);
860+
else
861+
lowPriorityFiles.push(fileNameInProject);
862+
}
863+
else
864+
mediumPriorityFiles.push(fileNameInProject);
865+
}
866+
}
867+
868+
fileNamesInProject = highPriorityFiles.concat(mediumPriorityFiles).concat(lowPriorityFiles).concat(veryLowPriorityFiles);
869+
870+
if (fileNamesInProject.length > 0) {
871+
let checkList = fileNamesInProject.map<PendingErrorCheck>((fileName: string) => {
872+
let normalizedFileName = ts.normalizePath(fileName);
873+
return { fileName: normalizedFileName, project };
874+
});
875+
this.updateErrorCheck(checkList, this.changeSeq, (n) => n == this.changeSeq, delay);
876+
}
877+
}
878+
879+
getCanonicalFileName(fileName: string) {
880+
let name = this.host.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
881+
this.logger.info(ts.normalizePath(name));
882+
return ts.normalizePath(name);
883+
}
884+
839885
exit() {
840886
}
841887

@@ -919,6 +965,13 @@ namespace ts.server {
919965
responseRequired = false;
920966
break;
921967
}
968+
case CommandNames.GeterrForProject: {
969+
this.logger.info(request.arguments);
970+
let { file, delay } = <protocol.GeterrForProjectRequestArgs>request.arguments;
971+
response = this.getDiagnosticsForProject(delay, file);
972+
responseRequired = false;
973+
break;
974+
}
922975
case CommandNames.Change: {
923976
var changeArgs = <protocol.ChangeRequestArgs>request.arguments;
924977
this.change(changeArgs.line, changeArgs.offset, changeArgs.endLine, changeArgs.endOffset,

0 commit comments

Comments
 (0)