Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { BugIndicatingError } from '../../../../base/common/errors.js';
7
import { IValueWithChangeEvent } from '../../../../base/common/event.js';
8
import { IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
9
import { URI } from '../../../../base/common/uri.js';
10
import { ContextKeyValue } from '../../../../platform/contextkey/common/contextkey.js';
11
import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';
12
13
export const IMultiDiffSourceResolverService = createDecorator<IMultiDiffSourceResolverService>('multiDiffSourceResolverService');
14
15
export interface IMultiDiffSourceResolverService {
16
readonly _serviceBrand: undefined;
17
18
registerResolver(resolver: IMultiDiffSourceResolver): IDisposable;
19
20
resolve(uri: URI): Promise<IResolvedMultiDiffSource | undefined>;
21
}
22
23
export interface IMultiDiffSourceResolver {
24
canHandleUri(uri: URI): boolean;
25
26
resolveDiffSource(uri: URI): Promise<IResolvedMultiDiffSource>;
27
}
28
29
export interface IResolvedMultiDiffSource {
30
readonly resources: IValueWithChangeEvent<readonly MultiDiffEditorItem[]>;
31
readonly contextKeys?: Record<string, ContextKeyValue>;
32
}
33
34
export class MultiDiffEditorItem {
35
constructor(
36
readonly originalUri: URI | undefined,
37
readonly modifiedUri: URI | undefined,
38
readonly goToFileUri: URI | undefined,
39
readonly goToFileEditorTitle?: string | undefined,
40
readonly contextKeys?: Record<string, ContextKeyValue>
41
) {
42
if (!originalUri && !modifiedUri) {
43
throw new BugIndicatingError('Invalid arguments');
44
}
45
}
46
47
getKey(): string {
48
return JSON.stringify([this.modifiedUri?.toString(), this.originalUri?.toString()]);
49
}
50
}
51
52
export class MultiDiffSourceResolverService implements IMultiDiffSourceResolverService {
53
public readonly _serviceBrand: undefined;
54
55
private readonly _resolvers = new Set<IMultiDiffSourceResolver>();
56
57
registerResolver(resolver: IMultiDiffSourceResolver): IDisposable {
58
// throw on duplicate
59
if (this._resolvers.has(resolver)) {
60
throw new BugIndicatingError('Duplicate resolver');
61
}
62
this._resolvers.add(resolver);
63
return toDisposable(() => this._resolvers.delete(resolver));
64
}
65
66
resolve(uri: URI): Promise<IResolvedMultiDiffSource | undefined> {
67
for (const resolver of this._resolvers) {
68
if (resolver.canHandleUri(uri)) {
69
return resolver.resolveDiffSource(uri);
70
}
71
}
72
return Promise.resolve(undefined);
73
}
74
}
75
76