From d5643344e1d022d11cbe33a9ed7b4ea05bc8d2b8 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Wed, 24 May 2023 16:37:56 -0700 Subject: [PATCH] Sort and filter share providers (#183377) --- src/vs/workbench/api/browser/mainThreadShare.ts | 3 ++- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostShare.ts | 2 +- src/vs/workbench/contrib/share/browser/shareService.ts | 5 ++++- src/vs/workbench/contrib/share/common/share.ts | 1 + 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadShare.ts b/src/vs/workbench/api/browser/mainThreadShare.ts index 60f86f96ed07a..c1ab121b0079a 100644 --- a/src/vs/workbench/api/browser/mainThreadShare.ts +++ b/src/vs/workbench/api/browser/mainThreadShare.ts @@ -24,11 +24,12 @@ export class MainThreadShare implements MainThreadShareShape { this.proxy = extHostContext.getProxy(ExtHostContext.ExtHostShare); } - $registerShareProvider(handle: number, selector: IDocumentFilterDto[], id: string, label: string): void { + $registerShareProvider(handle: number, selector: IDocumentFilterDto[], id: string, label: string, priority: number): void { const provider: IShareProvider = { id, label, selector, + priority, provideShare: async (item: IShareableItem) => { return URI.revive(await this.proxy.$provideShare(handle, item, new CancellationTokenSource().token)); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 438fa03cd44c4..785e83b8b8a5a 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1265,7 +1265,7 @@ export interface MainThreadSearchShape extends IDisposable { } export interface MainThreadShareShape extends IDisposable { - $registerShareProvider(handle: number, selector: IDocumentFilterDto[], id: string, label: string): void; + $registerShareProvider(handle: number, selector: IDocumentFilterDto[], id: string, label: string, priority: number): void; $unregisterShareProvider(handle: number): void; } diff --git a/src/vs/workbench/api/common/extHostShare.ts b/src/vs/workbench/api/common/extHostShare.ts index 15acba45c478c..618fe17138ffd 100644 --- a/src/vs/workbench/api/common/extHostShare.ts +++ b/src/vs/workbench/api/common/extHostShare.ts @@ -32,7 +32,7 @@ export class ExtHostShare implements ExtHostShareShape { registerShareProvider(selector: vscode.DocumentSelector, provider: vscode.ShareProvider): vscode.Disposable { const handle = ExtHostShare.handlePool++; this.providers.set(handle, provider); - this.proxy.$registerShareProvider(handle, DocumentSelector.from(selector, this.uriTransformer), provider.id, provider.label); + this.proxy.$registerShareProvider(handle, DocumentSelector.from(selector, this.uriTransformer), provider.id, provider.label, provider.priority); return { dispose: () => { this.proxy.$unregisterShareProvider(handle); diff --git a/src/vs/workbench/contrib/share/browser/shareService.ts b/src/vs/workbench/contrib/share/browser/shareService.ts index 8e471a1593f22..6fe98f2a5b0e1 100644 --- a/src/vs/workbench/contrib/share/browser/shareService.ts +++ b/src/vs/workbench/contrib/share/browser/shareService.ts @@ -6,6 +6,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; +import { score } from 'vs/editor/common/languageSelector'; import { localize } from 'vs/nls'; import { ISubmenuItem } from 'vs/platform/actions/common/actions'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -46,7 +47,9 @@ export class ShareService implements IShareService { } async provideShare(item: IShareableItem, token: CancellationToken): Promise { - const providers = [...this._providers.values()]; + const providers = [...this._providers.values()] + .filter((p) => score(p.selector, item.resourceUri, '', true, undefined, undefined) > 0) + .sort((a, b) => a.priority - b.priority); if (providers.length === 0) { return undefined; diff --git a/src/vs/workbench/contrib/share/common/share.ts b/src/vs/workbench/contrib/share/common/share.ts index dcde5d780adce..b389d71c38b3a 100644 --- a/src/vs/workbench/contrib/share/common/share.ts +++ b/src/vs/workbench/contrib/share/common/share.ts @@ -19,6 +19,7 @@ export interface IShareableItem { export interface IShareProvider { readonly id: string; readonly label: string; + readonly priority: number; readonly selector: LanguageSelector; prepareShare?(item: IShareableItem, token: CancellationToken): Thenable; provideShare(item: IShareableItem, token: CancellationToken): Thenable;