提交 c42e07f0 编写于 作者: R Rob Lourens

Fix #57619

上级 5569739e
......@@ -39,7 +39,7 @@ import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/prefer
import { SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets';
import { commonlyUsedData, tocData } from 'vs/workbench/parts/preferences/browser/settingsLayout';
import { resolveExtensionsSettings, resolveSettingsTree, SettingsDataSource, SettingsRenderer, SettingsTree, SimplePagedDataSource } from 'vs/workbench/parts/preferences/browser/settingsTree';
import { countSettingGroupChildrenWithPredicate, ISettingsEditorViewState, MODIFIED_SETTING_TAG, ONLINE_SERVICES_SETTING_TAG, SearchResultIdx, SearchResultModel, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels';
import { countSettingGroupChildrenWithPredicate, ISettingsEditorViewState, MODIFIED_SETTING_TAG, ONLINE_SERVICES_SETTING_TAG, SearchResultIdx, SearchResultModel, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement, parseQuery } from 'vs/workbench/parts/preferences/browser/settingsTreeModels';
import { TOCRenderer, TOCTree, TOCTreeModel } from 'vs/workbench/parts/preferences/browser/tocTree';
import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider } from 'vs/workbench/parts/preferences/common/preferences';
import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService';
......@@ -99,8 +99,6 @@ export class SettingsEditor2 extends BaseEditor {
private scheduledRefreshes: Map<string, DOM.IFocusTracker>;
private tagRegex = /(^|\s)@tag:("([^"]*)"|[^"]\S*)/g;
/** Don't spam warnings */
private hasWarnedMissingSettings: boolean;
......@@ -322,9 +320,9 @@ export class SettingsEditor2 extends BaseEditor {
}
actions.push(new Action('settings.openSettingsJson', localize('openSettingsJsonLabel', "Open settings.json"), undefined, undefined, () => {
return this.openSettingsFile().then(editor => {
const currentSearch = this.searchWidget.getValue();
if (editor instanceof PreferencesEditor && currentSearch) {
editor.focusSearch(currentSearch);
const currentQuery = parseQuery(this.searchWidget.getValue());
if (editor instanceof PreferencesEditor && currentQuery) {
editor.focusSearch(currentQuery.query);
}
});
}));
......@@ -874,17 +872,11 @@ export class SettingsEditor2 extends BaseEditor {
private triggerSearch(query: string): TPromise<void> {
this.viewState.tagFilters = new Set<string>();
if (query) {
query = query.replace(this.tagRegex, (_, __, quotedTag, tag) => {
this.viewState.tagFilters.add(tag || quotedTag);
return '';
});
query = query.replace(`@${MODIFIED_SETTING_TAG}`, () => {
this.viewState.tagFilters.add(MODIFIED_SETTING_TAG);
return '';
});
const parsedQuery = parseQuery(query);
query = parsedQuery.query;
parsedQuery.tags.forEach(tag => this.viewState.tagFilters.add(tag));
}
query = query.trim();
if (query && query !== '@') {
query = this.parseSettingFromJSON(query) || query;
return this.triggerFilterPreferences(query);
......
......@@ -484,4 +484,30 @@ export class SearchResultModel extends SettingsTreeModel {
return flatSettings;
}
}
\ No newline at end of file
}
export interface IParsedQuery {
tags: string[];
query: string;
}
const tagRegex = /(^|\s)@tag:("([^"]*)"|[^"]\S*)/g;
export function parseQuery(query: string): IParsedQuery {
const tags: string[] = [];
query = query.replace(tagRegex, (_, __, quotedTag, tag) => {
tags.push(tag || quotedTag);
return '';
});
query = query.replace(`@${MODIFIED_SETTING_TAG}`, () => {
tags.push(MODIFIED_SETTING_TAG);
return '';
});
query = query.trim();
return {
tags,
query
};
}
......@@ -6,7 +6,7 @@
'use strict';
import * as assert from 'assert';
import { settingKeyToDisplayFormat } from 'vs/workbench/parts/preferences/browser/settingsTreeModels';
import { settingKeyToDisplayFormat, parseQuery, IParsedQuery } from 'vs/workbench/parts/preferences/browser/settingsTreeModels';
suite('SettingsTree', () => {
test('settingKeyToDisplayFormat', () => {
......@@ -104,4 +104,77 @@ suite('SettingsTree', () => {
label: 'Etc'
});
});
test('parseQuery', () => {
function testParseQuery(input: string, expected: IParsedQuery) {
assert.deepEqual(
parseQuery(input),
expected,
input
);
}
testParseQuery(
'',
<IParsedQuery>{
tags: [],
query: ''
});
testParseQuery(
'@modified',
<IParsedQuery>{
tags: ['modified'],
query: ''
});
testParseQuery(
'@tag:foo',
<IParsedQuery>{
tags: ['foo'],
query: ''
});
testParseQuery(
'@modified foo',
<IParsedQuery>{
tags: ['modified'],
query: 'foo'
});
testParseQuery(
'@tag:foo @modified',
<IParsedQuery>{
tags: ['foo', 'modified'],
query: ''
});
testParseQuery(
'@tag:foo @modified my query',
<IParsedQuery>{
tags: ['foo', 'modified'],
query: 'my query'
});
testParseQuery(
'test @modified query',
<IParsedQuery>{
tags: ['modified'],
query: 'test query'
});
testParseQuery(
'test @modified',
<IParsedQuery>{
tags: ['modified'],
query: 'test'
});
testParseQuery(
'query has @ for some reason',
<IParsedQuery>{
tags: [],
query: 'query has @ for some reason'
});
});
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册