in server/src/session.ts [534:568]
private async sendPendingDiagnostics(files: string[], reason: string) {
for (let i = 0; i < files.length; ++i) {
const fileName = files[i];
const result = this.getLSAndScriptInfo(fileName);
if (!result) {
continue;
}
const label = `${reason} - getSemanticDiagnostics for ${fileName}`;
if (isDebugMode) {
console.time(label);
}
const diagnostics = result.languageService.getSemanticDiagnostics(fileName);
if (isDebugMode) {
console.timeEnd(label);
}
// Need to send diagnostics even if it's empty otherwise editor state will
// not be updated.
this.connection.sendDiagnostics({
uri: filePathToUri(fileName),
diagnostics: diagnostics.map(d => tsDiagnosticToLspDiagnostic(d, result.scriptInfo)),
});
if (this.diagnosticsTimeout) {
// There is a pending request to check diagnostics for all open files,
// so stop this one immediately.
return;
}
if (i < files.length - 1) {
// If this is not the last file, yield so that pending I/O events get a
// chance to run. This will open an opportunity for the server to process
// incoming requests. The next file will be checked in the next iteration
// of the event loop.
await setImmediateP();
}
}
}