Path: blob/main/src/vs/workbench/api/browser/mainThreadConfiguration.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 { URI } from '../../../base/common/uri.js';6import { IDisposable } from '../../../base/common/lifecycle.js';7import { Registry } from '../../../platform/registry/common/platform.js';8import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, getScopes } from '../../../platform/configuration/common/configurationRegistry.js';9import { IWorkspaceContextService, WorkbenchState } from '../../../platform/workspace/common/workspace.js';10import { MainThreadConfigurationShape, MainContext, ExtHostContext, IConfigurationInitData } from '../common/extHost.protocol.js';11import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';12import { ConfigurationTarget, IConfigurationService, IConfigurationOverrides } from '../../../platform/configuration/common/configuration.js';13import { IEnvironmentService } from '../../../platform/environment/common/environment.js';1415@extHostNamedCustomer(MainContext.MainThreadConfiguration)16export class MainThreadConfiguration implements MainThreadConfigurationShape {1718private readonly _configurationListener: IDisposable;1920constructor(21extHostContext: IExtHostContext,22@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService,23@IConfigurationService private readonly configurationService: IConfigurationService,24@IEnvironmentService private readonly _environmentService: IEnvironmentService,25) {26const proxy = extHostContext.getProxy(ExtHostContext.ExtHostConfiguration);2728proxy.$initializeConfiguration(this._getConfigurationData());29this._configurationListener = configurationService.onDidChangeConfiguration(e => {30proxy.$acceptConfigurationChanged(this._getConfigurationData(), e.change);31});32}3334private _getConfigurationData(): IConfigurationInitData {35const configurationData: IConfigurationInitData = { ...(this.configurationService.getConfigurationData()!), configurationScopes: [] };36// Send configurations scopes only in development mode.37if (!this._environmentService.isBuilt || this._environmentService.isExtensionDevelopment) {38configurationData.configurationScopes = getScopes();39}40return configurationData;41}4243public dispose(): void {44this._configurationListener.dispose();45}4647$updateConfigurationOption(target: ConfigurationTarget | null, key: string, value: unknown, overrides: IConfigurationOverrides | undefined, scopeToLanguage: boolean | undefined): Promise<void> {48overrides = { resource: overrides?.resource ? URI.revive(overrides.resource) : undefined, overrideIdentifier: overrides?.overrideIdentifier };49return this.writeConfiguration(target, key, value, overrides, scopeToLanguage);50}5152$removeConfigurationOption(target: ConfigurationTarget | null, key: string, overrides: IConfigurationOverrides | undefined, scopeToLanguage: boolean | undefined): Promise<void> {53overrides = { resource: overrides?.resource ? URI.revive(overrides.resource) : undefined, overrideIdentifier: overrides?.overrideIdentifier };54return this.writeConfiguration(target, key, undefined, overrides, scopeToLanguage);55}5657private writeConfiguration(target: ConfigurationTarget | null, key: string, value: unknown, overrides: IConfigurationOverrides, scopeToLanguage: boolean | undefined): Promise<void> {58target = target !== null && target !== undefined ? target : this.deriveConfigurationTarget(key, overrides);59const configurationValue = this.configurationService.inspect(key, overrides);60switch (target) {61case ConfigurationTarget.MEMORY:62return this._updateValue(key, value, target, configurationValue?.memory?.override, overrides, scopeToLanguage);63case ConfigurationTarget.WORKSPACE_FOLDER:64return this._updateValue(key, value, target, configurationValue?.workspaceFolder?.override, overrides, scopeToLanguage);65case ConfigurationTarget.WORKSPACE:66return this._updateValue(key, value, target, configurationValue?.workspace?.override, overrides, scopeToLanguage);67case ConfigurationTarget.USER_REMOTE:68return this._updateValue(key, value, target, configurationValue?.userRemote?.override, overrides, scopeToLanguage);69default:70return this._updateValue(key, value, target, configurationValue?.userLocal?.override, overrides, scopeToLanguage);71}72}7374private _updateValue(key: string, value: unknown, configurationTarget: ConfigurationTarget, overriddenValue: any | undefined, overrides: IConfigurationOverrides, scopeToLanguage: boolean | undefined): Promise<void> {75overrides = scopeToLanguage === true ? overrides76: scopeToLanguage === false ? { resource: overrides.resource }77: overrides.overrideIdentifier && overriddenValue !== undefined ? overrides78: { resource: overrides.resource };79return this.configurationService.updateValue(key, value, overrides, configurationTarget, { donotNotifyError: true });80}8182private deriveConfigurationTarget(key: string, overrides: IConfigurationOverrides): ConfigurationTarget {83if (overrides.resource && this._workspaceContextService.getWorkbenchState() === WorkbenchState.WORKSPACE) {84const configurationProperties = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration).getConfigurationProperties();85if (configurationProperties[key] && (configurationProperties[key].scope === ConfigurationScope.RESOURCE || configurationProperties[key].scope === ConfigurationScope.LANGUAGE_OVERRIDABLE)) {86return ConfigurationTarget.WORKSPACE_FOLDER;87}88}89return ConfigurationTarget.WORKSPACE;90}91}929394