diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 73db958d30c..072dfa2d087 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -13,7 +13,7 @@ import * as os from 'os'; import * as electron from './utils/electron'; import { Reader } from './utils/wireProtocol'; -import { workspace, window, Uri, CancellationToken, Disposable, OutputChannel, Memento, MessageItem, QuickPickItem, EventEmitter, Event, commands, WorkspaceConfiguration } from 'vscode'; +import { workspace, window, extensions, Uri, CancellationToken, Disposable, OutputChannel, Memento, MessageItem, QuickPickItem, EventEmitter, Event, commands, WorkspaceConfiguration } from 'vscode'; import * as Proto from './protocol'; import { ITypescriptServiceClient, ITypescriptServiceClientHost, API } from './typescriptService'; @@ -121,6 +121,11 @@ interface MyMessageItem extends MessageItem { id: MessageAction; } +interface TypeScriptServerPlugin { + path: string; + name: string; +} + export default class TypeScriptServiceClient implements ITypescriptServiceClient { private static useWorkspaceTsdkStorageKey = 'typescript.useWorkspaceTsdk'; @@ -578,6 +583,14 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } + if (this.apiVersion.has230Features()) { + const plugins = this.getContributedTypeScriptServerPlugins(); + if (plugins.length) { + args.push('--globalPlugins', plugins.map(x => x.name).join(',')); + args.push('--pluginProbeLocations', plugins.map(x => x.path).join(',')); + } + } + electron.fork(modulePath, args, options, (err: any, childProcess: cp.ChildProcess) => { if (err) { this.lastError = err; @@ -816,6 +829,22 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient return desc.version; } + private getContributedTypeScriptServerPlugins(): TypeScriptServerPlugin[] { + const plugins: TypeScriptServerPlugin[] = []; + for (const extension of extensions.all) { + const pack = extension.packageJSON; + if (pack.contributes && pack.contributes.typescriptServerPlugins && Array.isArray(pack.contributes.typescriptServerPlugins)) { + for (const plugin of pack.contributes.typescriptServerPlugins) { + plugins.push({ + name: plugin.name, + path: extension.extensionPath + }); + } + } + } + return plugins; + } + private serviceExited(restart: boolean): void { this.servicePromise = null; Object.keys(this.callbacks).forEach((key) => {