#46851 add default value source & default default value to configuration properties

This commit is contained in:
Sandeep Somavarapu 2021-11-25 14:45:03 +01:00
parent f853123bff
commit 944d343cc2
No known key found for this signature in database
GPG key ID: 1FED25EC4646638B
3 changed files with 49 additions and 27 deletions

View file

@ -58,7 +58,7 @@ export interface IConfigurationRegistry {
/**
* Return the registered configuration defaults overrides
*/
getConfigurationDefaultsOverrides(): IStringDictionary<any>;
getConfigurationDefaultsOverrides(): Map<string, IConfigurationDefaultOverride>;
/**
* Signal that the schema of a configuration setting has changes. It is currently only supported to change enumeration values.
@ -86,12 +86,12 @@ export interface IConfigurationRegistry {
/**
* Returns all configurations settings of all configuration nodes contributed to this registry.
*/
getConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema };
getConfigurationProperties(): IStringDictionary<IRegisteredConfigurationPropertySchema>;
/**
* Returns all excluded configurations settings of all configuration nodes contributed to this registry.
*/
getExcludedConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema };
getExcludedConfigurationProperties(): IStringDictionary<IRegisteredConfigurationPropertySchema>;
/**
* Register the identifiers for editor configurations
@ -176,7 +176,7 @@ export interface IConfigurationNode {
type?: string | string[];
title?: string;
description?: string;
properties?: { [path: string]: IConfigurationPropertySchema; };
properties?: IStringDictionary<IConfigurationPropertySchema>;
allOf?: IConfigurationNode[];
scope?: ConfigurationScope;
extensionInfo?: IConfigurationExtensionInfo;
@ -187,6 +187,14 @@ export interface IConfigurationDefaults {
extensionId?: string;
}
export type IRegisteredConfigurationPropertySchema = IConfigurationPropertySchema & {
defaultDefaultValue?: any,
source?: string,
defaultSource?: string
};
export type IConfigurationDefaultOverride = { value: any, source?: string };
export const allSettings: { properties: IStringDictionary<IConfigurationPropertySchema>, patternProperties: IStringDictionary<IConfigurationPropertySchema> } = { properties: {}, patternProperties: {} };
export const applicationSettings: { properties: IStringDictionary<IConfigurationPropertySchema>, patternProperties: IStringDictionary<IConfigurationPropertySchema> } = { properties: {}, patternProperties: {} };
export const machineSettings: { properties: IStringDictionary<IConfigurationPropertySchema>, patternProperties: IStringDictionary<IConfigurationPropertySchema> } = { properties: {}, patternProperties: {} };
@ -200,11 +208,11 @@ const contributionRegistry = Registry.as<IJSONContributionRegistry>(JSONExtensio
class ConfigurationRegistry implements IConfigurationRegistry {
private readonly configurationDefaultsOverrides: IStringDictionary<any>;
private readonly configurationDefaultsOverrides: Map<string, IConfigurationDefaultOverride>;
private readonly defaultLanguageConfigurationOverridesNode: IConfigurationNode;
private readonly configurationContributors: IConfigurationNode[];
private readonly configurationProperties: { [qualifiedKey: string]: IJSONSchema };
private readonly excludedConfigurationProperties: { [qualifiedKey: string]: IJSONSchema };
private readonly configurationProperties: IStringDictionary<IRegisteredConfigurationPropertySchema>;
private readonly excludedConfigurationProperties: IStringDictionary<IRegisteredConfigurationPropertySchema>;
private readonly resourceLanguageSettingsSchema: IJSONSchema;
private readonly overrideIdentifiers = new Set<string>();
@ -215,7 +223,7 @@ class ConfigurationRegistry implements IConfigurationRegistry {
readonly onDidUpdateConfiguration = this._onDidUpdateConfiguration.event;
constructor() {
this.configurationDefaultsOverrides = {};
this.configurationDefaultsOverrides = new Map<string, IConfigurationDefaultOverride>();
this.defaultLanguageConfigurationOverridesNode = {
id: 'defaultOverrides',
title: nls.localize('defaultLanguageConfigurationOverrides.title', "Default Language Configuration Overrides"),
@ -264,23 +272,26 @@ class ConfigurationRegistry implements IConfigurationRegistry {
const properties: string[] = [];
const overrideIdentifiers: string[] = [];
for (const { overrides } of configurationDefaults) {
for (const { overrides, extensionId } of configurationDefaults) {
for (const key in overrides) {
properties.push(key);
if (OVERRIDE_PROPERTY_REGEX.test(key)) {
this.configurationDefaultsOverrides[key] = { ...(this.configurationDefaultsOverrides[key] || {}), ...overrides[key] };
const property: IConfigurationPropertySchema = {
const defaultValue = { ...(this.configurationDefaultsOverrides.get(key)?.value || {}), ...overrides[key] };
this.configurationDefaultsOverrides.set(key, { source: extensionId, value: defaultValue });
const property: IRegisteredConfigurationPropertySchema = {
type: 'object',
default: this.configurationDefaultsOverrides[key],
default: defaultValue,
description: nls.localize('defaultLanguageConfiguration.description', "Configure settings to be overridden for {0} language.", key),
$ref: resourceLanguageSettingsSchemaId
$ref: resourceLanguageSettingsSchemaId,
defaultDefaultValue: defaultValue,
source: extensionId,
};
overrideIdentifiers.push(...overrideIdentifiersFromKey(key));
this.configurationProperties[key] = property;
this.defaultLanguageConfigurationOverridesNode.properties![key] = property;
} else {
this.configurationDefaultsOverrides[key] = overrides[key];
this.configurationDefaultsOverrides.set(key, { value: overrides[key], source: extensionId });
const property = this.configurationProperties[key];
if (property) {
this.updatePropertyDefaultValue(key, property);
@ -297,10 +308,13 @@ class ConfigurationRegistry implements IConfigurationRegistry {
public deregisterDefaultConfigurations(defaultConfigurations: IConfigurationDefaults[]): void {
const properties: string[] = [];
for (const { overrides } of defaultConfigurations) {
for (const { overrides, extensionId } of defaultConfigurations) {
for (const key in overrides) {
if (this.configurationDefaultsOverrides.get(key)?.source !== extensionId) {
continue;
}
properties.push(key);
delete this.configurationDefaultsOverrides[key];
this.configurationDefaultsOverrides.delete(key);
if (OVERRIDE_PROPERTY_REGEX.test(key)) {
delete this.configurationProperties[key];
delete this.defaultLanguageConfigurationOverridesNode.properties![key];
@ -375,9 +389,11 @@ class ConfigurationRegistry implements IConfigurationRegistry {
continue;
}
const property = properties[key];
const property: IRegisteredConfigurationPropertySchema = properties[key];
property.source = extensionInfo?.id;
// update default value
property.defaultDefaultValue = properties[key].default;
this.updatePropertyDefaultValue(key, property);
// update scope
@ -415,19 +431,20 @@ class ConfigurationRegistry implements IConfigurationRegistry {
return propertyKeys;
}
// TODO: @sandy081 - Remove this method and include required info in getConfigurationProperties
getConfigurations(): IConfigurationNode[] {
return this.configurationContributors;
}
getConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema } {
getConfigurationProperties(): IStringDictionary<IRegisteredConfigurationPropertySchema> {
return this.configurationProperties;
}
getExcludedConfigurationProperties(): { [qualifiedKey: string]: IConfigurationPropertySchema } {
getExcludedConfigurationProperties(): IStringDictionary<IRegisteredConfigurationPropertySchema> {
return this.excludedConfigurationProperties;
}
getConfigurationDefaultsOverrides(): IStringDictionary<any> {
getConfigurationDefaultsOverrides(): Map<string, IConfigurationDefaultOverride> {
return this.configurationDefaultsOverrides;
}
@ -531,15 +548,19 @@ class ConfigurationRegistry implements IConfigurationRegistry {
this._onDidSchemaChange.fire();
}
private updatePropertyDefaultValue(key: string, property: IConfigurationPropertySchema): void {
let defaultValue = this.configurationDefaultsOverrides[key];
private updatePropertyDefaultValue(key: string, property: IRegisteredConfigurationPropertySchema): void {
const configurationdefaultOverride = this.configurationDefaultsOverrides.get(key);
let defaultValue = configurationdefaultOverride?.value;
let defaultSource = configurationdefaultOverride?.source;
if (types.isUndefined(defaultValue)) {
defaultValue = property.default;
defaultValue = property.defaultDefaultValue;
defaultSource = undefined;
}
if (types.isUndefined(defaultValue)) {
defaultValue = getDefaultValue(property.type);
}
property.default = defaultValue;
property.defaultSource = defaultSource;
}
}

View file

@ -96,9 +96,9 @@ export class DefaultConfiguration extends Disposable {
private async updateCachedConfigurationDefaultsOverrides(): Promise<void> {
const cachedConfigurationDefaultsOverrides: IStringDictionary<any> = {};
const configurationDefaultsOverrides = this.configurationRegistry.getConfigurationDefaultsOverrides();
for (const key of Object.keys(configurationDefaultsOverrides)) {
if (!OVERRIDE_PROPERTY_REGEX.test(key) && configurationDefaultsOverrides[key] !== undefined) {
cachedConfigurationDefaultsOverrides[key] = configurationDefaultsOverrides[key];
for (const [key, value] of configurationDefaultsOverrides) {
if (!OVERRIDE_PROPERTY_REGEX.test(key) && value.value !== undefined) {
cachedConfigurationDefaultsOverrides[key] = value.value;
}
}
try {

View file

@ -44,7 +44,8 @@ suite('DefaultConfiguration', () => {
teardown(() => {
configurationRegistry.deregisterConfigurations(configurationRegistry.getConfigurations());
configurationRegistry.deregisterDefaultConfigurations([{ overrides: configurationRegistry.getConfigurationDefaultsOverrides() }]);
const configurationDefaultsOverrides = configurationRegistry.getConfigurationDefaultsOverrides();
configurationRegistry.deregisterDefaultConfigurations([...configurationDefaultsOverrides.keys()].map(key => ({ extensionId: configurationDefaultsOverrides.get(key)?.source, overrides: { [key]: configurationDefaultsOverrides.get(key)?.value } })));
});
test('configuration default overrides are read from environment', async () => {