Path: blob/main/extensions/copilot/src/extension/common/contributions.ts
13394 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 { ILogService } from '../../platform/log/common/logService';6import { Disposable, isDisposable } from '../../util/vs/base/common/lifecycle';7import { StopWatch } from '../../util/vs/base/common/stopwatch';8import { IInstantiationService, ServicesAccessor } from '../../util/vs/platform/instantiation/common/instantiation';910export interface IExtensionContribution {1112id?: string;1314/**15* Dispose of the contribution.16*/17dispose?(): void;1819/**20* A promise that the extension `activate` method will wait on before completing.21* USE this carefully as it will delay startup of our extension.22*/23activationBlocker?: Promise<void>;24}2526export interface IExtensionContributionFactory {27create(accessor: ServicesAccessor): IExtensionContribution | void;28}2930// eslint-disable-next-line @typescript-eslint/no-explicit-any31export function asContributionFactory(ctor: { new(...args: any): any }): IExtensionContributionFactory {32return {33create(accessor: ServicesAccessor): IExtensionContribution {34const instantiationService = accessor.get(IInstantiationService);35return instantiationService.createInstance(ctor);36}37};38}3940export class ContributionCollection extends Disposable {41private readonly allActivationBlockers: Promise<void>[] = [];4243constructor(44contribs: IExtensionContributionFactory[],45@ILogService logService: ILogService,46@IInstantiationService instaService: IInstantiationService,47) {48super();4950for (const contribution of contribs) {51let instance: IExtensionContribution | void | undefined;52try {53instance = instaService.invokeFunction(contribution.create);5455if (isDisposable(instance)) {56this._register(instance);57}5859if (instance?.activationBlocker) {60const sw = StopWatch.create();61const id = instance.id || 'UNKNOWN';62this.allActivationBlockers.push(instance.activationBlocker.finally(() => {63logService.info(`activationBlocker from '${id}' took for ${Math.round(sw.elapsed())}ms`);64}));65}66} catch (error) {67logService.error(error, `Error while loading contribution`);68}69}70}7172async waitForActivationBlockers(): Promise<void> {73// WAIT for all activation blockers to complete74await Promise.allSettled(this.allActivationBlockers);75}76}777879