"use strict"; /* -------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. * ------------------------------------------------------------------------------------------ */ Object.defineProperty(exports, "__esModule", { value: true }); exports.attachPartialResult = exports.ProgressFeature = exports.attachWorkDone = void 0; const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol"); const uuid_1 = require("./utils/uuid"); class WorkDoneProgressReporterImpl { constructor(_connection, _token) { this._connection = _connection; this._token = _token; WorkDoneProgressReporterImpl.Instances.set(this._token, this); } begin(title, percentage, message, cancellable) { let param = { kind: 'begin', title, percentage, message, cancellable }; this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, param); } report(arg0, arg1) { let param = { kind: 'report' }; if (typeof arg0 === 'number') { param.percentage = arg0; if (arg1 !== undefined) { param.message = arg1; } } else { param.message = arg0; } this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, param); } done() { WorkDoneProgressReporterImpl.Instances.delete(this._token); this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, { kind: 'end' }); } } WorkDoneProgressReporterImpl.Instances = new Map(); class WorkDoneProgressServerReporterImpl extends WorkDoneProgressReporterImpl { constructor(connection, token) { super(connection, token); this._source = new vscode_languageserver_protocol_1.CancellationTokenSource(); } get token() { return this._source.token; } done() { this._source.dispose(); super.done(); } cancel() { this._source.cancel(); } } class NullProgressReporter { constructor() { } begin() { } report() { } done() { } } class NullProgressServerReporter extends NullProgressReporter { constructor() { super(); this._source = new vscode_languageserver_protocol_1.CancellationTokenSource(); } get token() { return this._source.token; } done() { this._source.dispose(); } cancel() { this._source.cancel(); } } function attachWorkDone(connection, params) { if (params === undefined || params.workDoneToken === undefined) { return new NullProgressReporter(); } const token = params.workDoneToken; delete params.workDoneToken; return new WorkDoneProgressReporterImpl(connection, token); } exports.attachWorkDone = attachWorkDone; const ProgressFeature = (Base) => { return class extends Base { constructor() { super(); this._progressSupported = false; } initialize(capabilities) { super.initialize(capabilities); if (capabilities?.window?.workDoneProgress === true) { this._progressSupported = true; this.connection.onNotification(vscode_languageserver_protocol_1.WorkDoneProgressCancelNotification.type, (params) => { let progress = WorkDoneProgressReporterImpl.Instances.get(params.token); if (progress instanceof WorkDoneProgressServerReporterImpl || progress instanceof NullProgressServerReporter) { progress.cancel(); } }); } } attachWorkDoneProgress(token) { if (token === undefined) { return new NullProgressReporter(); } else { return new WorkDoneProgressReporterImpl(this.connection, token); } } createWorkDoneProgress() { if (this._progressSupported) { const token = (0, uuid_1.generateUuid)(); return this.connection.sendRequest(vscode_languageserver_protocol_1.WorkDoneProgressCreateRequest.type, { token }).then(() => { const result = new WorkDoneProgressServerReporterImpl(this.connection, token); return result; }); } else { return Promise.resolve(new NullProgressServerReporter()); } } }; }; exports.ProgressFeature = ProgressFeature; var ResultProgress; (function (ResultProgress) { ResultProgress.type = new vscode_languageserver_protocol_1.ProgressType(); })(ResultProgress || (ResultProgress = {})); class ResultProgressReporterImpl { constructor(_connection, _token) { this._connection = _connection; this._token = _token; } report(data) { this._connection.sendProgress(ResultProgress.type, this._token, data); } } function attachPartialResult(connection, params) { if (params === undefined || params.partialResultToken === undefined) { return undefined; } const token = params.partialResultToken; delete params.partialResultToken; return new ResultProgressReporterImpl(connection, token); } exports.attachPartialResult = attachPartialResult;