/* tslint:disable */ import { URI } from '@vscode-alt/monaco-editor/esm/vs/base/common/uri'; import { ResourceMap } from '@vscode-alt/monaco-editor/esm/vs/base/common/map'; import * as types from '@vscode-alt/monaco-editor/esm/vs/base/common/types'; import { ConfigurationModel } from '../models'; import { IConfigurationOverrides, IConfigurationData } from '../../../interfaces'; import { Workspace } from '../../workspace'; //src/vs/platform/configuration/common/configurationModels.ts export class Configuration { private _workspaceConsolidatedConfiguration: ConfigurationModel | null = null; private _foldersConsolidatedConfigurations: ResourceMap = new ResourceMap(); constructor( private _defaultConfiguration: ConfigurationModel, private _localUserConfiguration: ConfigurationModel, private _remoteUserConfiguration: ConfigurationModel = new ConfigurationModel(), private _workspaceConfiguration: ConfigurationModel = new ConfigurationModel(), private _folderConfigurations: ResourceMap = new ResourceMap(), private _memoryConfiguration: ConfigurationModel = new ConfigurationModel(), private _memoryConfigurationByResource: ResourceMap = new ResourceMap(), private _freeze: boolean = true) { } getValue(section: string | undefined, overrides: IConfigurationOverrides, workspace: Workspace | undefined): any { const consolidateConfigurationModel = this.getConsolidateConfigurationModel(overrides, workspace); return consolidateConfigurationModel.getValue(section); } updateValue(key: string, value: any, overrides: IConfigurationOverrides = {}): void { let memoryConfiguration: ConfigurationModel | undefined; if (overrides.resource) { memoryConfiguration = this._memoryConfigurationByResource.get(overrides.resource); if (!memoryConfiguration) { memoryConfiguration = new ConfigurationModel(); this._memoryConfigurationByResource.set(overrides.resource, memoryConfiguration); } } else { memoryConfiguration = this._memoryConfiguration; } if (value === undefined) { memoryConfiguration.removeValue(key); } else { memoryConfiguration.setValue(key, value); } if (!overrides.resource) { this._workspaceConsolidatedConfiguration = null; } } inspect(key: string, overrides: IConfigurationOverrides, workspace: Workspace | undefined): { default: C, user: C, userLocal?: C, userRemote?: C, workspace?: C, workspaceFolder?: C memory?: C value: C, } { const consolidateConfigurationModel = this.getConsolidateConfigurationModel(overrides, workspace); const folderConfigurationModel = this.getFolderConfigurationModelForResource(overrides.resource, workspace); const memoryConfigurationModel = overrides.resource ? this._memoryConfigurationByResource.get(overrides.resource) || this._memoryConfiguration : this._memoryConfiguration; return { default: overrides.overrideIdentifier ? this._defaultConfiguration.freeze().override(overrides.overrideIdentifier).getValue(key) : this._defaultConfiguration.freeze().getValue(key), user: overrides.overrideIdentifier ? this.userConfiguration.freeze().override(overrides.overrideIdentifier).getValue(key) : this.userConfiguration.freeze().getValue(key), userLocal: overrides.overrideIdentifier ? this.localUserConfiguration.freeze().override(overrides.overrideIdentifier).getValue(key) : this.localUserConfiguration.freeze().getValue(key), userRemote: overrides.overrideIdentifier ? this.remoteUserConfiguration.freeze().override(overrides.overrideIdentifier).getValue(key) : this.remoteUserConfiguration.freeze().getValue(key), workspace: workspace ? overrides.overrideIdentifier ? this._workspaceConfiguration.freeze().override(overrides.overrideIdentifier).getValue(key) : this._workspaceConfiguration.freeze().getValue(key) : undefined, //Check on workspace exists or not because _workspaceConfiguration is never null workspaceFolder: folderConfigurationModel ? overrides.overrideIdentifier ? folderConfigurationModel.freeze().override(overrides.overrideIdentifier).getValue(key) : folderConfigurationModel.freeze().getValue(key) : undefined, memory: overrides.overrideIdentifier ? memoryConfigurationModel.override(overrides.overrideIdentifier).getValue(key) : memoryConfigurationModel.getValue(key), value: consolidateConfigurationModel.getValue(key) }; } keys(workspace: Workspace | undefined): { default: string[]; user: string[]; workspace: string[]; workspaceFolder: string[]; } { const folderConfigurationModel = this.getFolderConfigurationModelForResource(undefined, workspace); return { default: this._defaultConfiguration.freeze().keys, user: this.userConfiguration.freeze().keys, workspace: this._workspaceConfiguration.freeze().keys, workspaceFolder: folderConfigurationModel ? folderConfigurationModel.freeze().keys : [] }; } updateDefaultConfiguration(defaultConfiguration: ConfigurationModel): void { this._defaultConfiguration = defaultConfiguration; this._workspaceConsolidatedConfiguration = null; this._foldersConsolidatedConfigurations.clear(); } updateLocalUserConfiguration(localUserConfiguration: ConfigurationModel): void { this._localUserConfiguration = localUserConfiguration; this._userConfiguration = null; this._workspaceConsolidatedConfiguration = null; this._foldersConsolidatedConfigurations.clear(); } updateRemoteUserConfiguration(remoteUserConfiguration: ConfigurationModel): void { this._remoteUserConfiguration = remoteUserConfiguration; this._userConfiguration = null; this._workspaceConsolidatedConfiguration = null; this._foldersConsolidatedConfigurations.clear(); } updateWorkspaceConfiguration(workspaceConfiguration: ConfigurationModel): void { this._workspaceConfiguration = workspaceConfiguration; this._workspaceConsolidatedConfiguration = null; this._foldersConsolidatedConfigurations.clear(); } updateFolderConfiguration(resource: URI, configuration: ConfigurationModel): void { this._folderConfigurations.set(resource, configuration); this._foldersConsolidatedConfigurations.delete(resource); } deleteFolderConfiguration(resource: URI): void { this.folderConfigurations.delete(resource); this._foldersConsolidatedConfigurations.delete(resource); } get defaults(): ConfigurationModel { return this._defaultConfiguration; } private _userConfiguration: ConfigurationModel | null; get userConfiguration(): ConfigurationModel { if (!this._userConfiguration) { this._userConfiguration = this._remoteUserConfiguration.isEmpty() ? this._localUserConfiguration : this._localUserConfiguration.merge(this._remoteUserConfiguration); if (this._freeze) { this._userConfiguration.freeze(); } } return this._userConfiguration; } get localUserConfiguration(): ConfigurationModel { return this._localUserConfiguration; } get remoteUserConfiguration(): ConfigurationModel { return this._remoteUserConfiguration; } get workspaceConfiguration(): ConfigurationModel { return this._workspaceConfiguration; } protected get folderConfigurations(): ResourceMap { return this._folderConfigurations; } private getConsolidateConfigurationModel(overrides: IConfigurationOverrides, workspace: Workspace | undefined): ConfigurationModel { let configurationModel = this.getConsolidatedConfigurationModelForResource(overrides, workspace); return overrides.overrideIdentifier ? configurationModel.override(overrides.overrideIdentifier) : configurationModel; } private getConsolidatedConfigurationModelForResource({ resource }: IConfigurationOverrides, workspace: Workspace | undefined): ConfigurationModel { let consolidateConfiguration = this.getWorkspaceConsolidatedConfiguration(); if (workspace && resource) { const root = workspace.getFolder(resource); if (root) { consolidateConfiguration = this.getFolderConsolidatedConfiguration(root.uri) || consolidateConfiguration; } const memoryConfigurationForResource = this._memoryConfigurationByResource.get(resource); if (memoryConfigurationForResource) { consolidateConfiguration = consolidateConfiguration.merge(memoryConfigurationForResource); } } return consolidateConfiguration; } private getWorkspaceConsolidatedConfiguration(): ConfigurationModel { if (!this._workspaceConsolidatedConfiguration) { this._workspaceConsolidatedConfiguration = this._defaultConfiguration.merge(this.userConfiguration, this._workspaceConfiguration, this._memoryConfiguration); if (this._freeze) { this._workspaceConfiguration = this._workspaceConfiguration.freeze(); } } return this._workspaceConsolidatedConfiguration; } private getFolderConsolidatedConfiguration(folder: URI): ConfigurationModel { let folderConsolidatedConfiguration = this._foldersConsolidatedConfigurations.get(folder); if (!folderConsolidatedConfiguration) { const workspaceConsolidateConfiguration = this.getWorkspaceConsolidatedConfiguration(); const folderConfiguration = this._folderConfigurations.get(folder); if (folderConfiguration) { folderConsolidatedConfiguration = workspaceConsolidateConfiguration.merge(folderConfiguration); if (this._freeze) { folderConsolidatedConfiguration = folderConsolidatedConfiguration.freeze(); } this._foldersConsolidatedConfigurations.set(folder, folderConsolidatedConfiguration); } else { folderConsolidatedConfiguration = workspaceConsolidateConfiguration; } } return folderConsolidatedConfiguration; } private getFolderConfigurationModelForResource(resource: URI | null | undefined, workspace: Workspace | undefined): ConfigurationModel | null { if (workspace && resource) { const root = workspace.getFolder(resource); if (root) { return types.withUndefinedAsNull(this._folderConfigurations.get(root.uri)); } } return null; } toData(): IConfigurationData { return { defaults: { contents: this._defaultConfiguration.contents, overrides: this._defaultConfiguration.overrides, keys: this._defaultConfiguration.keys }, user: { contents: this.userConfiguration.contents, overrides: this.userConfiguration.overrides, keys: this.userConfiguration.keys }, workspace: { contents: this._workspaceConfiguration.contents, overrides: this._workspaceConfiguration.overrides, keys: this._workspaceConfiguration.keys }, folders: [...this._folderConfigurations.keys()].reduce((result, folder) => { const { contents, overrides, keys } = this._folderConfigurations.get(folder)!; result[folder.toString()] = { contents, overrides, keys }; return result; }, Object.create({})) }; } allKeys(workspace: Workspace | undefined): string[] { let keys = this.keys(workspace); let all = [...keys.default]; const addKeys = (keys: string[]) => { for (const key of keys) { if (all.indexOf(key) === -1) { all.push(key); } } }; addKeys(keys.user); addKeys(keys.workspace); for (const resource of this.folderConfigurations.keys()) { addKeys(this.folderConfigurations.get(resource)!.keys); } return all; } }