Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/common/contributions.ts
13394 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 { ILogService } from '../../platform/log/common/logService';
7
import { Disposable, isDisposable } from '../../util/vs/base/common/lifecycle';
8
import { StopWatch } from '../../util/vs/base/common/stopwatch';
9
import { IInstantiationService, ServicesAccessor } from '../../util/vs/platform/instantiation/common/instantiation';
10
11
export interface IExtensionContribution {
12
13
id?: string;
14
15
/**
16
* Dispose of the contribution.
17
*/
18
dispose?(): void;
19
20
/**
21
* A promise that the extension `activate` method will wait on before completing.
22
* USE this carefully as it will delay startup of our extension.
23
*/
24
activationBlocker?: Promise<void>;
25
}
26
27
export interface IExtensionContributionFactory {
28
create(accessor: ServicesAccessor): IExtensionContribution | void;
29
}
30
31
// eslint-disable-next-line @typescript-eslint/no-explicit-any
32
export function asContributionFactory(ctor: { new(...args: any): any }): IExtensionContributionFactory {
33
return {
34
create(accessor: ServicesAccessor): IExtensionContribution {
35
const instantiationService = accessor.get(IInstantiationService);
36
return instantiationService.createInstance(ctor);
37
}
38
};
39
}
40
41
export class ContributionCollection extends Disposable {
42
private readonly allActivationBlockers: Promise<void>[] = [];
43
44
constructor(
45
contribs: IExtensionContributionFactory[],
46
@ILogService logService: ILogService,
47
@IInstantiationService instaService: IInstantiationService,
48
) {
49
super();
50
51
for (const contribution of contribs) {
52
let instance: IExtensionContribution | void | undefined;
53
try {
54
instance = instaService.invokeFunction(contribution.create);
55
56
if (isDisposable(instance)) {
57
this._register(instance);
58
}
59
60
if (instance?.activationBlocker) {
61
const sw = StopWatch.create();
62
const id = instance.id || 'UNKNOWN';
63
this.allActivationBlockers.push(instance.activationBlocker.finally(() => {
64
logService.info(`activationBlocker from '${id}' took for ${Math.round(sw.elapsed())}ms`);
65
}));
66
}
67
} catch (error) {
68
logService.error(error, `Error while loading contribution`);
69
}
70
}
71
}
72
73
async waitForActivationBlockers(): Promise<void> {
74
// WAIT for all activation blockers to complete
75
await Promise.allSettled(this.allActivationBlockers);
76
}
77
}
78
79