mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-19 01:25:36 -05:00
* Revert "Revert "Merge from vscode merge-base (#22769)" (#22779)"
This reverts commit 47a1745180.
* Fix notebook download task
* Remove done call from extensions-ci
109 lines
3.9 KiB
TypeScript
109 lines
3.9 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { CancellationToken, Connection, Diagnostic, Disposable, DocumentDiagnosticParams, DocumentDiagnosticReport, DocumentDiagnosticReportKind, TextDocuments } from 'vscode-languageserver';
|
|
import { TextDocument } from 'vscode-css-languageservice';
|
|
import { formatError, runSafeAsync } from './runner';
|
|
import { RuntimeEnvironment } from '../cssServer';
|
|
|
|
export type Validator = (textDocument: TextDocument) => Promise<Diagnostic[]>;
|
|
export type DiagnosticsSupport = {
|
|
dispose(): void;
|
|
requestRefresh(): void;
|
|
};
|
|
|
|
export function registerDiagnosticsPushSupport(documents: TextDocuments<TextDocument>, connection: Connection, runtime: RuntimeEnvironment, validate: Validator): DiagnosticsSupport {
|
|
|
|
const pendingValidationRequests: { [uri: string]: Disposable } = {};
|
|
const validationDelayMs = 500;
|
|
|
|
const disposables: Disposable[] = [];
|
|
|
|
// The content of a text document has changed. This event is emitted
|
|
// when the text document first opened or when its content has changed.
|
|
documents.onDidChangeContent(change => {
|
|
triggerValidation(change.document);
|
|
}, undefined, disposables);
|
|
|
|
// a document has closed: clear all diagnostics
|
|
documents.onDidClose(event => {
|
|
cleanPendingValidation(event.document);
|
|
connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] });
|
|
}, undefined, disposables);
|
|
|
|
function cleanPendingValidation(textDocument: TextDocument): void {
|
|
const request = pendingValidationRequests[textDocument.uri];
|
|
if (request) {
|
|
request.dispose();
|
|
delete pendingValidationRequests[textDocument.uri];
|
|
}
|
|
}
|
|
|
|
function triggerValidation(textDocument: TextDocument): void {
|
|
cleanPendingValidation(textDocument);
|
|
const request = pendingValidationRequests[textDocument.uri] = runtime.timer.setTimeout(async () => {
|
|
if (request === pendingValidationRequests[textDocument.uri]) {
|
|
try {
|
|
const diagnostics = await validate(textDocument);
|
|
if (request === pendingValidationRequests[textDocument.uri]) {
|
|
connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });
|
|
}
|
|
delete pendingValidationRequests[textDocument.uri];
|
|
} catch (e) {
|
|
connection.console.error(formatError(`Error while validating ${textDocument.uri}`, e));
|
|
}
|
|
}
|
|
}, validationDelayMs);
|
|
}
|
|
|
|
return {
|
|
requestRefresh: () => {
|
|
documents.all().forEach(triggerValidation);
|
|
},
|
|
dispose: () => {
|
|
disposables.forEach(d => d.dispose());
|
|
disposables.length = 0;
|
|
const keys = Object.keys(pendingValidationRequests);
|
|
for (const key of keys) {
|
|
pendingValidationRequests[key].dispose();
|
|
delete pendingValidationRequests[key];
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
export function registerDiagnosticsPullSupport(documents: TextDocuments<TextDocument>, connection: Connection, runtime: RuntimeEnvironment, validate: Validator): DiagnosticsSupport {
|
|
|
|
function newDocumentDiagnosticReport(diagnostics: Diagnostic[]): DocumentDiagnosticReport {
|
|
return {
|
|
kind: DocumentDiagnosticReportKind.Full,
|
|
items: diagnostics
|
|
};
|
|
}
|
|
|
|
const registration = connection.languages.diagnostics.on(async (params: DocumentDiagnosticParams, token: CancellationToken) => {
|
|
return runSafeAsync(runtime, async () => {
|
|
const document = documents.get(params.textDocument.uri);
|
|
if (document) {
|
|
return newDocumentDiagnosticReport(await validate(document));
|
|
}
|
|
return newDocumentDiagnosticReport([]);
|
|
|
|
}, newDocumentDiagnosticReport([]), `Error while computing diagnostics for ${params.textDocument.uri}`, token);
|
|
});
|
|
|
|
function requestRefresh(): void {
|
|
connection.languages.diagnostics.refresh();
|
|
}
|
|
|
|
return {
|
|
requestRefresh,
|
|
dispose: () => {
|
|
registration.dispose();
|
|
}
|
|
};
|
|
|
|
}
|