diff --git a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts index 1e0d59f1057..101f75425d3 100644 --- a/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts +++ b/extensions/typescript-language-features/src/typeScriptServiceClientHost.ts @@ -97,23 +97,31 @@ export default class TypeScriptServiceClientHost extends Disposable { this.client.onReady(() => { const languages = new Set(); for (const plugin of pluginManager.plugins) { - for (const language of plugin.languages) { - languages.add(language); + if (plugin.configNamespace && plugin.languages.length) { + this.registerExtensionLanguageProvider({ + id: plugin.configNamespace, + modeIds: Array.from(plugin.languages), + diagnosticSource: 'ts-plugin', + diagnosticLanguage: DiagnosticLanguage.TypeScript, + diagnosticOwner: 'typescript', + isExternal: true + }, onCompletionAccepted); + } else { + for (const language of plugin.languages) { + languages.add(language); + } } } + if (languages.size) { - const description: LanguageDescription = { + this.registerExtensionLanguageProvider({ id: 'typescript-plugins', modeIds: Array.from(languages.values()), diagnosticSource: 'ts-plugin', diagnosticLanguage: DiagnosticLanguage.TypeScript, diagnosticOwner: 'typescript', isExternal: true - }; - const manager = new LanguageProvider(this.client, description, this.commandManager, this.client.telemetryReporter, this.typingsStatus, this.fileConfigurationManager, onCompletionAccepted); - this.languages.push(manager); - this._register(manager); - this.languagePerId.set(description.id, manager); + }, onCompletionAccepted); } }); @@ -125,6 +133,13 @@ export default class TypeScriptServiceClientHost extends Disposable { this.configurationChanged(); } + private registerExtensionLanguageProvider(description: LanguageDescription, onCompletionAccepted: (item: vscode.CompletionItem) => void) { + const manager = new LanguageProvider(this.client, description, this.commandManager, this.client.telemetryReporter, this.typingsStatus, this.fileConfigurationManager, onCompletionAccepted); + this.languages.push(manager); + this._register(manager); + this.languagePerId.set(description.id, manager); + } + private getAllModeIds(descriptions: LanguageDescription[], pluginManager: PluginManager) { const allModeIds = flatten([ ...descriptions.map(x => x.modeIds), diff --git a/extensions/typescript-language-features/src/utils/plugins.ts b/extensions/typescript-language-features/src/utils/plugins.ts index 71ce2430cb8..6d0708b15db 100644 --- a/extensions/typescript-language-features/src/utils/plugins.ts +++ b/extensions/typescript-language-features/src/utils/plugins.ts @@ -12,6 +12,7 @@ export interface TypeScriptServerPlugin { readonly name: string; readonly enableForWorkspaceTypeScriptVersions: boolean; readonly languages: ReadonlyArray; + readonly configNamespace?: string } namespace TypeScriptServerPlugin { @@ -77,6 +78,7 @@ export class PluginManager extends Disposable { enableForWorkspaceTypeScriptVersions: !!plugin.enableForWorkspaceTypeScriptVersions, path: extension.extensionPath, languages: Array.isArray(plugin.languages) ? plugin.languages : [], + configNamespace: plugin.configNamespace, }); } if (plugins.length) { @@ -86,4 +88,4 @@ export class PluginManager extends Disposable { } return pluginMap; } -} \ No newline at end of file +}