- Hover provider showing entity information and type - Go-to-definition (F12) for entity references - Basic IFC file validation (ISO-10303-21 header check) - Entity parsing with regex-based detection - Proper CommonJS module system (avoiding ES module issues) This replaces the broken baseline from ifc-developer-tools which had: - Non-functional ES module configuration - Circular dependency issues - Parser crashes - Non-working PositionVisitor Built on Microsoft's LSP example template for a clean, maintainable foundation. Next: Add hierarchical entity dependency tree in hover tooltip."
96 lines
3.9 KiB
JavaScript
96 lines
3.9 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.ProgressPart = void 0;
|
|
const vscode_1 = require("vscode");
|
|
const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol");
|
|
const Is = require("./utils/is");
|
|
class ProgressPart {
|
|
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;
|