From ea132428610eb4b9b31360c7978e01d9cb3e445a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 12 Nov 2024 09:01:19 -0800 Subject: [PATCH] Extract interface and fix dispose for TS related files (#233705) The array is updated async so we can't spread it in the return type --- .../src/languageFeatures/copilotRelated.ts | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/extensions/typescript-language-features/src/languageFeatures/copilotRelated.ts b/extensions/typescript-language-features/src/languageFeatures/copilotRelated.ts index 632b04798cb..24e4e7074e5 100644 --- a/extensions/typescript-language-features/src/languageFeatures/copilotRelated.ts +++ b/extensions/typescript-language-features/src/languageFeatures/copilotRelated.ts @@ -13,6 +13,23 @@ import { conditionalRegistration, requireMinVersion } from './util/dependentRegi const minVersion = API.v570; +interface CopilotApi { + registerRelatedFilesProvider(providerId: { + extensionId: string; + languageId: string; + }, callback: (uri: vscode.Uri, context: { + flags: Record; + }, cancellationToken: vscode.CancellationToken) => Promise<{ + entries: vscode.Uri[]; + traits?: Array<{ + name: string; + value: string; + includeInPrompt?: boolean; + promptTextOverride?: string; + }>; + }>): vscode.Disposable; +} + export function register( selector: DocumentSelector, client: ITypeScriptServiceClient, @@ -24,21 +41,10 @@ export function register( if (!ext) { return new vscode.Disposable(() => { }); } + const disposers: vscode.Disposable[] = []; ext.activate().then(() => { - const relatedAPI = ext.exports as { - registerRelatedFilesProvider( - providerId: { extensionId: string; languageId: string }, - callback: ( - uri: vscode.Uri, - context: { flags: Record }, - cancellationToken: vscode.CancellationToken - ) => Promise<{ - entries: vscode.Uri[]; - traits?: Array<{ name: string; value: string; includeInPrompt?: boolean; promptTextOverride?: string }>; - }> - ): vscode.Disposable; - } | undefined; + const relatedAPI = ext.exports as CopilotApi | undefined; if (relatedAPI?.registerRelatedFilesProvider) { for (const syntax of selector.syntax) { if (!syntax.language) { @@ -79,6 +85,13 @@ export function register( } } }); - return vscode.Disposable.from(...disposers); + + return { + dispose: () => { + for (const disposer of disposers) { + disposer.dispose(); + } + } + }; }); }