/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import type * as vscode from 'vscode'; import { CancellationToken } from 'vs/base/common/cancellation'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostQuickDiffShape, IMainContext, MainContext, MainThreadQuickDiffShape } from 'vs/workbench/api/common/extHost.protocol'; import { asPromise } from 'vs/base/common/async'; import { DocumentSelector } from 'vs/workbench/api/common/extHostTypeConverters'; import { IURITransformer } from 'vs/base/common/uriIpc'; export class ExtHostQuickDiff implements ExtHostQuickDiffShape { private static handlePool: number = 0; private proxy: MainThreadQuickDiffShape; private providers: Map = new Map(); constructor( mainContext: IMainContext, private readonly uriTransformer: IURITransformer | undefined ) { this.proxy = mainContext.getProxy(MainContext.MainThreadQuickDiff); } $provideOriginalResource(handle: number, uriComponents: UriComponents, token: CancellationToken): Promise { const uri = URI.revive(uriComponents); const provider = this.providers.get(handle); if (!provider) { return Promise.resolve(null); } return asPromise(() => provider.provideOriginalResource!(uri, token)) .then(r => r || null); } registerQuickDiffProvider(selector: vscode.DocumentSelector, quickDiffProvider: vscode.QuickDiffProvider, label: string, rootUri?: vscode.Uri): vscode.Disposable { const handle = ExtHostQuickDiff.handlePool++; this.providers.set(handle, quickDiffProvider); this.proxy.$registerQuickDiffProvider(handle, DocumentSelector.from(selector, this.uriTransformer), label, rootUri); return { dispose: () => { this.proxy.$unregisterQuickDiffProvider(handle); this.providers.delete(handle); } }; } }