in client/src/common/proposed.diagnostic.ts [438:536]
private createProvider(): vsdiag.DiagnosticProvider {
const result: vsdiag.DiagnosticProvider = {
onDidChangeDiagnostics: this.onDidChangeDiagnosticsEmitter.event,
provideDiagnostics: (textDocument, previousResultId, token) => {
const provideDiagnostics: ProvideDiagnosticSignature = (textDocument, previousResultId, token) => {
const params: Proposed.DocumentDiagnosticParams = {
identifier: this.options.identifier,
textDocument: { uri: this.client.code2ProtocolConverter.asUri(textDocument.uri) },
previousResultId: previousResultId
};
return this.client.sendRequest(Proposed.DocumentDiagnosticRequest.type, params, token).then((result) => {
if (result === undefined || result === null || this.isDisposed) {
return { kind: vsdiag.DocumentDiagnosticReportKind.full, items: [] };
}
if (result.kind === Proposed.DocumentDiagnosticReportKind.full) {
return { kind: vsdiag.DocumentDiagnosticReportKind.full, resultId: result.resultId, items: this.client.protocol2CodeConverter.asDiagnostics(result.items) };
} else {
return { kind: vsdiag.DocumentDiagnosticReportKind.unChanged, resultId: result.resultId };
}
}, (error) => {
return this.client.handleFailedRequest(Proposed.DocumentDiagnosticRequest.type, token, error, { kind: vsdiag.DocumentDiagnosticReportKind.full, items: [] });
});
};
const middleware: Middleware & DiagnosticProviderMiddleware = this.client.clientOptions.middleware!;
return middleware.provideDiagnostics
? middleware.provideDiagnostics(textDocument, previousResultId, token, provideDiagnostics)
: provideDiagnostics(textDocument, previousResultId, token);
}
};
if (this.options.workspaceDiagnostics) {
result.provideWorkspaceDiagnostics = (resultIds, token, resultReporter): ProviderResult<vsdiag.WorkspaceDiagnosticReport> => {
const convertReport = (report: Proposed.WorkspaceDocumentDiagnosticReport): vsdiag.WorkspaceDocumentDiagnosticReport => {
if (report.kind === Proposed.DocumentDiagnosticReportKind.full) {
return {
kind: vsdiag.DocumentDiagnosticReportKind.full,
uri: this.client.protocol2CodeConverter.asUri(report.uri),
resultId: report.resultId,
version: report.version,
items: this.client.protocol2CodeConverter.asDiagnostics(report.items)
};
} else {
return {
kind: vsdiag.DocumentDiagnosticReportKind.unChanged,
uri: this.client.protocol2CodeConverter.asUri(report.uri),
resultId: report.resultId,
version: report.version
};
}
};
const convertPreviousResultIds = (resultIds: vsdiag.PreviousResultId[]): Proposed.PreviousResultId[] => {
const converted: Proposed.PreviousResultId[] = [];
for (const item of resultIds) {
converted.push({ uri: this.client.code2ProtocolConverter.asUri(item.uri), value: item.value});
}
return converted;
};
const provideDiagnostics: ProvideWorkspaceDiagnosticSignature = (resultIds, token): ProviderResult<vsdiag.WorkspaceDiagnosticReport> => {
const partialResultToken: string = generateUuid();
const disposable = this.client.onProgress(Proposed.WorkspaceDiagnosticRequest.partialResult, partialResultToken, (partialResult) => {
if (partialResult === undefined || partialResult === null) {
resultReporter(null);
return;
}
const converted: vsdiag.WorkspaceDiagnosticReportPartialResult = {
items: []
};
for (const item of partialResult.items) {
converted.items.push(convertReport(item));
}
resultReporter(converted);
});
const params: Proposed.WorkspaceDiagnosticParams = {
identifier: this.options.identifier,
previousResultIds: convertPreviousResultIds(resultIds),
partialResultToken: partialResultToken
};
return this.client.sendRequest(Proposed.WorkspaceDiagnosticRequest.type, params, token).then((result): vsdiag.WorkspaceDiagnosticReport => {
const converted: vsdiag.WorkspaceDiagnosticReport = {
items: []
};
for (const item of result.items) {
converted.items.push(convertReport(item));
}
disposable.dispose();
resultReporter(converted);
return { items: [] };
}, (error) => {
disposable.dispose();
return this.client.handleFailedRequest(Proposed.DocumentDiagnosticRequest.type, token, error, { items: [] });
});
};
const middleware: Middleware & DiagnosticProviderMiddleware = this.client.clientOptions.middleware!;
return middleware.provideWorkspaceDiagnostics
? middleware.provideWorkspaceDiagnostics(resultIds, token, resultReporter, provideDiagnostics)
: provideDiagnostics(resultIds, token, resultReporter);
};
}
return result;
}