UNPKG

@eclipse-glsp/client

Version:

A sprotty-based client for GLSP

133 lines 6.23 kB
"use strict"; 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