From 3f930c796da2e970bac107c3e1c656d561784b76 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 25 Apr 2017 14:46:01 -0700 Subject: [PATCH] Properly gate type definition and implementation providers for TS changes. Fixes #24548 --- extensions/typescript/src/typescriptMain.ts | 41 +++++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 186f4c73d0d..08a4771ee99 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -152,6 +152,8 @@ class LanguageProvider { private readonly disposables: Disposable[] = []; + private versionDependentDisposables: Disposable[] = []; + constructor( private readonly client: TypeScriptServiceClient, private readonly description: LanguageDescription @@ -193,6 +195,13 @@ class LanguageProvider { } } + while (this.versionDependentDisposables.length) { + const obj = this.versionDependentDisposables.pop(); + if (obj) { + obj.dispose(); + } + } + this.typingsStatus.dispose(); this.currentDiagnostics.dispose(); this.bufferSyncSupport.dispose(); @@ -235,13 +244,7 @@ class LanguageProvider { this.disposables.push(languages.registerCodeActionsProvider(selector, new CodeActionProvider(client, this.description.id))); - if (client.apiVersion.has220Features()) { - this.disposables.push(languages.registerImplementationProvider(selector, new ImplementationProvider(client))); - } - - if (client.apiVersion.has213Features()) { - this.disposables.push(languages.registerTypeDefinitionProvider(selector, new TypeDefintionProvider(client))); - } + this.registerVersionDependentProviders(); this.description.modeIds.forEach(modeId => { this.disposables.push(languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(client, modeId))); @@ -363,6 +366,30 @@ class LanguageProvider { this.syntaxDiagnostics = Object.create(null); this.bufferSyncSupport.reOpenDocuments(); this.bufferSyncSupport.requestAllDiagnostics(); + this.registerVersionDependentProviders(); + } + + private registerVersionDependentProviders(): void { + while (this.versionDependentDisposables.length) { + const obj = this.versionDependentDisposables.pop(); + if (obj) { + obj.dispose(); + } + } + + this.versionDependentDisposables = []; + if (!this.client) { + return; + } + + const selector = this.description.modeIds; + if (this.client.apiVersion.has220Features()) { + this.versionDependentDisposables.push(languages.registerImplementationProvider(selector, new ImplementationProvider(this.client))); + } + + if (this.client.apiVersion.has213Features()) { + this.versionDependentDisposables.push(languages.registerTypeDefinitionProvider(selector, new TypeDefintionProvider(this.client))); + } } public triggerAllDiagnostics(): void {