Skip to content

Commit 2275762

Browse files
committed
Fix search perf regression on long lines, fix microsoft#77650
1 parent 7fd0223 commit 2275762

2 files changed

Lines changed: 10 additions & 5 deletions

File tree

src/vs/workbench/contrib/search/common/searchModel.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService';
2727
import { IReplaceService } from 'vs/workbench/contrib/search/common/replace';
2828
import { editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers';
2929
import { withNullAsUndefined } from 'vs/base/common/types';
30+
import { memoize } from 'vs/base/common/decorators';
3031

3132
export class Match {
3233

@@ -74,6 +75,7 @@ export class Match {
7475
return this._range;
7576
}
7677

78+
@memoize
7779
preview(): { before: string; inside: string; after: string; } {
7880
let before = this._oneLinePreviewText.substring(0, this._rangeInPreviewText.startColumn - 1),
7981
inside = this.getMatchString(),

src/vs/workbench/services/search/common/search.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,20 +251,23 @@ export class TextSearchMatch implements ITextSearchMatch {
251251
constructor(text: string, range: ISearchRange | ISearchRange[], previewOptions?: ITextSearchPreviewOptions) {
252252
this.ranges = range;
253253

254-
if (previewOptions && previewOptions.matchLines === 1 && !Array.isArray(range)) {
254+
if (previewOptions && previewOptions.matchLines === 1 && (!Array.isArray(range) || range.length === 1)) {
255+
const oneRange = Array.isArray(range) ? range[0] : range;
256+
255257
// 1 line preview requested
256258
text = getNLines(text, previewOptions.matchLines);
257259
const leadingChars = Math.floor(previewOptions.charsPerLine / 5);
258-
const previewStart = Math.max(range.startColumn - leadingChars, 0);
260+
const previewStart = Math.max(oneRange.startColumn - leadingChars, 0);
259261
const previewText = text.substring(previewStart, previewOptions.charsPerLine + previewStart);
260262

261-
const endColInPreview = (range.endLineNumber - range.startLineNumber + 1) <= previewOptions.matchLines ?
262-
Math.min(previewText.length, range.endColumn - previewStart) : // if number of match lines will not be trimmed by previewOptions
263+
const endColInPreview = (oneRange.endLineNumber - oneRange.startLineNumber + 1) <= previewOptions.matchLines ?
264+
Math.min(previewText.length, oneRange.endColumn - previewStart) : // if number of match lines will not be trimmed by previewOptions
263265
previewText.length; // if number of lines is trimmed
264266

267+
const oneLineRange = new OneLineRange(0, oneRange.startColumn - previewStart, endColInPreview);
265268
this.preview = {
266269
text: previewText,
267-
matches: new OneLineRange(0, range.startColumn - previewStart, endColInPreview)
270+
matches: Array.isArray(range) ? [oneLineRange] : oneLineRange
268271
};
269272
} else {
270273
const firstMatchLine = Array.isArray(range) ? range[0].startLineNumber : range.startLineNumber;

0 commit comments

Comments
 (0)