提交 7d790610 编写于 作者: S Sandeep Somavarapu

Apply Fuzzy filter on settings descriptions

Telemetry reporting
上级 4eff0976
......@@ -7,6 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import * as nls from 'vs/nls';
import URI from 'vs/base/common/uri';
import * as DOM from 'vs/base/browser/dom';
import { Delayer } from 'vs/base/common/async';
import { Dimension, Builder } from 'vs/base/browser/builder';
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
import { flatten } from 'vs/base/common/arrays';
......@@ -106,6 +107,8 @@ export class PreferencesEditor extends BaseEditor {
private isFocussed = false;
private toDispose: IDisposable[] = [];
private delayedFilterLogging: Delayer<void>;
constructor(
@ITelemetryService telemetryService: ITelemetryService,
@IThemeService private themeService: IThemeService,
......@@ -115,6 +118,7 @@ export class PreferencesEditor extends BaseEditor {
@IModeService private modeService: IModeService
) {
super(PreferencesEditor.ID, telemetryService);
this.delayedFilterLogging = new Delayer<void>(1000);
}
public createEditor(parent: Builder) {
......@@ -204,6 +208,7 @@ export class PreferencesEditor extends BaseEditor {
}
private filterPreferences(filter: string) {
this.delayedFilterLogging.trigger(() => this.reportFilteringUsed(filter));
(<DefaultSettingsRenderer>this.getDefaultPreferencesContribution().getPreferencesRenderer()).filterPreferences(filter);
}
......@@ -259,6 +264,12 @@ export class PreferencesEditor extends BaseEditor {
model.dispose();
}
}
private reportFilteringUsed(filter: string): void {
let data = {};
data['filter'] = filter;
this.telemetryService.publicLog('defaultSettings.filter', data);
}
}
class DefaultPreferencesEditor extends CodeEditor {
......
......@@ -32,6 +32,7 @@ export interface ISetting {
value: any;
valueRange: IRange;
description: string;
descriptionRange: IRange;
}
export interface IFilterResult {
......
......@@ -17,9 +17,12 @@ import { ISettingsEditorModel, IKeybindingsEditorModel, ISettingsGroup, ISetting
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing';
import { IFilter, IMatch, or, matchesContiguousSubString, matchesPrefix, matchesFuzzy, matchesWords } from 'vs/base/common/filters';
export abstract class AbstractSettingsModel extends Disposable {
static _fuzzyFilter: IFilter = or(matchesPrefix, matchesContiguousSubString, matchesWords, matchesFuzzy);
public get groupsTerms(): string[] {
return this.settingsGroups.map(group => '@' + group.id);
}
......@@ -51,7 +54,7 @@ export abstract class AbstractSettingsModel extends Disposable {
for (const section of group.sections) {
const settings: ISetting[] = [];
for (const setting of section.settings) {
const settingMatches = this._findMatchesInSetting(regex, setting);
const settingMatches = this._findMatchesInSetting(filter, regex, setting);
if (groupMatched || settingMatches.length > 0) {
settings.push(setting);
}
......@@ -86,15 +89,7 @@ export abstract class AbstractSettingsModel extends Disposable {
return null;
}
private _findMatchesInSetting(searchRegex: RegExp, setting: ISetting): IRange[] {
const result: IRange[] = [];
for (let lineNumber = setting.range.startLineNumber; lineNumber <= setting.range.endLineNumber; lineNumber++) {
result.push(...this._findMatchesInLine(searchRegex, lineNumber));
}
return result;
}
protected abstract _findMatchesInLine(searchRegex: RegExp, lineNumber: number): IRange[];
protected abstract _findMatchesInSetting(searchString: string, searchRegex: RegExp, setting: ISetting): IRange[];
public abstract settingsGroups: ISettingsGroup[];
}
......@@ -192,7 +187,8 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti
},
value: null,
keyRange: null,
valueRange: null
valueRange: null,
descriptionRange: null,
});
}
},
......@@ -258,10 +254,18 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti
}] : [];
}
protected _findMatchesInLine(searchRegex: RegExp, lineNumber: number): IRange[] {
return this.model.findMatches(searchRegex.source, {
protected _findMatchesInSetting(searchString: string, searchRegex: RegExp, setting: ISetting): IRange[] {
const result: IRange[] = [];
for (let lineNumber = setting.range.startLineNumber; lineNumber <= setting.range.endLineNumber; lineNumber++) {
result.push(...this._findMatchesInLine(searchString, lineNumber));
}
return result;
}
private _findMatchesInLine(searchString: string, lineNumber: number): IRange[] {
return this.model.findMatches(searchString, {
startLineNumber: lineNumber, startColumn: this.model.getLineMinColumn(lineNumber), endLineNumber: lineNumber, endColumn: this.model.getLineMaxColumn(lineNumber),
}, false, !searchRegex.ignoreCase, false);
}, false, false, false);
}
}
......@@ -383,7 +387,7 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements
const prop = config.properties[key];
const value = prop.default;
const description = prop.description || '';
return { key, value, description, range: null, keyRange: null, valueRange: null };
return { key, value, description, range: null, keyRange: null, valueRange: null, descriptionRange: null };
});
settingsGroup.sections[settingsGroup.sections.length - 1].settings.push(...configurationSettings);
}
......@@ -429,6 +433,7 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements
for (const setting of section.settings) {
const settingStart = this._contentByLines.length + 1;
this.addDescription(setting.description, this.indent, this._contentByLines);
setting.descriptionRange = { startLineNumber: settingStart, startColumn: 1, endLineNumber: this._contentByLines.length, endColumn: this._contentByLines[this._contentByLines.length - 1].length };
let preValueConent = this.indent;
const keyString = JSON.stringify(setting.key);
......@@ -473,7 +478,34 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements
}
}
protected _findMatchesInLine(searchRegex: RegExp, lineNumber: number): IRange[] {
protected _findMatchesInSetting(searchString: string, searchRegex: RegExp, setting: ISetting): IRange[] {
const result: IRange[] = [...this._findMatchesInDescription(searchString, setting)];
for (let lineNumber = setting.valueRange.startLineNumber; lineNumber <= setting.valueRange.endLineNumber; lineNumber++) {
result.push(...this._findMatchesInLine(searchRegex, lineNumber));
}
return result;
}
private _findMatchesInDescription(searchString: string, setting: ISetting): IRange[] {
const result: IRange[] = [];
for (let lineNumber = setting.descriptionRange.startLineNumber; lineNumber <= setting.descriptionRange.endLineNumber; lineNumber++) {
const content = this._contentByLines[lineNumber - 1];
const matches: IMatch[] = AbstractSettingsModel._fuzzyFilter(searchString, content);
if (matches) {
result.push(...matches.map(match => {
return <IRange>{
startLineNumber: lineNumber,
startColumn: match.start + 1,
endLineNumber: lineNumber,
endColumn: match.end + 1
};
}));
}
}
return result;
}
private _findMatchesInLine(searchRegex: RegExp, lineNumber: number): IRange[] {
const result: IRange[] = [];
const text = this._contentByLines[lineNumber - 1];
var m: RegExpExecArray;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册