提交 f5de1525 编写于 作者: S Sandeep Somavarapu

#1587 Simplify the override pattern

- Use '[...identifiers]` as key
上级 abfdbf6d
......@@ -10,7 +10,7 @@ import Event from 'vs/base/common/event';
export const IConfigurationService = createDecorator<IConfigurationService>('configurationService');
export interface IConfigurationOptions {
language?: string;
overrideIdentifier?: string;
section?: string;
}
......@@ -110,10 +110,10 @@ export interface IConfigModel<T> {
merge(other: IConfigModel<T>, overwrite?: boolean): IConfigModel<T>;
config<V>(section: string): IConfigModel<V>;
languageConfig<V>(language: string, section?: string): IConfigModel<V>;
configWithOverrides<V>(identifier: string, section?: string): IConfigModel<V>;
}
export interface IOverrides<T> {
contents: T;
languages: string[];
identifiers: string[];
}
\ No newline at end of file
......@@ -68,7 +68,7 @@ class ConfigurationRegistry implements IConfigurationRegistry {
constructor() {
this.configurationContributors = [];
this.configurationSchema = { properties: {}, additionalProperties: false, errorMessage: 'Unknown configuration setting' };
this.configurationSchema = { properties: {}, patternProperties: {}, additionalProperties: false, errorMessage: 'Unknown configuration setting' };
this._onDidRegisterConfiguration = new Emitter<IConfigurationRegistry>();
this.configurationProperties = {};
......@@ -139,26 +139,24 @@ class ConfigurationRegistry implements IConfigurationRegistry {
subNodes.forEach(register);
}
};
register(configuration);
if (configuration.id === SETTINGS_OVERRRIDE_NODE_ID) {
configurationSchema.patternProperties[OVERRIDE_PROPERTY] = objects.clone(configuration.properties['[]']);
} else {
register(configuration);
}
contributionRegistry.registerSchema(schemaId, configurationSchema);
}
private updateSchemaForOverrideSettingsConfiguration(configuration: IConfigurationNode): void {
if (this.configurationSchema.properties[SETTINGS_OVERRIDE]) {
const propertyPattern = '.*';
if (!this.configurationSchema.properties[SETTINGS_OVERRIDE].patternProperties) {
const patternProperties = {};
patternProperties[propertyPattern] = {
type: 'object',
properties: {}
};
this.configurationSchema.properties[SETTINGS_OVERRIDE].patternProperties = patternProperties;
}
const properties = this.configurationSchema.properties[SETTINGS_OVERRIDE].patternProperties[propertyPattern].properties;
if (configuration.id !== SETTINGS_OVERRRIDE_NODE_ID) {
if (configuration.id !== SETTINGS_OVERRRIDE_NODE_ID) {
let patternProperties = this.configurationSchema.patternProperties[OVERRIDE_PROPERTY];
if (patternProperties) {
if (!patternProperties.properties) {
patternProperties.properties = {};
}
if (configuration.properties) {
for (const key in configuration.properties) {
properties[key] = this.getConfigurationProperties()[key];
patternProperties.properties[key] = this.getConfigurationProperties()[key];
}
}
}
......@@ -166,21 +164,11 @@ class ConfigurationRegistry implements IConfigurationRegistry {
}
private registerOverrideSettingsConfiguration(): void {
const properties = {};
properties[SETTINGS_OVERRIDE] = {
type: 'object',
description: nls.localize('overrideSettings.description',
`Configure settings to be overridden for language modes. To override, use the language id, or language ids separated by ',' as the key to group settings. Example:
"settings.overrides" = {
"markdown" = {
"editor.wrappingColumn": 0
},
"css,scss" = {
"editor.formatOnSave": true
}
}
`
),
const properties = {
'[]': {
type: 'object',
description: nls.localize('overrideSettings.description', "Configure settings to be overridden for a set of language identifiers.")
}
};
this.registerConfiguration({
id: SETTINGS_OVERRRIDE_NODE_ID,
......@@ -191,8 +179,9 @@ class ConfigurationRegistry implements IConfigurationRegistry {
}
}
const SETTINGS_OVERRRIDE_NODE_ID = 'overrideSettings';
export const SETTINGS_OVERRIDE = 'settings.override';
const SETTINGS_OVERRRIDE_NODE_ID = 'override';
const OVERRIDE_PROPERTY = '\\[.*\\]$';
export const OVERRIDE_PROPERTY_PATTERN = new RegExp(OVERRIDE_PROPERTY);
function getDefaultValue(type: string | string[]): any {
const t = Array.isArray(type) ? (<string[]>type)[0] : <string>type;
......
......@@ -8,7 +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 { IConfigurationRegistry, Extensions, SETTINGS_OVERRIDE } from 'vs/platform/configuration/common/configurationRegistry';
import { IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry';
import { IConfigModel, IOverrides } from 'vs/platform/configuration/common/configuration';
export function getDefaultValues(): any {
......@@ -103,7 +103,7 @@ export class ConfigModel<T> implements IConfigModel<T> {
return this._contents || <T>{};
}
public get overrides(): any {
public get overrides(): IOverrides<T>[] {
return this._overrides;
}
......@@ -133,12 +133,12 @@ export class ConfigModel<T> implements IConfigModel<T> {
return result;
}
public languageConfig<V>(language: string): ConfigModel<V> {
public configWithOverrides<V>(identifier: string): ConfigModel<V> {
const result = new ConfigModel<V>(null);
const contents = objects.clone<any>(this.contents);
if (this.overrides) {
for (const override of this.overrides) {
if (override.languages.indexOf(language) !== -1) {
if (override.identifiers.indexOf(identifier) !== -1) {
merge(contents, override.contents, true);
}
}
......@@ -159,15 +159,16 @@ export class ConfigModel<T> implements IConfigModel<T> {
(<any[]>currentParent).push(value);
} else if (currentProperty) {
currentParent[currentProperty] = value;
if (currentParent['overrideSettings']) {
onOverrideSettingsValue(currentProperty, value);
}
}
if (OVERRIDE_PROPERTY_PATTERN.test(currentProperty)) {
onOverrideSettingsValue(currentProperty, value);
}
}
function onOverrideSettingsValue(property: string, value: any): void {
overrides = overrides || [];
overrides.push({
languages: property.split(',').map(p => p.trim()),
identifiers: property.substring(1, property.length - 1).split(',').map(p => p.trim()),
raw: value,
contents: null
});
......@@ -176,10 +177,6 @@ export class ConfigModel<T> implements IConfigModel<T> {
let visitor: json.JSONVisitor = {
onObjectBegin: () => {
let object = {};
if (currentProperty === SETTINGS_OVERRIDE) {
overrides = [];
object['overrideSettings'] = true;
}
onValue(object);
previousParents.push(currentParent);
currentParent = object;
......@@ -190,9 +187,6 @@ export class ConfigModel<T> implements IConfigModel<T> {
},
onObjectEnd: () => {
currentParent = previousParents.pop();
if (currentParent['overrideSettings']) {
delete currentParent['overrideSettings'];
}
},
onArrayBegin: () => {
let array = [];
......@@ -220,7 +214,7 @@ export class ConfigModel<T> implements IConfigModel<T> {
this._contents = toValuesTree(this._raw, message => console.error(`Conflict in settings file ${this.name}: ${message}`));
this._overrides = overrides ? overrides.map<IOverrides<T>>(override => {
return {
languages: override.languages,
identifiers: override.identifiers,
contents: <T>toValuesTree(override.raw, message => console.error(`Conflict in settings file ${this.name}: ${message}`))
};
}) : null;
......
......@@ -77,7 +77,7 @@ export class ConfigurationService<T> extends Disposable implements IConfiguratio
public getConfiguration<C>(arg?: any): C {
const options = this.toOptions(arg);
const cache = this.getCache();
const configModel = options.language ? cache.consolidated.languageConfig<C>(options.language) : cache.consolidated;
const configModel = options.overrideIdentifier ? cache.consolidated.configWithOverrides<C>(options.overrideIdentifier) : cache.consolidated;
return options.section ? configModel.config<C>(options.section).contents : configModel.contents;
}
......
......@@ -205,7 +205,7 @@ export class TextDiffEditor extends BaseTextEditor {
const language = this.getLanguage();
if (language) {
objects.assign(editorConfiguration, this.configurationService.getConfiguration<IEditorConfiguration>({ language, section: 'diffEditor' }));
objects.assign(editorConfiguration, this.configurationService.getConfiguration<IEditorConfiguration>({ overrideIdentifier: language, section: 'diffEditor' }));
}
return editorConfiguration;
......
......@@ -107,7 +107,7 @@ export abstract class BaseTextEditor extends BaseEditor {
const overrides = {};
const language = this.getLanguage();
if (language) {
objects.assign(overrides, this.configurationService.getConfiguration<IEditorConfiguration>({ language, section: 'editor' }));
objects.assign(overrides, this.configurationService.getConfiguration<IEditorConfiguration>({ overrideIdentifier: language, section: 'editor' }));
}
objects.assign(overrides, {
overviewRulerLanes: 3,
......
......@@ -116,7 +116,7 @@ export class WorkspaceConfigurationService extends Disposable implements IWorksp
public getConfiguration<C>(options?: IConfigurationOptions): C
public getConfiguration<C>(arg?: any): C {
const options = this.toOptions(arg);
const configModel = options.language ? this.cachedConfig.languageConfig<C>(options.language) : this.cachedConfig;
const configModel = options.overrideIdentifier ? this.cachedConfig.configWithOverrides<C>(options.overrideIdentifier) : this.cachedConfig;
return options.section ? configModel.config<C>(options.section).contents : configModel.contents;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册