@@ -44,7 +44,7 @@ import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticip
4444import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge' ;
4545import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout' ;
4646import { ISettingsEditorViewState , settingKeyToDisplayFormat , SettingsTreeElement , SettingsTreeGroupChild , SettingsTreeGroupElement , SettingsTreeNewExtensionsElement , SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels' ;
47- import { ExcludeSettingWidget , ISettingListChangeEvent , IListDataItem , ListSettingWidget , settingsHeaderForeground , settingsNumberInputBackground , settingsNumberInputBorder , settingsNumberInputForeground , settingsSelectBackground , settingsSelectBorder , settingsSelectForeground , settingsSelectListBorder , settingsTextInputBackground , settingsTextInputBorder , settingsTextInputForeground , ObjectSettingWidget , IObjectDataItem , IObjectEnumOption , ObjectValue } from 'vs/workbench/contrib/preferences/browser/settingsWidgets' ;
47+ import { ExcludeSettingWidget , ISettingListChangeEvent , IListDataItem , ListSettingWidget , settingsHeaderForeground , settingsNumberInputBackground , settingsNumberInputBorder , settingsNumberInputForeground , settingsSelectBackground , settingsSelectBorder , settingsSelectForeground , settingsSelectListBorder , settingsTextInputBackground , settingsTextInputBorder , settingsTextInputForeground , ObjectSettingWidget , IObjectDataItem , IObjectEnumOption , ObjectValue , IObjectValueSuggester } from 'vs/workbench/contrib/preferences/browser/settingsWidgets' ;
4848import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences' ;
4949import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService' ;
5050import { ISetting , ISettingsGroup , SettingValueType } from 'vs/workbench/services/preferences/common/preferences' ;
@@ -174,6 +174,45 @@ function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectData
174174 } ) ;
175175}
176176
177+ function createObjectValueSuggester ( element : SettingsTreeSettingElement ) : IObjectValueSuggester {
178+ const { objectProperties, objectPatternProperties, objectAdditionalProperties } = element . setting ;
179+
180+ const patternsAndSchemas = Object
181+ . entries ( objectPatternProperties ?? { } )
182+ . map ( ( [ pattern , schema ] ) => ( {
183+ pattern : new RegExp ( pattern ) ,
184+ schema
185+ } ) ) ;
186+
187+ return ( key : string ) => {
188+ let suggestedSchema : IJSONSchema | undefined ;
189+
190+ if ( isDefined ( objectProperties ) && key in objectProperties ) {
191+ suggestedSchema = objectProperties [ key ] ;
192+ }
193+
194+ const patternSchema = suggestedSchema ?? patternsAndSchemas . find ( ( { pattern } ) => pattern . test ( key ) ) ?. schema ;
195+
196+ if ( isDefined ( patternSchema ) ) {
197+ suggestedSchema = patternSchema ;
198+ } else if ( isDefined ( objectAdditionalProperties ) && typeof objectAdditionalProperties === 'object' ) {
199+ suggestedSchema = objectAdditionalProperties ;
200+ }
201+
202+ if ( isDefined ( suggestedSchema ) ) {
203+ const type = getObjectValueType ( suggestedSchema ) ;
204+
205+ if ( type === 'boolean' ) {
206+ return { type, data : suggestedSchema . default ?? true } ;
207+ } else {
208+ return { type, data : suggestedSchema . default ?? '' , options : getEnumOptionsFromSchema ( suggestedSchema ) } ;
209+ }
210+ }
211+
212+ return ;
213+ } ;
214+ }
215+
177216function getListDisplayValue ( element : SettingsTreeSettingElement ) : IListDataItem [ ] {
178217 if ( ! element . value || ! isArray ( element . value ) ) {
179218 return [ ] ;
@@ -1039,13 +1078,13 @@ export class SettingObjectRenderer extends AbstractSettingRenderer implements IT
10391078 protected renderValue ( dataElement : SettingsTreeSettingElement , template : ISettingObjectItemTemplate , onChange : ( value : string ) => void ) : void {
10401079 const items = getObjectDisplayValue ( dataElement ) ;
10411080
1042-
10431081 template . objectWidget . setValue ( items , {
10441082 showAddButton : (
10451083 isDefined ( dataElement . setting . objectAdditionalProperties ) ||
10461084 isDefined ( dataElement . setting . objectPatternProperties ) ||
10471085 ! areAllPropertiesDefined ( Object . keys ( dataElement . setting . objectProperties ?? { } ) , items )
10481086 ) ,
1087+ valueSuggester : createObjectValueSuggester ( dataElement ) ,
10491088 } ) ;
10501089
10511090 this . setElementAriaLabels ( dataElement , this . templateId , template ) ;
0 commit comments