in src/typescript/languageFeatures.ts [286:342]
private async _doValidate(model: editor.ITextModel): Promise<void> {
const worker = await this._worker(model.uri);
if (model.isDisposed()) {
// model was disposed in the meantime
return;
}
const promises: Promise<Diagnostic[]>[] = [];
const { noSyntaxValidation, noSemanticValidation, noSuggestionDiagnostics } =
this._defaults.getDiagnosticsOptions();
if (!noSyntaxValidation) {
promises.push(worker.getSyntacticDiagnostics(model.uri.toString()));
}
if (!noSemanticValidation) {
promises.push(worker.getSemanticDiagnostics(model.uri.toString()));
}
if (!noSuggestionDiagnostics) {
promises.push(worker.getSuggestionDiagnostics(model.uri.toString()));
}
const allDiagnostics = await Promise.all(promises);
if (!allDiagnostics || model.isDisposed()) {
// model was disposed in the meantime
return;
}
const diagnostics = allDiagnostics
.reduce((p, c) => c.concat(p), [])
.filter(
(d) =>
(this._defaults.getDiagnosticsOptions().diagnosticCodesToIgnore || []).indexOf(d.code) ===
-1
);
// Fetch lib files if necessary
const relatedUris = diagnostics
.map((d) => d.relatedInformation || [])
.reduce((p, c) => c.concat(p), [])
.map((relatedInformation) =>
relatedInformation.file ? Uri.parse(relatedInformation.file.fileName) : null
);
await this._libFiles.fetchLibFilesIfNecessary(relatedUris);
if (model.isDisposed()) {
// model was disposed in the meantime
return;
}
editor.setModelMarkers(
model,
this._selector,
diagnostics.map((d) => this._convertDiagnostics(model, d))
);
}