Path: blob/main/src/vs/workbench/contrib/folding/browser/folding.contribution.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 { Disposable } from '../../../../base/common/lifecycle.js';6import { FoldingController } from '../../../../editor/contrib/folding/browser/folding.js';7import * as nls from '../../../../nls.js';8import { Registry } from '../../../../platform/registry/common/platform.js';9import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from '../../../common/contributions.js';10import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from '../../../../platform/configuration/common/configurationRegistry.js';11import { editorConfigurationBaseNode } from '../../../../editor/common/config/editorConfigurationSchema.js';12import { LifecyclePhase } from '../../../services/lifecycle/common/lifecycle.js';13import { IExtensionService } from '../../../services/extensions/common/extensions.js';14import { FoldingRangeProvider } from '../../../../editor/common/languages.js';15import { ITextModel } from '../../../../editor/common/model.js';16import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';17import { IExtensionDescription } from '../../../../platform/extensions/common/extensions.js';1819class DefaultFoldingRangeProvider extends Disposable implements IWorkbenchContribution {2021static readonly configName = 'editor.defaultFoldingRangeProvider';2223static extensionIds: (string | null)[] = [];24static extensionItemLabels: string[] = [];25static extensionDescriptions: string[] = [];2627constructor(28@IExtensionService private readonly _extensionService: IExtensionService,29@IConfigurationService private readonly _configurationService: IConfigurationService,30) {31super();32this._store.add(this._extensionService.onDidChangeExtensions(this._updateConfigValues, this));33this._store.add(FoldingController.setFoldingRangeProviderSelector(this._selectFoldingRangeProvider.bind(this)));3435this._updateConfigValues();36}3738private async _updateConfigValues(): Promise<void> {39await this._extensionService.whenInstalledExtensionsRegistered();4041DefaultFoldingRangeProvider.extensionIds.length = 0;42DefaultFoldingRangeProvider.extensionItemLabels.length = 0;43DefaultFoldingRangeProvider.extensionDescriptions.length = 0;4445DefaultFoldingRangeProvider.extensionIds.push(null);46DefaultFoldingRangeProvider.extensionItemLabels.push(nls.localize('null', 'All'));47DefaultFoldingRangeProvider.extensionDescriptions.push(nls.localize('nullFormatterDescription', "All active folding range providers"));4849const languageExtensions: IExtensionDescription[] = [];50const otherExtensions: IExtensionDescription[] = [];5152for (const extension of this._extensionService.extensions) {53if (extension.main || extension.browser) {54if (extension.categories?.find(cat => cat === 'Programming Languages')) {55languageExtensions.push(extension);56} else {57otherExtensions.push(extension);58}59}60}6162const sorter = (a: IExtensionDescription, b: IExtensionDescription) => a.name.localeCompare(b.name);6364for (const extension of languageExtensions.sort(sorter)) {65DefaultFoldingRangeProvider.extensionIds.push(extension.identifier.value);66DefaultFoldingRangeProvider.extensionItemLabels.push(extension.displayName ?? '');67DefaultFoldingRangeProvider.extensionDescriptions.push(extension.description ?? '');68}69for (const extension of otherExtensions.sort(sorter)) {70DefaultFoldingRangeProvider.extensionIds.push(extension.identifier.value);71DefaultFoldingRangeProvider.extensionItemLabels.push(extension.displayName ?? '');72DefaultFoldingRangeProvider.extensionDescriptions.push(extension.description ?? '');73}74}7576private _selectFoldingRangeProvider(providers: FoldingRangeProvider[], document: ITextModel): FoldingRangeProvider[] | undefined {77const value = this._configurationService.getValue<string>(DefaultFoldingRangeProvider.configName, { overrideIdentifier: document.getLanguageId() });78if (value) {79return providers.filter(p => p.id === value);80}81return undefined;82}83}8485Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration).registerConfiguration({86...editorConfigurationBaseNode,87properties: {88[DefaultFoldingRangeProvider.configName]: {89description: nls.localize('formatter.default', "Defines a default folding range provider that takes precedence over all other folding range providers. Must be the identifier of an extension contributing a folding range provider."),90type: ['string', 'null'],91default: null,92enum: DefaultFoldingRangeProvider.extensionIds,93enumItemLabels: DefaultFoldingRangeProvider.extensionItemLabels,94markdownEnumDescriptions: DefaultFoldingRangeProvider.extensionDescriptions95}96}97});9899Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).registerWorkbenchContribution(100DefaultFoldingRangeProvider,101LifecyclePhase.Restored102);103104105106