From d9e41fa4d5b1455e5be713e1473d66acad4f4319 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 20 Jan 2017 14:55:38 +0100 Subject: [PATCH] #1587 Merge the override settings by the identifiers key --- src/vs/platform/configuration/common/model.ts | 27 +++++++++++++------ .../services/configuration/common/model.ts | 6 ++--- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/configuration/common/model.ts b/src/vs/platform/configuration/common/model.ts index 0538b6fea9eda..b4b4168b369e2 100644 --- a/src/vs/platform/configuration/common/model.ts +++ b/src/vs/platform/configuration/common/model.ts @@ -8,6 +8,7 @@ import { Registry } from 'vs/platform/platform'; import * as types from 'vs/base/common/types'; import * as json from 'vs/base/common/json'; import * as objects from 'vs/base/common/objects'; +import * as arrays from 'vs/base/common/arrays'; import { IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigModel, IOverrides } from 'vs/platform/configuration/common/configuration'; @@ -88,7 +89,7 @@ interface Overrides extends IOverrides { export class ConfigModel implements IConfigModel { protected _contents: T; - protected _overrides: IOverrides[] = null; + protected _overrides: IOverrides[] = []; private _raw: any = {}; private _parseErrors: any[] = []; @@ -121,12 +122,23 @@ export class ConfigModel implements IConfigModel { public merge(other: IConfigModel, overwrite: boolean = true): ConfigModel { const mergedModel = new ConfigModel(null); - mergedModel._contents = objects.clone(this.contents); - merge(mergedModel.contents, other.contents, overwrite); - mergedModel._overrides = other.overrides ? other.overrides : this.overrides; + this.doMerge(mergedModel, this, overwrite); + this.doMerge(mergedModel, other, overwrite); return mergedModel; } + protected doMerge(source: ConfigModel, target: IConfigModel, overwrite: boolean = true) { + source._contents = objects.clone(this.contents); + merge(source.contents, target.contents, overwrite); + const overrides = objects.clone(target.overrides); + for (const override of source.overrides) { + if (overrides.every(o => !arrays.equals(o.identifiers, override.identifiers))) { + overrides.push(override); + } + } + source._overrides = overrides; + } + public config(section: string): ConfigModel { const result = new ConfigModel(null); result._contents = objects.clone(this.contents[section]); @@ -148,7 +160,7 @@ export class ConfigModel implements IConfigModel { } public update(content: string): void { - let overrides: Overrides[] = null; + let overrides: Overrides[] = []; let currentProperty: string = null; let currentParent: any = []; let previousParents: any[] = []; @@ -166,7 +178,6 @@ export class ConfigModel implements IConfigModel { } function onOverrideSettingsValue(property: string, value: any): void { - overrides = overrides || []; overrides.push({ identifiers: [property.substring(1, property.length - 1).trim()], raw: value, @@ -213,7 +224,7 @@ export class ConfigModel implements IConfigModel { } this._contents = toValuesTree(this._raw, message => console.error(`Conflict in settings file ${this.name}: ${message}`)); const configurationProperties = Registry.as(Extensions.Configuration).getConfigurationProperties(); - this._overrides = overrides ? overrides.map>(override => { + this._overrides = overrides.map>(override => { // Filter unknown and non-overridable properties const raw = {}; for (const key in override.raw) { @@ -225,7 +236,7 @@ export class ConfigModel implements IConfigModel { identifiers: override.identifiers, contents: toValuesTree(raw, message => console.error(`Conflict in settings file ${this.name}: ${message}`)) }; - }) : null; + }); } } diff --git a/src/vs/workbench/services/configuration/common/model.ts b/src/vs/workbench/services/configuration/common/model.ts index 79d11ea950fe2..8eb157c6c58ea 100644 --- a/src/vs/workbench/services/configuration/common/model.ts +++ b/src/vs/workbench/services/configuration/common/model.ts @@ -32,12 +32,10 @@ export class WorkspaceConfigModel extends ConfigModel { } private consolidate(): void { - let result = new ConfigModel(null).merge(this.workspaceSettingsConfig); + this.doMerge(this, this.workspaceSettingsConfig); for (const configModel of this.scopedConfigs) { - result = result.merge(configModel); + this.doMerge(this, configModel); } - this._contents = result.contents; - this._overrides = result.overrides; } public get keys(): string[] {