159 lines
5.5 KiB
JavaScript
159 lines
5.5 KiB
JavaScript
"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;
|