diff --git a/extensions/search-rg/src/test/searchrg.test.ts b/extensions/search-rg/src/test/searchrg.test.ts index af55abf9b0f..6c5f3e172a5 100644 --- a/extensions/search-rg/src/test/searchrg.test.ts +++ b/extensions/search-rg/src/test/searchrg.test.ts @@ -18,115 +18,117 @@ function createOneLineRange(lineNumber: number, startCol: number, endCol: number const uri = vscode.Uri.file('/foo/bar'); suite('search-rg', () => { - const previewOptions1: vscode.TextSearchPreviewOptions = { - leadingChars: 10, - maxLines: 1, - totalChars: 100 - }; - test('empty', () => { - assert.deepEqual( - createTextSearchResult(uri, '', createOneLineRange(5, 0, 0)), - { - preview: { - text: '', - match: createOneLineRange(0, 0, 0) - }, - range: createOneLineRange(5, 0, 0), - uri - }); + // Duplicate code is tested in search.test.ts - assert.deepEqual( - createTextSearchResult(uri, '', createOneLineRange(5, 0, 0), previewOptions1), - { - preview: { - text: '', - match: createOneLineRange(0, 0, 0) - }, - range: createOneLineRange(5, 0, 0), - uri - }); - }); + // const previewOptions1: vscode.TextSearchPreviewOptions = { + // maxLines: 1, + // totalChars: 100 + // }; - test('short', () => { - assert.deepEqual( - createTextSearchResult(uri, 'foo bar', createOneLineRange(5, 4, 7)), - { - preview: { - text: 'foo bar', - match: createOneLineRange(0, 4, 7) - }, - range: createOneLineRange(5, 4, 7), - uri - }); + // test('empty', () => { + // assert.deepEqual( + // createTextSearchResult(uri, '', createOneLineRange(5, 0, 0)), + // { + // preview: { + // text: '', + // match: createOneLineRange(0, 0, 0) + // }, + // range: createOneLineRange(5, 0, 0), + // uri + // }); - assert.deepEqual( - createTextSearchResult(uri, 'foo bar', createOneLineRange(5, 4, 7), previewOptions1), - { - preview: { - text: 'foo bar', - match: createOneLineRange(0, 4, 7) - }, - range: createOneLineRange(5, 4, 7), - uri - }); - }); + // assert.deepEqual( + // createTextSearchResult(uri, '', createOneLineRange(5, 0, 0), previewOptions1), + // { + // preview: { + // text: '', + // match: createOneLineRange(0, 0, 0) + // }, + // range: createOneLineRange(5, 0, 0), + // uri + // }); + // }); - test('leading', () => { - assert.deepEqual( - createTextSearchResult(uri, 'long text very long text foo', createOneLineRange(5, 25, 28), previewOptions1), - { - preview: { - text: 'long text foo', - match: createOneLineRange(0, 10, 13) - }, - range: createOneLineRange(5, 25, 28), - uri - }); - }); + // test('short', () => { + // assert.deepEqual( + // createTextSearchResult(uri, 'foo bar', createOneLineRange(5, 4, 7)), + // { + // preview: { + // text: 'foo bar', + // match: createOneLineRange(0, 4, 7) + // }, + // range: createOneLineRange(5, 4, 7), + // uri + // }); - test('trailing', () => { - assert.deepEqual( - createTextSearchResult(uri, 'foo long text very long text long text very long text long text very long text long text very long text long text very long text', createOneLineRange(5, 0, 3), previewOptions1), - { - preview: { - text: 'foo long text very long text long text very long text long text very long text long text very long t', - match: createOneLineRange(0, 0, 3) - }, - range: createOneLineRange(5, 0, 3), - uri - }); - }); + // assert.deepEqual( + // createTextSearchResult(uri, 'foo bar', createOneLineRange(5, 4, 7), previewOptions1), + // { + // preview: { + // text: 'foo bar', + // match: createOneLineRange(0, 4, 7) + // }, + // range: createOneLineRange(5, 4, 7), + // uri + // }); + // }); - test('middle', () => { - assert.deepEqual( - createTextSearchResult(uri, 'long text very long text long foo text very long text long text very long text long text very long text long text very long text', createOneLineRange(5, 30, 33), previewOptions1), - { - preview: { - text: 'text long foo text very long text long text very long text long text very long text long text very l', - match: createOneLineRange(0, 10, 13) - }, - range: createOneLineRange(5, 30, 33), - uri - }); - }); + // test('leading', () => { + // assert.deepEqual( + // createTextSearchResult(uri, 'long text very long text foo', createOneLineRange(5, 25, 28), previewOptions1), + // { + // preview: { + // text: 'long text foo', + // match: createOneLineRange(0, 10, 13) + // }, + // range: createOneLineRange(5, 25, 28), + // uri + // }); + // }); - test('truncating match', () => { - const previewOptions: vscode.TextSearchPreviewOptions = { - leadingChars: 4, - maxLines: 1, - totalChars: 5 - }; + // test('trailing', () => { + // assert.deepEqual( + // createTextSearchResult(uri, 'foo long text very long text long text very long text long text very long text long text very long text long text very long text', createOneLineRange(5, 0, 3), previewOptions1), + // { + // preview: { + // text: 'foo long text very long text long text very long text long text very long text long text very long t', + // match: createOneLineRange(0, 0, 3) + // }, + // range: createOneLineRange(5, 0, 3), + // uri + // }); + // }); - assert.deepEqual( - createTextSearchResult(uri, 'foo bar', createOneLineRange(0, 4, 7), previewOptions), - { - preview: { - text: 'foo b', - match: createOneLineRange(0, 4, 5) - }, - range: createOneLineRange(0, 4, 7), - uri - }); - }); + // test('middle', () => { + // assert.deepEqual( + // createTextSearchResult(uri, 'long text very long text long foo text very long text long text very long text long text very long text long text very long text', createOneLineRange(5, 30, 33), previewOptions1), + // { + // preview: { + // text: 'text long foo text very long text long text very long text long text very long text long text very l', + // match: createOneLineRange(0, 10, 13) + // }, + // range: createOneLineRange(5, 30, 33), + // uri + // }); + // }); + + // test('truncating match', () => { + // const previewOptions: vscode.TextSearchPreviewOptions = { + // leadingChars: 4, + // maxLines: 1, + // totalChars: 5 + // }; + + // assert.deepEqual( + // createTextSearchResult(uri, 'foo bar', createOneLineRange(0, 4, 7), previewOptions), + // { + // preview: { + // text: 'foo b', + // match: createOneLineRange(0, 4, 5) + // }, + // range: createOneLineRange(0, 4, 7), + // uri + // }); + // }); }); \ No newline at end of file diff --git a/extensions/search-rg/src/utils.ts b/extensions/search-rg/src/utils.ts index 5b65f3a598a..3ca8a39102e 100644 --- a/extensions/search-rg/src/utils.ts +++ b/extensions/search-rg/src/utils.ts @@ -22,7 +22,8 @@ export function anchorGlob(glob: string): string { export function createTextSearchResult(uri: vscode.Uri, fullText: string, range: vscode.Range, previewOptions?: vscode.TextSearchPreviewOptions): vscode.TextSearchResult { let preview: vscode.TextSearchResultPreview; if (previewOptions) { - const previewStart = Math.max(range.start.character - previewOptions.leadingChars, 0); + const leadingChars = Math.floor(previewOptions.totalChars / 5); + const previewStart = Math.max(range.start.character - leadingChars, 0); const previewEnd = previewOptions.totalChars + previewStart; const endOfMatchRangeInPreview = Math.min(previewEnd, range.end.character - previewStart); diff --git a/src/vs/platform/search/common/search.ts b/src/vs/platform/search/common/search.ts index 6196383c8df..a4fcd0a44b0 100644 --- a/src/vs/platform/search/common/search.ts +++ b/src/vs/platform/search/common/search.ts @@ -141,7 +141,6 @@ export type IRawFileMatch2 = IFileMatch; export interface ITextSearchPreviewOptions { maxLines: number; - leadingChars: number; totalChars: number; } @@ -238,7 +237,8 @@ export class TextSearchResult implements ITextSearchResult { constructor(fullLine: string, range: ISearchRange, previewOptions?: ITextSearchPreviewOptions) { this.range = range; if (previewOptions) { - const previewStart = Math.max(range.startColumn - previewOptions.leadingChars, 0); + const leadingChars = Math.floor(previewOptions.totalChars / 5); + const previewStart = Math.max(range.startColumn - leadingChars, 0); const previewEnd = previewOptions.totalChars + previewStart; const endOfMatchRangeInPreview = Math.min(previewEnd, range.endColumn - previewStart); diff --git a/src/vs/platform/search/test/common/search.test.ts b/src/vs/platform/search/test/common/search.test.ts index c56b87b33a8..f1a4b9b9cce 100644 --- a/src/vs/platform/search/test/common/search.test.ts +++ b/src/vs/platform/search/test/common/search.test.ts @@ -5,111 +5,79 @@ 'use strict'; import * as assert from 'assert'; -import { TextSearchResult, OneLineRange, ITextSearchResult, ITextSearchPreviewOptions } from 'vs/platform/search/common/search'; +import { ITextSearchPreviewOptions, OneLineRange, TextSearchResult } from 'vs/platform/search/common/search'; suite('TextSearchResult', () => { const previewOptions1: ITextSearchPreviewOptions = { - leadingChars: 10, maxLines: 1, totalChars: 100 }; - test('empty', () => { - assert.deepEqual( - new TextSearchResult('', new OneLineRange(5, 0, 0)), - { - preview: { - text: '', - match: new OneLineRange(0, 0, 0) - }, - range: new OneLineRange(5, 0, 0) - }); + function assertPreviewRangeText(text: string, result: TextSearchResult): void { + assert.equal( + result.preview.text.substring(result.preview.match.startColumn, result.preview.match.endColumn), + text); + } - assert.deepEqual( - new TextSearchResult('', new OneLineRange(5, 0, 0), previewOptions1), - { - preview: { - text: '', - match: new OneLineRange(0, 0, 0) - }, - range: new OneLineRange(5, 0, 0) - }); + test('empty without preview options', () => { + const range = new OneLineRange(5, 0, 0); + const result = new TextSearchResult('', range); + assert.deepEqual(result.range, range); + assertPreviewRangeText('', result); }); - test('short', () => { - assert.deepEqual( - new TextSearchResult('foo bar', new OneLineRange(5, 4, 7)), - { - preview: { - text: 'foo bar', - match: new OneLineRange(0, 4, 7) - }, - range: new OneLineRange(5, 4, 7) - }); + test('empty with preview options', () => { + const range = new OneLineRange(5, 0, 0); + const result = new TextSearchResult('', range, previewOptions1); + assert.deepEqual(result.range, range); + assertPreviewRangeText('', result); + }); - assert.deepEqual( - new TextSearchResult('foo bar', new OneLineRange(5, 4, 7), previewOptions1), - { - preview: { - text: 'foo bar', - match: new OneLineRange(0, 4, 7) - }, - range: new OneLineRange(5, 4, 7) - }); + test('short without preview options', () => { + const range = new OneLineRange(5, 4, 7); + const result = new TextSearchResult('foo bar', range); + assert.deepEqual(result.range, range); + assertPreviewRangeText('bar', result); + }); + + test('short with preview options', () => { + const range = new OneLineRange(5, 4, 7); + const result = new TextSearchResult('foo bar', range, previewOptions1); + assert.deepEqual(result.range, range); + assertPreviewRangeText('bar', result); }); test('leading', () => { - assert.deepEqual( - new TextSearchResult('long text very long text foo', new OneLineRange(5, 25, 28), previewOptions1), - { - preview: { - text: 'long text foo', - match: new OneLineRange(0, 10, 13) - }, - range: new OneLineRange(5, 25, 28) - }); + const range = new OneLineRange(5, 25, 28); + const result = new TextSearchResult('long text very long text foo', range, previewOptions1); + assert.deepEqual(result.range, range); + assertPreviewRangeText('foo', result); }); test('trailing', () => { - assert.deepEqual( - new TextSearchResult('foo long text very long text long text very long text long text very long text long text very long text long text very long text', new OneLineRange(5, 0, 3), previewOptions1), - { - preview: { - text: 'foo long text very long text long text very long text long text very long text long text very long t', - match: new OneLineRange(0, 0, 3) - }, - range: new OneLineRange(5, 0, 3) - }); + const range = new OneLineRange(5, 0, 3); + const result = new TextSearchResult('foo long text very long text long text very long text long text very long text long text very long text long text very long text', range, previewOptions1); + assert.deepEqual(result.range, range); + assertPreviewRangeText('foo', result); }); test('middle', () => { - assert.deepEqual( - new TextSearchResult('long text very long text long foo text very long text long text very long text long text very long text long text very long text', new OneLineRange(5, 30, 33), previewOptions1), - { - preview: { - text: 'text long foo text very long text long text very long text long text very long text long text very l', - match: new OneLineRange(0, 10, 13) - }, - range: new OneLineRange(5, 30, 33) - }); + const range = new OneLineRange(5, 30, 33); + const result = new TextSearchResult('long text very long text long foo text very long text long text very long text long text very long text long text very long text', range, previewOptions1); + assert.deepEqual(result.range, range); + assertPreviewRangeText('foo', result); }); test('truncating match', () => { const previewOptions: ITextSearchPreviewOptions = { - leadingChars: 4, maxLines: 1, - totalChars: 5 + totalChars: 1 }; - assert.deepEqual( - new TextSearchResult('foo bar', new OneLineRange(0, 4, 7), previewOptions), - { - preview: { - text: 'foo b', - match: new OneLineRange(0, 4, 5) - }, - range: new OneLineRange(0, 4, 7) - }); + const range = new OneLineRange(0, 4, 7); + const result = new TextSearchResult('foo bar', range, previewOptions); + assert.deepEqual(result.range, range); + assertPreviewRangeText('b', result); }); }); \ No newline at end of file diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b55fac463d8..3807fe1a9b6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -99,11 +99,6 @@ declare module 'vscode' { */ maxLines: number; - /** - * The maximum number of characters included before the start of the match. - */ - leadingChars: number; - /** * The maximum number of characters included per line. */ diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 50866d71b23..319cd714529 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -384,10 +384,6 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { findTextInFiles(query: vscode.TextSearchQuery, options: vscode.FindTextInFilesOptions, callback: (result: vscode.TextSearchResult) => void, extensionId: string, token: vscode.CancellationToken = CancellationToken.None): Thenable { this._logService.trace(`extHostWorkspace#findTextInFiles: textSearch, extension: ${extensionId}, entryPoint: findTextInFiles`); - if (options.previewOptions && options.previewOptions.totalChars <= options.previewOptions.leadingChars) { - throw new Error('findTextInFiles: previewOptions.totalChars must be > previewOptions.leadingChars'); - } - const requestId = this._requestIdProvider.getNext(); const globPatternToString = (pattern: vscode.GlobPattern | string) => { diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index 6c08c3f5484..ce2cf62872f 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -112,7 +112,6 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { private readonly selectCurrentMatchEmitter: Emitter; private delayedRefresh: Delayer; private changedWhileHidden: boolean; - private isWide: boolean; private searchWithoutFolderMessageElement: HTMLElement; @@ -802,10 +801,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } if (this.size.width >= SearchView.WIDE_VIEW_SIZE) { - this.isWide = true; dom.addClass(this.getContainer(), SearchView.WIDE_CLASS_NAME); } else { - this.isWide = false; dom.removeClass(this.getContainer(), SearchView.WIDE_CLASS_NAME); } @@ -1065,8 +1062,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { // 10000 chars is enough to avoid sending huge amounts of text around, if you do a replace with a longer match, it may or may not resolve the group refs correctly. // https://github.com/Microsoft/vscode/issues/58374 const totalChars = content.isRegExp ? 10000 : - this.isWide ? 250 : - 75; + 250; const options: IQueryOptions = { extraFileResources: getOutOfWorkspaceEditorResources(this.editorService, this.contextService), @@ -1076,7 +1072,6 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { excludePattern, includePattern, previewOptions: { - leadingChars: 20, maxLines: 1, totalChars } diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index 492a1f822fd..d76f8aa6d70 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -4,12 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { RunOnceScheduler } from 'vs/base/common/async'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; import { anyEvent, Emitter, Event, fromPromise, stopwatch } from 'vs/base/common/event'; import { getBaseLabel } from 'vs/base/common/labels'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap, TernarySearchTree, values } from 'vs/base/common/map'; import * as objects from 'vs/base/common/objects'; +import { lcut } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Range } from 'vs/editor/common/core/range'; @@ -24,7 +26,6 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { overviewRulerFindMatchForeground } from 'vs/platform/theme/common/colorRegistry'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; export class Match { @@ -73,6 +74,8 @@ export class Match { inside = this.getMatchString(), after = this._previewText.substring(this._rangeInPreviewText.endColumn - 1); + before = lcut(before, 26); + let charsRemaining = Match.MAX_PREVIEW_CHARS - before.length; inside = inside.substr(0, charsRemaining); charsRemaining -= inside.length;