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

Fix search perf regression on long lines, fix #77650

上级 7fd02233
......@@ -27,6 +27,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService';
import { IReplaceService } from 'vs/workbench/contrib/search/common/replace';
import { editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers';
import { withNullAsUndefined } from 'vs/base/common/types';
import { memoize } from 'vs/base/common/decorators';
export class Match {
......@@ -74,6 +75,7 @@ export class Match {
return this._range;
}
@memoize
preview(): { before: string; inside: string; after: string; } {
let before = this._oneLinePreviewText.substring(0, this._rangeInPreviewText.startColumn - 1),
inside = this.getMatchString(),
......
......@@ -251,20 +251,23 @@ export class TextSearchMatch implements ITextSearchMatch {
constructor(text: string, range: ISearchRange | ISearchRange[], previewOptions?: ITextSearchPreviewOptions) {
this.ranges = range;
if (previewOptions && previewOptions.matchLines === 1 && !Array.isArray(range)) {
if (previewOptions && previewOptions.matchLines === 1 && (!Array.isArray(range) || range.length === 1)) {
const oneRange = Array.isArray(range) ? range[0] : range;
// 1 line preview requested
text = getNLines(text, previewOptions.matchLines);
const leadingChars = Math.floor(previewOptions.charsPerLine / 5);
const previewStart = Math.max(range.startColumn - leadingChars, 0);
const previewStart = Math.max(oneRange.startColumn - leadingChars, 0);
const previewText = text.substring(previewStart, previewOptions.charsPerLine + previewStart);
const endColInPreview = (range.endLineNumber - range.startLineNumber + 1) <= previewOptions.matchLines ?
Math.min(previewText.length, range.endColumn - previewStart) : // if number of match lines will not be trimmed by previewOptions
const endColInPreview = (oneRange.endLineNumber - oneRange.startLineNumber + 1) <= previewOptions.matchLines ?
Math.min(previewText.length, oneRange.endColumn - previewStart) : // if number of match lines will not be trimmed by previewOptions
previewText.length; // if number of lines is trimmed
const oneLineRange = new OneLineRange(0, oneRange.startColumn - previewStart, endColInPreview);
this.preview = {
text: previewText,
matches: new OneLineRange(0, range.startColumn - previewStart, endColInPreview)
matches: Array.isArray(range) ? [oneLineRange] : oneLineRange
};
} else {
const firstMatchLine = Array.isArray(range) ? range[0].startLineNumber : range.startLineNumber;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册