diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index d97b5fe17941..452c6de2ddf3 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -49,7 +49,7 @@ import type { SearchConfiguration, SearchEditorInput } from 'vs/workbench/contri import { serializeSearchResultForEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IPatternInfo, ISearchConfigurationProperties, ITextQuery, SearchSortOrder, TextSearchCompleteMessageType } from 'vs/workbench/services/search/common/search'; +import { IPatternInfo, ISearchComplete, ISearchConfigurationProperties, ITextQuery, SearchSortOrder, TextSearchCompleteMessageType } from 'vs/workbench/services/search/common/search'; import { searchDetailsIcon } from 'vs/workbench/contrib/search/browser/searchIcons'; import { IFileService } from 'vs/platform/files/common/files'; import { parseLinkedText } from 'vs/base/common/linkedText'; @@ -461,6 +461,7 @@ export class SearchEditor extends BaseTextEditor { this.searchModel.cancelSearch(true); const startInput = this.getInput(); + if (!startInput) { return; } this.searchHistoryDelayer.trigger(() => { this.queryEditorWidget.searchInput.onSearchSubmit(); @@ -510,20 +511,31 @@ export class SearchEditor extends BaseTextEditor { this.searchOperation.start(500); this.ongoingOperations++; - const exit = await this.searchModel.search(query).finally(() => { + + const { configurationModel } = await startInput.getModels(); + configurationModel.updateConfig(config); + + startInput.ongoingSearchOperation = this.searchModel.search(query).finally(() => { this.ongoingOperations--; if (this.ongoingOperations === 0) { this.searchOperation.stop(); } }); + const searchOperation = await startInput.ongoingSearchOperation; + this.onSearchComplete(searchOperation, config, startInput); + } + + private async onSearchComplete(searchOperation: ISearchComplete, startConfig: SearchConfiguration, startInput: SearchEditorInput) { const input = this.getInput(); if (!input || input !== startInput || - JSON.stringify(config) !== JSON.stringify(this.readConfigFromWidget())) { + JSON.stringify(startConfig) !== JSON.stringify(this.readConfigFromWidget())) { return; } + input.ongoingSearchOperation = undefined; + const sortOrder = this.searchConfig.sortOrder; if (sortOrder === SearchSortOrder.Modified) { await this.retrieveFileStats(this.searchModel.searchResult); @@ -532,18 +544,18 @@ export class SearchEditor extends BaseTextEditor { const controller = ReferencesController.get(this.searchResultEditor); controller.closeWidget(false); const labelFormatter = (uri: URI): string => this.labelService.getUriLabel(uri, { relative: true }); - const results = serializeSearchResultForEditor(this.searchModel.searchResult, config.filesToInclude, config.filesToExclude, config.contextLines, labelFormatter, sortOrder, exit?.limitHit); - const { resultsModel, configurationModel } = await input.getModels(); + const results = serializeSearchResultForEditor(this.searchModel.searchResult, startConfig.filesToInclude, startConfig.filesToExclude, startConfig.contextLines, labelFormatter, sortOrder, searchOperation?.limitHit); + const { resultsModel } = await input.getModels(); this.modelService.updateModel(resultsModel, results.text); let warningMessage = ''; - if (exit && exit.limitHit) { + if (searchOperation && searchOperation.limitHit) { warningMessage += localize('searchMaxResultsWarning', "The result set only contains a subset of all matches. Be more specific in your search to narrow down the results."); } - if (exit && exit.messages) { - for (const message of exit.messages) { + if (searchOperation && searchOperation.messages) { + for (const message of searchOperation.messages) { if (message.type === TextSearchCompleteMessageType.Information) { this.addMessage(message.text); } @@ -560,8 +572,6 @@ export class SearchEditor extends BaseTextEditor { }); } - configurationModel.updateConfig(config); - input.setDirty(!input.isUntitled()); input.setMatchRanges(results.matchRanges); } @@ -650,7 +660,7 @@ export class SearchEditor extends BaseTextEditor { this.searchResultEditor.setModel(resultsModel); this.pauseSearching = true; - this.toggleRunAgainMessage(resultsModel.getLineCount() === 1 && resultsModel.getValue() === '' && configurationModel.config.query !== ''); + this.toggleRunAgainMessage(!newInput.ongoingSearchOperation && resultsModel.getLineCount() === 1 && resultsModel.getValue() === '' && configurationModel.config.query !== ''); this.setSearchConfig(configurationModel.config); @@ -669,6 +679,13 @@ export class SearchEditor extends BaseTextEditor { } this.pauseSearching = false; + + if (newInput.ongoingSearchOperation) { + const existingConfig = this.readConfigFromWidget(); + newInput.ongoingSearchOperation.then(complete => { + this.onSearchComplete(complete, existingConfig, newInput); + }); + } } private toggleIncludesExcludes(_shouldShow?: boolean): void { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts index c109cd4992f2..2ef2e4bdbb89 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts @@ -27,7 +27,7 @@ import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/wo import { IWorkingCopy, IWorkingCopyBackup, WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopy'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ISearchConfigurationProperties } from 'vs/workbench/services/search/common/search'; +import { ISearchComplete, ISearchConfigurationProperties } from 'vs/workbench/services/search/common/search'; import { bufferToReadable, VSBuffer } from 'vs/base/common/buffer'; export type SearchConfiguration = { @@ -65,6 +65,8 @@ export class SearchEditorInput extends EditorInput { return this.backingUri || this.modelUri; } + public ongoingSearchOperation: Promise | undefined; + public model: SearchEditorModel; private _cachedResultsModel: ITextModel | undefined; private _cachedConfigurationModel: SearchConfigurationModel | undefined;