From b411c086465b7b606ed9c2c5abcf6d8ef5ad21d7 Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 27 May 2021 16:25:11 +0800 Subject: [PATCH] Allows plugin to register commands --- src/server/project.ts | 10 ++++++++++ src/server/session.ts | 1 + 2 files changed, 11 insertions(+) diff --git a/src/server/project.ts b/src/server/project.ts index ef48ebf530bc2..29d070766671b 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -90,6 +90,7 @@ namespace ts.server { export interface PluginModule { create(createInfo: PluginCreateInfo): LanguageService; getExternalFiles?(proj: Project): string[]; + getProtocolHandlers?(): [command: string, handler: (request: protocol.Request) => HandlerResponse][] onConfigurationChanged?(config: any): void; } @@ -240,6 +241,15 @@ namespace ts.server { return result.module; } + public setupCustomProtocolHandlers (cb: (command: string, handler: (request: protocol.Request) => HandlerResponse) => void) { + this.plugins.forEach(plugin => { + const handlers = plugin.module.getProtocolHandlers?.(); + handlers?.forEach(([name, handler]) => { + cb(name, handler) + }) + }) + } + /*@internal*/ readonly currentDirectory: string; diff --git a/src/server/session.ts b/src/server/session.ts index ee2b7a243994c..0b273f40bf982 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -839,6 +839,7 @@ namespace ts.server { break; case ProjectLoadingFinishEvent: const { project: finishProject } = event.data; + finishProject.setupCustomProtocolHandlers(this.addProtocolHandler.bind(this)); this.event({ projectName: finishProject.getProjectName() }, ProjectLoadingFinishEvent); break; case LargeFileReferencedEvent: