diff --git a/extensions/search-rg/src/test/searchrg.test.ts b/extensions/search-rg/src/test/searchrg.test.ts index 3407245bb1a..af55abf9b0f 100644 --- a/extensions/search-rg/src/test/searchrg.test.ts +++ b/extensions/search-rg/src/test/searchrg.test.ts @@ -110,4 +110,23 @@ suite('search-rg', () => { 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 86303ed79ee..5b65f3a598a 100644 --- a/extensions/search-rg/src/utils.ts +++ b/extensions/search-rg/src/utils.ts @@ -23,11 +23,12 @@ export function createTextSearchResult(uri: vscode.Uri, fullText: string, range: let preview: vscode.TextSearchResultPreview; if (previewOptions) { const previewStart = Math.max(range.start.character - previewOptions.leadingChars, 0); - const previewEnd = Math.max(previewOptions.totalChars + previewStart, range.end.character); + const previewEnd = previewOptions.totalChars + previewStart; + const endOfMatchRangeInPreview = Math.min(previewEnd, range.end.character - previewStart); preview = { text: fullText.substring(previewStart, previewEnd), - match: new vscode.Range(0, range.start.character - previewStart, 0, range.end.character - previewStart) + match: new vscode.Range(0, range.start.character - previewStart, 0, endOfMatchRangeInPreview) }; } else { preview = { diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 9d2cfe912d6..2f0be1aa260 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -382,6 +382,10 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { findTextInFiles(query: vscode.TextSearchQuery, options: vscode.FindTextInFilesOptions, callback: (result: vscode.TextSearchResult) => void, extensionId: string, token?: vscode.CancellationToken) { 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) => {