Path: blob/main/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { BugIndicatingError } from '../../../../base/common/errors.js';6import { IValueWithChangeEvent } from '../../../../base/common/event.js';7import { IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';8import { URI } from '../../../../base/common/uri.js';9import { ContextKeyValue } from '../../../../platform/contextkey/common/contextkey.js';10import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';1112export const IMultiDiffSourceResolverService = createDecorator<IMultiDiffSourceResolverService>('multiDiffSourceResolverService');1314export interface IMultiDiffSourceResolverService {15readonly _serviceBrand: undefined;1617registerResolver(resolver: IMultiDiffSourceResolver): IDisposable;1819resolve(uri: URI): Promise<IResolvedMultiDiffSource | undefined>;20}2122export interface IMultiDiffSourceResolver {23canHandleUri(uri: URI): boolean;2425resolveDiffSource(uri: URI): Promise<IResolvedMultiDiffSource>;26}2728export interface IResolvedMultiDiffSource {29readonly resources: IValueWithChangeEvent<readonly MultiDiffEditorItem[]>;30readonly contextKeys?: Record<string, ContextKeyValue>;31}3233export class MultiDiffEditorItem {34constructor(35readonly originalUri: URI | undefined,36readonly modifiedUri: URI | undefined,37readonly goToFileUri: URI | undefined,38readonly goToFileEditorTitle?: string | undefined,39readonly contextKeys?: Record<string, ContextKeyValue>40) {41if (!originalUri && !modifiedUri) {42throw new BugIndicatingError('Invalid arguments');43}44}4546getKey(): string {47return JSON.stringify([this.modifiedUri?.toString(), this.originalUri?.toString()]);48}49}5051export class MultiDiffSourceResolverService implements IMultiDiffSourceResolverService {52public readonly _serviceBrand: undefined;5354private readonly _resolvers = new Set<IMultiDiffSourceResolver>();5556registerResolver(resolver: IMultiDiffSourceResolver): IDisposable {57// throw on duplicate58if (this._resolvers.has(resolver)) {59throw new BugIndicatingError('Duplicate resolver');60}61this._resolvers.add(resolver);62return toDisposable(() => this._resolvers.delete(resolver));63}6465resolve(uri: URI): Promise<IResolvedMultiDiffSource | undefined> {66for (const resolver of this._resolvers) {67if (resolver.canHandleUri(uri)) {68return resolver.resolveDiffSource(uri);69}70}71return Promise.resolve(undefined);72}73}747576