From e4dffcf38f8112e012570c995c9432fb76b94d44 Mon Sep 17 00:00:00 2001 From: Aditya Thakral Date: Sat, 4 Jul 2020 21:23:33 -0400 Subject: [PATCH] Correctly handle null default values for objects Fixes #101637 --- .../preferences/browser/settingsTree.ts | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index af6a36df1483e..3f0c407abcd71 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -105,9 +105,17 @@ function getObjectValueType(schema: IJSONSchema): ObjectValue['type'] { } function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectDataItem[] { + const elementDefaultValue: Record = typeof element.defaultValue === 'object' + ? element.defaultValue ?? {} + : {}; + + const elementScopeValue: Record = typeof element.scopeValue === 'object' + ? element.scopeValue ?? {} + : {}; + const data = element.isConfigured ? - { ...element.defaultValue, ...element.scopeValue } : - element.defaultValue; + { ...elementDefaultValue, ...elementScopeValue } : + elementDefaultValue; const { objectProperties, objectPatternProperties, objectAdditionalProperties } = element.setting; const patternsAndSchemas = Object @@ -129,7 +137,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData return Object.keys(data).map(key => { if (isDefined(objectProperties) && key in objectProperties) { - const defaultValue = element.defaultValue[key]; + const defaultValue = elementDefaultValue[key]; const valueEnumOptions = getEnumOptionsFromSchema(objectProperties[key]); return { @@ -144,7 +152,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData options: valueEnumOptions, }, removable: isUndefinedOrNull(defaultValue), - }; + } as IObjectDataItem; } const schema = patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; @@ -159,7 +167,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData options: valueEnumOptions, }, removable: true, - }; + } as IObjectDataItem; } return { @@ -170,7 +178,7 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData options: additionalValueEnums, }, removable: true, - }; + } as IObjectDataItem; }); } @@ -1055,8 +1063,14 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT private onDidChangeObject(template: ISettingObjectItemTemplate, e: ISettingListChangeEvent): void { if (template.context) { - const defaultValue: Record = template.context.defaultValue; - const scopeValue: Record = template.context.scopeValue; + const defaultValue: Record = typeof template.context.defaultValue === 'object' + ? template.context.defaultValue ?? {} + : {}; + + const scopeValue: Record = typeof template.context.scopeValue === 'object' + ? template.context.scopeValue ?? {} + : {}; + const newValue: Record = {}; let newItems: IObjectDataItem[] = [];