Skip to content

Commit

Permalink
Make Settings inspect lazier (#190100)
Browse files Browse the repository at this point in the history
  • Loading branch information
rzhao271 committed Aug 14, 2023
1 parent 6565a8b commit 910aceb
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 79 deletions.
5 changes: 5 additions & 0 deletions src/vs/workbench/contrib/preferences/browser/settingsTree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,11 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre

protected renderSettingElement(node: ITreeNode<SettingsTreeSettingElement, never>, index: number, template: ISettingItemTemplate | ISettingBoolItemTemplate): void {
const element = node.element;

// The element must inspect itself to get information for
// the modified indicator and the overridden Settings indicators.
element.inspectSelf();

template.context = element;
template.toolbar.context = element;
const actions = this.disposableActionFactory(element.setting, element.settingsTarget);
Expand Down
183 changes: 104 additions & 79 deletions src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,17 +167,21 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
constructor(
setting: ISetting,
parent: SettingsTreeGroupElement,
inspectResult: IInspectResult,
isWorkspaceTrusted: boolean,
readonly settingsTarget: SettingsTarget,
private readonly isWorkspaceTrusted: boolean,
private readonly languageFilter: string | undefined,
private readonly languageService: ILanguageService,
private readonly productService: IProductService
private readonly productService: IProductService,
private readonly userDataProfileService: IUserDataProfileService,
private readonly configurationService: IWorkbenchConfigurationService,
) {
super(sanitizeId(parent.id + '_' + setting.key));
this.setting = setting;
this.parent = parent;

this.update(inspectResult, isWorkspaceTrusted);
// Make sure description and valueType are initialized
this.initSettingDescription();
this.initSettingValueType();
}

get displayCategory(): string {
Expand Down Expand Up @@ -207,7 +211,80 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
this._displayCategory = displayKeyFormat.category;
}

update(inspectResult: IInspectResult, isWorkspaceTrusted: boolean): void {
private initSettingDescription() {
if (this.setting.description.length > SettingsTreeSettingElement.MAX_DESC_LINES) {
const truncatedDescLines = this.setting.description.slice(0, SettingsTreeSettingElement.MAX_DESC_LINES);
truncatedDescLines.push('[...]');
this.description = truncatedDescLines.join('\n');
} else {
this.description = this.setting.description.join('\n');
}
}

private initSettingValueType() {
if (isExtensionToggleSetting(this.setting, this.productService)) {
this.valueType = SettingValueType.ExtensionToggle;
} else if (this.setting.enum && (!this.setting.type || settingTypeEnumRenderable(this.setting.type))) {
this.valueType = SettingValueType.Enum;
} else if (this.setting.type === 'string') {
if (this.setting.editPresentation === EditPresentationTypes.Multiline) {
this.valueType = SettingValueType.MultilineString;
} else {
this.valueType = SettingValueType.String;
}
} else if (isExcludeSetting(this.setting)) {
this.valueType = SettingValueType.Exclude;
} else if (isIncludeSetting(this.setting)) {
this.valueType = SettingValueType.Include;
} else if (this.setting.type === 'integer') {
this.valueType = SettingValueType.Integer;
} else if (this.setting.type === 'number') {
this.valueType = SettingValueType.Number;
} else if (this.setting.type === 'boolean') {
this.valueType = SettingValueType.Boolean;
} else if (this.setting.type === 'array' && this.setting.arrayItemType &&
['string', 'enum', 'number', 'integer'].includes(this.setting.arrayItemType)) {
this.valueType = SettingValueType.Array;
} else if (Array.isArray(this.setting.type) && this.setting.type.includes(SettingValueType.Null) && this.setting.type.length === 2) {
if (this.setting.type.includes(SettingValueType.Integer)) {
this.valueType = SettingValueType.NullableInteger;
} else if (this.setting.type.includes(SettingValueType.Number)) {
this.valueType = SettingValueType.NullableNumber;
} else {
this.valueType = SettingValueType.Complex;
}
} else if (isObjectSetting(this.setting)) {
if (this.setting.allKeysAreBoolean) {
this.valueType = SettingValueType.BooleanObject;
} else {
this.valueType = SettingValueType.Object;
}
} else if (this.setting.isLanguageTagSetting) {
this.valueType = SettingValueType.LanguageTag;
} else {
this.valueType = SettingValueType.Complex;
}
}

inspectSelf() {
const targetToInspect = this.getTargetToInspect(this.setting);
const inspectResult = inspectSetting(this.setting.key, targetToInspect, this.languageFilter, this.configurationService);
this.update(inspectResult, this.isWorkspaceTrusted);
}

private getTargetToInspect(setting: ISetting): SettingsTarget {
if (!this.userDataProfileService.currentProfile.isDefault) {
if (setting.scope === ConfigurationScope.APPLICATION) {
return ConfigurationTarget.APPLICATION;
}
if (this.configurationService.isSettingAppliedForAllProfiles(setting.key) && this.settingsTarget === ConfigurationTarget.USER_LOCAL) {
return ConfigurationTarget.APPLICATION;
}
}
return this.settingsTarget;
}

private update(inspectResult: IInspectResult, isWorkspaceTrusted: boolean): void {
let { isConfigured, inspected, targetSelector, inspectedLanguageOverrides, languageSelector } = inspectResult;

switch (targetSelector) {
Expand Down Expand Up @@ -302,64 +379,19 @@ export class SettingsTreeSettingElement extends SettingsTreeElement {
this.tags.add(POLICY_SETTING_TAG);
}
}

if (this.setting.description.length > SettingsTreeSettingElement.MAX_DESC_LINES) {
const truncatedDescLines = this.setting.description.slice(0, SettingsTreeSettingElement.MAX_DESC_LINES);
truncatedDescLines.push('[...]');
this.description = truncatedDescLines.join('\n');
} else {
this.description = this.setting.description.join('\n');
}

if (isExtensionToggleSetting(this.setting, this.productService)) {
this.valueType = SettingValueType.ExtensionToggle;
} else if (this.setting.enum && (!this.setting.type || settingTypeEnumRenderable(this.setting.type))) {
this.valueType = SettingValueType.Enum;
} else if (this.setting.type === 'string') {
if (this.setting.editPresentation === EditPresentationTypes.Multiline) {
this.valueType = SettingValueType.MultilineString;
} else {
this.valueType = SettingValueType.String;
}
} else if (isExcludeSetting(this.setting)) {
this.valueType = SettingValueType.Exclude;
} else if (isIncludeSetting(this.setting)) {
this.valueType = SettingValueType.Include;
} else if (this.setting.type === 'integer') {
this.valueType = SettingValueType.Integer;
} else if (this.setting.type === 'number') {
this.valueType = SettingValueType.Number;
} else if (this.setting.type === 'boolean') {
this.valueType = SettingValueType.Boolean;
} else if (this.setting.type === 'array' && this.setting.arrayItemType &&
['string', 'enum', 'number', 'integer'].includes(this.setting.arrayItemType)) {
this.valueType = SettingValueType.Array;
} else if (Array.isArray(this.setting.type) && this.setting.type.includes(SettingValueType.Null) && this.setting.type.length === 2) {
if (this.setting.type.includes(SettingValueType.Integer)) {
this.valueType = SettingValueType.NullableInteger;
} else if (this.setting.type.includes(SettingValueType.Number)) {
this.valueType = SettingValueType.NullableNumber;
} else {
this.valueType = SettingValueType.Complex;
}
} else if (isObjectSetting(this.setting)) {
if (this.setting.allKeysAreBoolean) {
this.valueType = SettingValueType.BooleanObject;
} else {
this.valueType = SettingValueType.Object;
}
} else if (this.setting.isLanguageTagSetting) {
this.valueType = SettingValueType.LanguageTag;
} else {
this.valueType = SettingValueType.Complex;
}
}

matchesAllTags(tagFilters?: Set<string>): boolean {
if (!tagFilters || !tagFilters.size) {
return true;
}

if (!this.tags) {
// The setting must inspect itself to get tag information
// including for the hasPolicy tag.
this.inspectSelf();
}

if (this.tags) {
let hasFilteredTag = true;
tagFilters.forEach(tag => {
Expand Down Expand Up @@ -477,11 +509,11 @@ function createSettingMatchRegExp(pattern: string): RegExp {

export class SettingsTreeModel {
protected _root!: SettingsTreeGroupElement;
private _treeElementsBySettingName = new Map<string, SettingsTreeSettingElement[]>();
private _tocRoot!: ITOCEntry<ISetting>;
private readonly _treeElementsBySettingName = new Map<string, SettingsTreeSettingElement[]>();

constructor(
protected _viewState: ISettingsEditorViewState,
protected readonly _viewState: ISettingsEditorViewState,
private _isWorkspaceTrusted: boolean,
@IWorkbenchConfigurationService private readonly _configurationService: IWorkbenchConfigurationService,
@ILanguageService private readonly _languageService: ILanguageService,
Expand Down Expand Up @@ -538,30 +570,16 @@ export class SettingsTreeModel {
return;
}

this.updateSettings(this._treeElementsBySettingName.get(name)!);
this.reinspectSettings(this._treeElementsBySettingName.get(name)!);
}

private updateRequireTrustedTargetElements(): void {
this.updateSettings([...this._treeElementsBySettingName.values()].flat().filter(s => s.isUntrusted));
}

private getTargetToInspect(setting: ISetting): SettingsTarget {
if (!this._userDataProfileService.currentProfile.isDefault) {
if (setting.scope === ConfigurationScope.APPLICATION) {
return ConfigurationTarget.APPLICATION;
}
if (this._configurationService.isSettingAppliedForAllProfiles(setting.key) && this._viewState.settingsTarget === ConfigurationTarget.USER_LOCAL) {
return ConfigurationTarget.APPLICATION;
}
}
return this._viewState.settingsTarget;
this.reinspectSettings([...this._treeElementsBySettingName.values()].flat().filter(s => s.isUntrusted));
}

private updateSettings(settings: SettingsTreeSettingElement[]): void {
private reinspectSettings(settings: SettingsTreeSettingElement[]): void {
for (const element of settings) {
const target = this.getTargetToInspect(element.setting);
const inspectResult = inspectSetting(element.setting.key, target, this._viewState.languageFilter, this._configurationService);
element.update(inspectResult, this._isWorkspaceTrusted);
element.inspectSelf();
}
}

Expand Down Expand Up @@ -596,9 +614,16 @@ export class SettingsTreeModel {
}

private createSettingsTreeSettingElement(setting: ISetting, parent: SettingsTreeGroupElement): SettingsTreeSettingElement {
const target = this.getTargetToInspect(setting);
const inspectResult = inspectSetting(setting.key, target, this._viewState.languageFilter, this._configurationService);
const element = new SettingsTreeSettingElement(setting, parent, inspectResult, this._isWorkspaceTrusted, this._viewState.settingsTarget, this._languageService, this._productService);
const element = new SettingsTreeSettingElement(
setting,
parent,
this._viewState.settingsTarget,
this._isWorkspaceTrusted,
this._viewState.languageFilter,
this._languageService,
this._productService,
this._userDataProfileService,
this._configurationService);

const nameElements = this._treeElementsBySettingName.get(setting.key) || [];
nameElements.push(element);
Expand Down

0 comments on commit 910aceb

Please sign in to comment.