@eclipse-glsp/client
Version:
A sprotty-based client for GLSP
133 lines • 6.23 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FeedbackActionDispatcher = exports.feedbackFeature = void 0;
/********************************************************************************
* Copyright (c) 2019-2024 EclipseSource and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
const sprotty_1 = require("@eclipse-glsp/sprotty");
const inversify_1 = require("inversify");
const feedback_command_1 = require("./feedback-command");
const feedback_emitter_1 = require("./feedback-emitter");
exports.feedbackFeature = Symbol('feedbackFeature');
let FeedbackActionDispatcher = class FeedbackActionDispatcher {
constructor() {
this.registeredFeedback = new Map();
this.isDisposed = false;
}
registerFeedback(feedbackEmitter, feedbackActions, cleanupActions) {
if (feedbackEmitter instanceof sprotty_1.GModelElement) {
this.logger.log(this,
// eslint-disable-next-line max-len
'GModelElements as feedback emitters are discouraged, as they usually change between model updates and are considered unstable.');
}
if (feedbackActions.length > 0) {
this.registeredFeedback.set(feedbackEmitter, feedbackActions);
this.dispatchFeedback(feedbackActions, feedbackEmitter);
}
return sprotty_1.Disposable.create(() => this.deregisterFeedback(feedbackEmitter, cleanupActions));
}
deregisterFeedback(feedbackEmitter, cleanupActions) {
this.registeredFeedback.delete(feedbackEmitter);
const actions = sprotty_1.MaybeActions.asArray(cleanupActions);
if (actions.length > 0) {
this.dispatchFeedback(actions, feedbackEmitter);
}
}
getRegisteredFeedback() {
const result = [];
this.registeredFeedback.forEach(actions => result.push(...actions));
return result;
}
getRegisteredFeedbackEmitters(action) {
const result = [];
this.registeredFeedback.forEach((actions, emitter) => {
if (actions.includes(action)) {
result.push(emitter);
}
});
return result;
}
getFeedbackCommands() {
return this.getRegisteredFeedback()
.flatMap(action => this.actionToCommands(action))
.sort((left, right) => (0, feedback_command_1.getFeedbackRank)(left) - (0, feedback_command_1.getFeedbackRank)(right));
}
async applyFeedbackCommands(context) {
var _a;
const feedbackCommands = (_a = this.getFeedbackCommands()) !== null && _a !== void 0 ? _a : [];
if ((feedbackCommands === null || feedbackCommands === void 0 ? void 0 : feedbackCommands.length) > 0) {
const results = feedbackCommands.map(command => command.execute(context));
await Promise.all(results);
}
}
actionToCommands(action) {
var _a;
return ((_a = this.actionHandlerRegistry
.get(action.kind)
.filter((0, sprotty_1.toTypeGuard)(sprotty_1.CommandActionHandler))
.map(handler => handler.handle(action))) !== null && _a !== void 0 ? _a : []);
}
createEmitter() {
return new feedback_emitter_1.FeedbackEmitter(this);
}
async dispatchFeedback(actions, feedbackEmitter) {
try {
if (this.isDisposed) {
return;
}
await this.actionDispatcher.dispatchAll(actions);
this.logger.info(this, `Dispatched feedback actions for ${feedbackEmitter}`);
}
catch (reason) {
this.logger.error(this, 'Failed to dispatch feedback actions', reason);
}
}
dispose() {
this.registeredFeedback.clear();
this.isDisposed = true;
}
};
exports.FeedbackActionDispatcher = FeedbackActionDispatcher;
__decorate([
(0, inversify_1.inject)(sprotty_1.TYPES.IActionDispatcher),
__metadata("design:type", Object)
], FeedbackActionDispatcher.prototype, "actionDispatcher", void 0);
__decorate([
(0, inversify_1.inject)(sprotty_1.TYPES.ILogger),
__metadata("design:type", Object)
], FeedbackActionDispatcher.prototype, "logger", void 0);
__decorate([
(0, inversify_1.inject)(sprotty_1.ActionHandlerRegistry),
__metadata("design:type", sprotty_1.ActionHandlerRegistry)
], FeedbackActionDispatcher.prototype, "actionHandlerRegistry", void 0);
__decorate([
(0, inversify_1.preDestroy)(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], FeedbackActionDispatcher.prototype, "dispose", null);
exports.FeedbackActionDispatcher = FeedbackActionDispatcher = __decorate([
(0, inversify_1.injectable)()
], FeedbackActionDispatcher);
//# sourceMappingURL=feedback-action-dispatcher.js.map