UNPKG

vscode-languageclient

Version:
142 lines (141 loc) 5.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ProgressPart = void 0; /* -------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. * ------------------------------------------------------------------------------------------ */ const vscode_1 = require("vscode"); const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol"); const Is = __importStar(require("./utils/is")); class ProgressPart { _client; _token; _infinite; _reported; // listener for LSP progress messages. Set in constructor. _lspProgressDisposable; // VS Code progress state. Set in Window.withProgress callback. _progress; _cancellationToken; _tokenDisposable; _resolve; _reject; constructor(_client, _token, done) { this._client = _client; this._token = _token; this._reported = 0; this._infinite = false; this._lspProgressDisposable = this._client.onProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, (value) => { switch (value.kind) { case 'begin': this.begin(value); break; case 'report': this.report(value); break; case 'end': this.done(); done && done(this); break; } }); } begin(params) { this._infinite = params.percentage === undefined; // the progress as already been marked as done / canceled. Ignore begin call if (this._lspProgressDisposable === undefined) { return; } // Since we don't use commands this will be a silent window progress with a hidden notification. void vscode_1.window.withProgress({ location: vscode_1.ProgressLocation.Window, cancellable: params.cancellable, title: params.title }, async (progress, cancellationToken) => { // the progress as already been marked as done / canceled. Ignore begin call if (this._lspProgressDisposable === undefined) { return; } this._progress = progress; this._cancellationToken = cancellationToken; this._tokenDisposable = this._cancellationToken.onCancellationRequested(() => { this._client.sendNotification(vscode_languageserver_protocol_1.WorkDoneProgressCancelNotification.type, { token: this._token }); }); this.report(params); return new Promise((resolve, reject) => { this._resolve = resolve; this._reject = reject; }); }); } report(params) { if (this._infinite && Is.string(params.message)) { this._progress !== undefined && this._progress.report({ message: params.message }); } else if (Is.number(params.percentage)) { const percentage = Math.max(0, Math.min(params.percentage, 100)); const delta = Math.max(0, percentage - this._reported); this._reported += delta; this._progress !== undefined && this._progress.report({ message: params.message, increment: delta }); } } cancel() { this.cleanup(); if (this._reject !== undefined) { this._reject(); this._resolve = undefined; this._reject = undefined; } } done() { this.cleanup(); if (this._resolve !== undefined) { this._resolve(); this._resolve = undefined; this._reject = undefined; } } cleanup() { if (this._lspProgressDisposable !== undefined) { this._lspProgressDisposable.dispose(); this._lspProgressDisposable = undefined; } if (this._tokenDisposable !== undefined) { this._tokenDisposable.dispose(); this._tokenDisposable = undefined; } this._progress = undefined; this._cancellationToken = undefined; } } exports.ProgressPart = ProgressPart;