Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/folding/browser/folding.contribution.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 { Disposable } from '../../../../base/common/lifecycle.js';
7
import { FoldingController } from '../../../../editor/contrib/folding/browser/folding.js';
8
import * as nls from '../../../../nls.js';
9
import { Registry } from '../../../../platform/registry/common/platform.js';
10
import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from '../../../common/contributions.js';
11
import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from '../../../../platform/configuration/common/configurationRegistry.js';
12
import { editorConfigurationBaseNode } from '../../../../editor/common/config/editorConfigurationSchema.js';
13
import { LifecyclePhase } from '../../../services/lifecycle/common/lifecycle.js';
14
import { IExtensionService } from '../../../services/extensions/common/extensions.js';
15
import { FoldingRangeProvider } from '../../../../editor/common/languages.js';
16
import { ITextModel } from '../../../../editor/common/model.js';
17
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
18
import { IExtensionDescription } from '../../../../platform/extensions/common/extensions.js';
19
20
class DefaultFoldingRangeProvider extends Disposable implements IWorkbenchContribution {
21
22
static readonly configName = 'editor.defaultFoldingRangeProvider';
23
24
static extensionIds: (string | null)[] = [];
25
static extensionItemLabels: string[] = [];
26
static extensionDescriptions: string[] = [];
27
28
constructor(
29
@IExtensionService private readonly _extensionService: IExtensionService,
30
@IConfigurationService private readonly _configurationService: IConfigurationService,
31
) {
32
super();
33
this._store.add(this._extensionService.onDidChangeExtensions(this._updateConfigValues, this));
34
this._store.add(FoldingController.setFoldingRangeProviderSelector(this._selectFoldingRangeProvider.bind(this)));
35
36
this._updateConfigValues();
37
}
38
39
private async _updateConfigValues(): Promise<void> {
40
await this._extensionService.whenInstalledExtensionsRegistered();
41
42
DefaultFoldingRangeProvider.extensionIds.length = 0;
43
DefaultFoldingRangeProvider.extensionItemLabels.length = 0;
44
DefaultFoldingRangeProvider.extensionDescriptions.length = 0;
45
46
DefaultFoldingRangeProvider.extensionIds.push(null);
47
DefaultFoldingRangeProvider.extensionItemLabels.push(nls.localize('null', 'All'));
48
DefaultFoldingRangeProvider.extensionDescriptions.push(nls.localize('nullFormatterDescription', "All active folding range providers"));
49
50
const languageExtensions: IExtensionDescription[] = [];
51
const otherExtensions: IExtensionDescription[] = [];
52
53
for (const extension of this._extensionService.extensions) {
54
if (extension.main || extension.browser) {
55
if (extension.categories?.find(cat => cat === 'Programming Languages')) {
56
languageExtensions.push(extension);
57
} else {
58
otherExtensions.push(extension);
59
}
60
}
61
}
62
63
const sorter = (a: IExtensionDescription, b: IExtensionDescription) => a.name.localeCompare(b.name);
64
65
for (const extension of languageExtensions.sort(sorter)) {
66
DefaultFoldingRangeProvider.extensionIds.push(extension.identifier.value);
67
DefaultFoldingRangeProvider.extensionItemLabels.push(extension.displayName ?? '');
68
DefaultFoldingRangeProvider.extensionDescriptions.push(extension.description ?? '');
69
}
70
for (const extension of otherExtensions.sort(sorter)) {
71
DefaultFoldingRangeProvider.extensionIds.push(extension.identifier.value);
72
DefaultFoldingRangeProvider.extensionItemLabels.push(extension.displayName ?? '');
73
DefaultFoldingRangeProvider.extensionDescriptions.push(extension.description ?? '');
74
}
75
}
76
77
private _selectFoldingRangeProvider(providers: FoldingRangeProvider[], document: ITextModel): FoldingRangeProvider[] | undefined {
78
const value = this._configurationService.getValue<string>(DefaultFoldingRangeProvider.configName, { overrideIdentifier: document.getLanguageId() });
79
if (value) {
80
return providers.filter(p => p.id === value);
81
}
82
return undefined;
83
}
84
}
85
86
Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration).registerConfiguration({
87
...editorConfigurationBaseNode,
88
properties: {
89
[DefaultFoldingRangeProvider.configName]: {
90
description: 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."),
91
type: ['string', 'null'],
92
default: null,
93
enum: DefaultFoldingRangeProvider.extensionIds,
94
enumItemLabels: DefaultFoldingRangeProvider.extensionItemLabels,
95
markdownEnumDescriptions: DefaultFoldingRangeProvider.extensionDescriptions
96
}
97
}
98
});
99
100
Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench).registerWorkbenchContribution(
101
DefaultFoldingRangeProvider,
102
LifecyclePhase.Restored
103
);
104
105
106