diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index b0139cf0c6a27..bc593c0ba7e5b 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -174,7 +174,7 @@ export class SettingsEditor2 extends EditorPane { private settingFastUpdateDelayer: Delayer; private settingSlowUpdateDelayer: Delayer; - private pendingSettingUpdate: { key: string; value: any; languageFilters: string[] | null } | null = null; + private pendingSettingUpdate: { key: string; value: any; languageFilter: string | undefined } | null = null; private readonly viewState: ISettingsEditorViewState; private _searchResultModel: SearchResultModel | null = null; @@ -875,17 +875,16 @@ export class SettingsEditor2 extends EditorPane { private onDidChangeSetting(key: string, value: any, type: SettingValueType | SettingValueType[], manualReset: boolean): void { const parsedQuery = parseQuery(this.searchWidget.getValue()); - const languageFilters = (parsedQuery && parsedQuery.languageFilters.length) ? - parsedQuery.languageFilters : null; + const languageFilter = parsedQuery.languageFilter; if (this.pendingSettingUpdate && this.pendingSettingUpdate.key !== key) { - this.updateChangedSetting(key, value, manualReset, languageFilters); + this.updateChangedSetting(key, value, manualReset, languageFilter); } - this.pendingSettingUpdate = { key, value, languageFilters }; + this.pendingSettingUpdate = { key, value, languageFilter }; if (SettingsEditor2.shouldSettingUpdateFast(type)) { - this.settingFastUpdateDelayer.trigger(() => this.updateChangedSetting(key, value, manualReset, languageFilters)); + this.settingFastUpdateDelayer.trigger(() => this.updateChangedSetting(key, value, manualReset, languageFilter)); } else { - this.settingSlowUpdateDelayer.trigger(() => this.updateChangedSetting(key, value, manualReset, languageFilters)); + this.settingSlowUpdateDelayer.trigger(() => this.updateChangedSetting(key, value, manualReset, languageFilter)); } } @@ -955,17 +954,17 @@ export class SettingsEditor2 extends EditorPane { return ancestors.reverse(); } - private updateChangedSetting(key: string, value: any, manualReset: boolean, languageFilters: string[] | null): Promise { + private updateChangedSetting(key: string, value: any, manualReset: boolean, languageFilter: string | undefined): Promise { // ConfigurationService displays the error if this fails. // Force a render afterwards because onDidConfigurationUpdate doesn't fire if the update doesn't result in an effective setting value change const settingsTarget = this.settingsTargetsWidget.settingsTarget; const resource = URI.isUri(settingsTarget) ? settingsTarget : undefined; const configurationTarget = (resource ? ConfigurationTarget.WORKSPACE_FOLDER : settingsTarget); - const overrides: IConfigurationUpdateOverrides = { resource, overrideIdentifiers: languageFilters }; + const overrides: IConfigurationUpdateOverrides = { resource, overrideIdentifiers: languageFilter ? [languageFilter] : undefined }; const configurationTargetIsWorkspace = configurationTarget === ConfigurationTarget.WORKSPACE || configurationTarget === ConfigurationTarget.WORKSPACE_FOLDER; - const userPassedInManualReset = configurationTargetIsWorkspace || !!languageFilters?.length; + const userPassedInManualReset = configurationTargetIsWorkspace || !!languageFilter; const isManualReset = userPassedInManualReset ? manualReset : value === undefined; // If the user is changing the value back to the default, and we're not targeting a workspace scope, do a 'reset' instead @@ -1106,7 +1105,7 @@ export class SettingsEditor2 extends EditorPane { resolvedSettingsRoot.children!.push(await createTocTreeForExtensionSettings(this.extensionService, dividedGroups.extension || [])); if (!this.workspaceTrustManagementService.isWorkspaceTrusted() && (this.viewState.settingsTarget instanceof URI || this.viewState.settingsTarget === ConfigurationTarget.WORKSPACE)) { - const configuredUntrustedWorkspaceSettings = resolveConfiguredUntrustedSettings(groups, this.viewState.settingsTarget, this.viewState.languageFilters, this.configurationService); + const configuredUntrustedWorkspaceSettings = resolveConfiguredUntrustedSettings(groups, this.viewState.settingsTarget, this.viewState.languageFilter, this.configurationService); if (configuredUntrustedWorkspaceSettings.length) { resolvedSettingsRoot.children!.unshift({ id: 'workspaceTrust', @@ -1274,7 +1273,7 @@ export class SettingsEditor2 extends EditorPane { this.viewState.extensionFilters = new Set(); this.viewState.featureFilters = new Set(); this.viewState.idFilters = new Set(); - this.viewState.languageFilters = new Set(); + this.viewState.languageFilter = undefined; if (query) { const parsedQuery = parseQuery(query); query = parsedQuery.query; @@ -1282,14 +1281,14 @@ export class SettingsEditor2 extends EditorPane { parsedQuery.extensionFilters.forEach(extensionId => this.viewState.extensionFilters!.add(extensionId)); parsedQuery.featureFilters!.forEach(feature => this.viewState.featureFilters!.add(feature)); parsedQuery.idFilters!.forEach(id => this.viewState.idFilters!.add(id)); - parsedQuery.languageFilters!.forEach(id => this.viewState.languageFilters!.add(id)); + this.viewState.languageFilter = parsedQuery.languageFilter; } if (query && query !== '@') { query = this.parseSettingFromJSON(query) || query; return this.triggerFilterPreferences(query); } else { - if (this.viewState.tagFilters.size || this.viewState.extensionFilters.size || this.viewState.featureFilters.size || this.viewState.idFilters.size || this.viewState.languageFilters.size) { + if (this.viewState.tagFilters.size || this.viewState.extensionFilters.size || this.viewState.featureFilters.size || this.viewState.idFilters.size || this.viewState.languageFilter) { this.searchResultModel = this.createFilterModel(); } else { this.searchResultModel = null; diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 052b4c17146d5..f4b4b41ad943c 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -391,9 +391,9 @@ export function resolveSettingsTree(tocData: ITOCEntry, coreSettingsGrou }; } -export function resolveConfiguredUntrustedSettings(groups: ISettingsGroup[], target: SettingsTarget, languageFilters: Set | undefined, configurationService: IWorkbenchConfigurationService): ISetting[] { +export function resolveConfiguredUntrustedSettings(groups: ISettingsGroup[], target: SettingsTarget, languageFilter: string | undefined, configurationService: IWorkbenchConfigurationService): ISetting[] { const allSettings = getFlatSettings(groups); - return [...allSettings].filter(setting => setting.restricted && inspectSetting(setting.key, target, languageFilters, configurationService).isConfigured); + return [...allSettings].filter(setting => setting.restricted && inspectSetting(setting.key, target, languageFilter, configurationService).isConfigured); } function compareNullableIntegers(a?: number, b?: number) { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index bfa79d6f7124b..3a7ee307bfadc 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -28,7 +28,7 @@ export interface ISettingsEditorViewState { extensionFilters?: Set; featureFilters?: Set; idFilters?: Set; - languageFilters?: Set; + languageFilter?: string; filterToCategory?: SettingsTreeGroupElement; } @@ -179,7 +179,7 @@ export class SettingsTreeSettingElement extends SettingsTreeElement { } update(inspectResult: IInspectResult, isWorkspaceTrusted: boolean): void { - const { isConfigured, inspected, targetSelector, inspectedLanguageOverrides, languageSelectors } = inspectResult; + const { isConfigured, inspected, targetSelector, inspectedLanguageOverrides, languageSelector: languageSelectors } = inspectResult; switch (targetSelector) { case 'workspaceFolderValue': @@ -211,6 +211,7 @@ export class SettingsTreeSettingElement extends SettingsTreeElement { } } + // TODO: fix this section. if (isConfigured && languageSelectors) { for (const languageSelector of languageSelectors) { // We already targeted the scope to use above. @@ -374,8 +375,8 @@ export class SettingsTreeSettingElement extends SettingsTreeElement { return idFilters.has(this.setting.key); } - matchesAllLanguages(languageFilters?: Set): boolean { - if (!languageFilters || !languageFilters.size + matchesAllLanguages(languageFilter?: string): boolean { + if (!languageFilter || this.setting.scope === ConfigurationScope.LANGUAGE_OVERRIDABLE) { return true; } @@ -460,7 +461,7 @@ export class SettingsTreeModel { private updateSettings(settings: SettingsTreeSettingElement[]): void { settings.forEach(element => { - const inspectResult = inspectSetting(element.setting.key, this._viewState.settingsTarget, this._viewState.languageFilters, this._configurationService); + const inspectResult = inspectSetting(element.setting.key, this._viewState.settingsTarget, this._viewState.languageFilter, this._configurationService); element.update(inspectResult, this._isWorkspaceTrusted); }); } @@ -496,7 +497,7 @@ export class SettingsTreeModel { } private createSettingsTreeSettingElement(setting: ISetting, parent: SettingsTreeGroupElement): SettingsTreeSettingElement { - const inspectResult = inspectSetting(setting.key, this._viewState.settingsTarget, this._viewState.languageFilters, this._configurationService); + const inspectResult = inspectSetting(setting.key, this._viewState.settingsTarget, this._viewState.languageFilter, this._configurationService); const element = new SettingsTreeSettingElement(setting, parent, inspectResult, this._isWorkspaceTrusted); const nameElements = this._treeElementsBySettingName.get(setting.key) || []; @@ -511,10 +512,10 @@ interface IInspectResult { inspected: IConfigurationValue; targetSelector: 'userLocalValue' | 'userRemoteValue' | 'workspaceValue' | 'workspaceFolderValue'; inspectedLanguageOverrides: Map>; - languageSelectors: Set | undefined; + languageSelector: string | undefined; } -export function inspectSetting(key: string, target: SettingsTarget, languageFilters: Set | undefined, configurationService: IWorkbenchConfigurationService): IInspectResult { +export function inspectSetting(key: string, target: SettingsTarget, languageFilter: string | undefined, configurationService: IWorkbenchConfigurationService): IInspectResult { const inspectOverrides = URI.isUri(target) ? { resource: target } : undefined; const inspected = configurationService.inspect(key, inspectOverrides); const targetSelector = target === ConfigurationTarget.USER_LOCAL ? 'userLocalValue' : @@ -545,18 +546,15 @@ export function inspectSetting(key: string, target: SettingsTarget, languageFilt // If we're viewing a setting under a language filter, pretend it's // not configured again. // For all language filters, see if there's an override for that filter. - if (languageFilters) { + if (languageFilter) { isConfigured = false; - for (const language of languageFilters) { - if (inspectedLanguageOverrides.has(language) && typeof inspectedLanguageOverrides.get(language)![targetSelector] !== 'undefined') { - isConfigured = true; - break; - } + if (inspectedLanguageOverrides.has(languageFilter) && typeof inspectedLanguageOverrides.get(languageFilter)![targetSelector] !== 'undefined') { + isConfigured = true; } } } - return { isConfigured, inspected, targetSelector, inspectedLanguageOverrides, languageSelectors: languageFilters }; + return { isConfigured, inspected, targetSelector, inspectedLanguageOverrides, languageSelector: languageFilter }; } function sanitizeId(id: string): string { @@ -798,7 +796,7 @@ export class SearchResultModel extends SettingsTreeModel { const isRemote = !!this.environmentService.remoteAuthority; this.root.children = this.root.children - .filter(child => child instanceof SettingsTreeSettingElement && child.matchesAllTags(this._viewState.tagFilters) && child.matchesScope(this._viewState.settingsTarget, isRemote) && child.matchesAnyExtension(this._viewState.extensionFilters) && child.matchesAnyId(this._viewState.idFilters) && child.matchesAnyFeature(this._viewState.featureFilters) && child.matchesAllLanguages(this._viewState.languageFilters)); + .filter(child => child instanceof SettingsTreeSettingElement && child.matchesAllTags(this._viewState.tagFilters) && child.matchesScope(this._viewState.settingsTarget, isRemote) && child.matchesAnyExtension(this._viewState.extensionFilters) && child.matchesAnyId(this._viewState.idFilters) && child.matchesAnyFeature(this._viewState.featureFilters) && child.matchesAllLanguages(this._viewState.languageFilter)); if (this.newExtensionSearchResults && this.newExtensionSearchResults.filterMatches.length) { const resultExtensionIds = this.newExtensionSearchResults.filterMatches @@ -830,7 +828,7 @@ export interface IParsedQuery { extensionFilters: string[]; idFilters: string[]; featureFilters: string[]; - languageFilters: string[]; + languageFilter: string | undefined; } const tagRegex = /(^|\s)@tag:("([^"]*)"|[^"]\S*)/g; @@ -885,7 +883,7 @@ export function parseQuery(query: string): IParsedQuery { extensionFilters: extensions, featureFilters: features, idFilters: ids, - languageFilters: langs.length ? [langs[0]] : [], + languageFilter: langs.length ? langs[0] : undefined, query, }; } diff --git a/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts b/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts index 1f7b284cdad50..8d8d19abc03d0 100644 --- a/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts +++ b/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts @@ -150,7 +150,7 @@ suite('SettingsTree', () => { query: '', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -161,7 +161,7 @@ suite('SettingsTree', () => { query: '', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -172,7 +172,7 @@ suite('SettingsTree', () => { query: '', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -183,7 +183,7 @@ suite('SettingsTree', () => { query: 'foo', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -194,7 +194,7 @@ suite('SettingsTree', () => { query: '', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -205,7 +205,7 @@ suite('SettingsTree', () => { query: 'my query', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -216,7 +216,7 @@ suite('SettingsTree', () => { query: 'test query', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -227,7 +227,7 @@ suite('SettingsTree', () => { query: 'test', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -238,7 +238,7 @@ suite('SettingsTree', () => { query: 'query has @ for some reason', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -249,7 +249,7 @@ suite('SettingsTree', () => { query: '', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -260,7 +260,7 @@ suite('SettingsTree', () => { query: '', featureFilters: [], idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( '@feature:scm', @@ -270,7 +270,7 @@ suite('SettingsTree', () => { featureFilters: ['scm'], query: '', idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -281,7 +281,7 @@ suite('SettingsTree', () => { featureFilters: ['scm', 'terminal'], query: '', idFilters: [], - languageFilters: [] + languageFilter: undefined }); testParseQuery( '@id:files.autoSave', @@ -291,7 +291,7 @@ suite('SettingsTree', () => { featureFilters: [], query: '', idFilters: ['files.autoSave'], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -302,7 +302,7 @@ suite('SettingsTree', () => { featureFilters: [], query: '', idFilters: ['files.autoSave', 'terminal.integrated.commandsToSkipShell'], - languageFilters: [] + languageFilter: undefined }); testParseQuery( @@ -313,7 +313,7 @@ suite('SettingsTree', () => { featureFilters: [], query: '', idFilters: [], - languageFilters: ['cpp'] + languageFilter: 'cpp' }); testParseQuery( @@ -324,7 +324,7 @@ suite('SettingsTree', () => { featureFilters: [], query: '', idFilters: [], - languageFilters: ['cpp'] + languageFilter: 'cpp' }); }); });