From de5efffeff8a2adebc77fd2b6888047abf8530a5 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 28 Jun 2023 17:03:58 +0200 Subject: [PATCH] BaseFileFind: Replace files() with fileContainerProvider() The fileContainerProvider() is called only once per SearchResult instance, and the result (the provider) is stored inside FileFindParameters. In this way the extra data, like the name filters or the search directory, are set just once. Whenever the search is started (or started again), the stored provider recreates the FileContainer according to the data that has been captured by the lambda when the provider was created. This patch eliminates the need for retrieving the custom data from QVariant. It also eliminates the set of arbitrary arguments for the removed files() method. Remove the BaseFileFind * argument from the SearchEngine::executeSearch() method. Change-Id: I7211f503f82db12b5a99c9d342466daaaae0839f Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: Eike Ziller --- src/plugins/git/gitgrep.cpp | 3 +- src/plugins/git/gitgrep.h | 3 +- .../projectexplorer/allprojectsfind.cpp | 11 +++--- src/plugins/projectexplorer/allprojectsfind.h | 10 ++--- .../projectexplorer/currentprojectfind.cpp | 28 +++++++------ .../projectexplorer/currentprojectfind.h | 4 +- .../filesinallprojectsfind.cpp | 18 ++++----- .../projectexplorer/filesinallprojectsfind.h | 4 +- .../findinfilessilversearcher.cpp | 2 +- .../findinfilessilversearcher.h | 2 +- src/plugins/texteditor/basefilefind.cpp | 14 +++---- src/plugins/texteditor/basefilefind.h | 9 +++-- src/plugins/texteditor/findincurrentfile.cpp | 19 ++++----- src/plugins/texteditor/findincurrentfile.h | 4 +- src/plugins/texteditor/findinfiles.cpp | 11 +++--- src/plugins/texteditor/findinfiles.h | 4 +- src/plugins/texteditor/findinopenfiles.cpp | 39 ++++++++----------- src/plugins/texteditor/findinopenfiles.h | 4 +- 18 files changed, 85 insertions(+), 104 deletions(-) diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp index f6324f152de..8f404c8f380 100644 --- a/src/plugins/git/gitgrep.cpp +++ b/src/plugins/git/gitgrep.cpp @@ -264,8 +264,7 @@ void GitGrep::writeSettings(QSettings *settings) const settings->setValue(GitGrepRef, m_treeLineEdit->text()); } -QFuture GitGrep::executeSearch(const FileFindParameters ¶meters, - BaseFileFind *) +QFuture GitGrep::executeSearch(const FileFindParameters ¶meters) { return Utils::asyncRun(runGitGrep, parameters); } diff --git a/src/plugins/git/gitgrep.h b/src/plugins/git/gitgrep.h index fda6fe56ebd..f2a4b812c5f 100644 --- a/src/plugins/git/gitgrep.h +++ b/src/plugins/git/gitgrep.h @@ -28,8 +28,7 @@ public: void readSettings(QSettings *settings) override; void writeSettings(QSettings *settings) const override; QFuture executeSearch( - const TextEditor::FileFindParameters ¶meters, - TextEditor::BaseFileFind *baseFileFind) override; + const TextEditor::FileFindParameters ¶meters) override; Core::IEditor *openEditor(const Utils::SearchResultItem &item, const TextEditor::FileFindParameters ¶meters) override; diff --git a/src/plugins/projectexplorer/allprojectsfind.cpp b/src/plugins/projectexplorer/allprojectsfind.cpp index 53bc13cfef3..c9fdcb11225 100644 --- a/src/plugins/projectexplorer/allprojectsfind.cpp +++ b/src/plugins/projectexplorer/allprojectsfind.cpp @@ -47,17 +47,16 @@ bool AllProjectsFind::isEnabled() const return BaseFileFind::isEnabled() && ProjectManager::hasProjects(); } -FileContainer AllProjectsFind::files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const +FileContainerProvider AllProjectsFind::fileContainerProvider() const { - Q_UNUSED(additionalParameters) - return filesForProjects(nameFilters, exclusionFilters, ProjectManager::projects()); + return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters()] { + return filesForProjects(nameFilters, exclusionFilters, ProjectManager::projects()); + }; } FileContainer AllProjectsFind::filesForProjects(const QStringList &nameFilters, const QStringList &exclusionFilters, - const QList &projects) const + const QList &projects) { std::function filterFiles = Utils::filterFilesFunction(nameFilters, exclusionFilters); diff --git a/src/plugins/projectexplorer/allprojectsfind.h b/src/plugins/projectexplorer/allprojectsfind.h index 4752d8d28a3..c4d70e1a1c5 100644 --- a/src/plugins/projectexplorer/allprojectsfind.h +++ b/src/plugins/projectexplorer/allprojectsfind.h @@ -30,18 +30,16 @@ public: void readSettings(QSettings *settings) override; protected: - Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const override; - Utils::FileContainer filesForProjects(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QList &projects) const; + static Utils::FileContainer filesForProjects(const QStringList &nameFilters, + const QStringList &exclusionFilters, + const QList &projects); QVariant additionalParameters() const override; QString label() const override; QString toolTip() const override; private: + TextEditor::FileContainerProvider fileContainerProvider() const override; void handleFileListChanged(); QPointer m_configWidget; diff --git a/src/plugins/projectexplorer/currentprojectfind.cpp b/src/plugins/projectexplorer/currentprojectfind.cpp index 942a1dc6e70..7bd8bd332c9 100644 --- a/src/plugins/projectexplorer/currentprojectfind.cpp +++ b/src/plugins/projectexplorer/currentprojectfind.cpp @@ -57,17 +57,22 @@ QVariant CurrentProjectFind::additionalParameters() const return QVariant(); } -FileContainer CurrentProjectFind::files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const +static FilePath currentProjectFilePath() { - QTC_ASSERT(additionalParameters.isValid(), return {}); - const FilePath projectFile = FilePath::fromVariant(additionalParameters); - for (Project *project : ProjectManager::projects()) { - if (project && projectFile == project->projectFilePath()) - return filesForProjects(nameFilters, exclusionFilters, {project}); - } - return {}; + Project *project = ProjectTree::currentProject(); + return project ? project->projectFilePath() : FilePath(); +} + +FileContainerProvider CurrentProjectFind::fileContainerProvider() const +{ + return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters(), + projectFile = currentProjectFilePath()] { + for (Project *project : ProjectManager::projects()) { + if (project && projectFile == project->projectFilePath()) + return filesForProjects(nameFilters, exclusionFilters, {project}); + } + return FileContainer(); + }; } QString CurrentProjectFind::label() const @@ -85,8 +90,7 @@ void CurrentProjectFind::handleProjectChanged() void CurrentProjectFind::setupSearch(Core::SearchResult *search) { - Project *project = ProjectTree::currentProject(); - const FilePath projectFile = project ? project->projectFilePath() : FilePath(); + const FilePath projectFile = currentProjectFilePath(); connect(this, &IFindFilter::enabledChanged, search, [search, projectFile] { const QList projects = ProjectManager::projects(); for (Project *project : projects) { diff --git a/src/plugins/projectexplorer/currentprojectfind.h b/src/plugins/projectexplorer/currentprojectfind.h index a2589bf2b9d..4ac5e4eeb30 100644 --- a/src/plugins/projectexplorer/currentprojectfind.h +++ b/src/plugins/projectexplorer/currentprojectfind.h @@ -27,13 +27,11 @@ public: void readSettings(QSettings *settings) override; protected: - Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const override; QVariant additionalParameters() const override; QString label() const override; private: + TextEditor::FileContainerProvider fileContainerProvider() const override; void handleProjectChanged(); void setupSearch(Core::SearchResult *search) override; }; diff --git a/src/plugins/projectexplorer/filesinallprojectsfind.cpp b/src/plugins/projectexplorer/filesinallprojectsfind.cpp index 554b072f7b7..5b8e6eaa684 100644 --- a/src/plugins/projectexplorer/filesinallprojectsfind.cpp +++ b/src/plugins/projectexplorer/filesinallprojectsfind.cpp @@ -13,6 +13,7 @@ #include +using namespace TextEditor; using namespace Utils; namespace ProjectExplorer { @@ -47,16 +48,15 @@ void FilesInAllProjectsFind::readSettings(QSettings *settings) settings->endGroup(); } -FileContainer FilesInAllProjectsFind::files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const +FileContainerProvider FilesInAllProjectsFind::fileContainerProvider() const { - Q_UNUSED(additionalParameters) - const QSet dirs = Utils::transform(ProjectManager::projects(), [](Project *p) { - return p->projectFilePath().parentDir(); - }); - return SubDirFileContainer(FilePaths(dirs.constBegin(), dirs.constEnd()), nameFilters, - exclusionFilters, Core::EditorManager::defaultTextCodec()); + return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters()] { + const QSet dirs = Utils::transform(ProjectManager::projects(), [](Project *p) { + return p->projectFilePath().parentDir(); + }); + return SubDirFileContainer(FilePaths(dirs.constBegin(), dirs.constEnd()), nameFilters, + exclusionFilters, Core::EditorManager::defaultTextCodec()); + }; } QString FilesInAllProjectsFind::label() const diff --git a/src/plugins/projectexplorer/filesinallprojectsfind.h b/src/plugins/projectexplorer/filesinallprojectsfind.h index ad09ff031db..1e27b06a309 100644 --- a/src/plugins/projectexplorer/filesinallprojectsfind.h +++ b/src/plugins/projectexplorer/filesinallprojectsfind.h @@ -20,9 +20,7 @@ public: void readSettings(QSettings *settings) override; protected: - Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const override; + TextEditor::FileContainerProvider fileContainerProvider() const override; QString label() const override; }; diff --git a/src/plugins/silversearcher/findinfilessilversearcher.cpp b/src/plugins/silversearcher/findinfilessilversearcher.cpp index 6cf428bb64f..f607ae51498 100644 --- a/src/plugins/silversearcher/findinfilessilversearcher.cpp +++ b/src/plugins/silversearcher/findinfilessilversearcher.cpp @@ -165,7 +165,7 @@ void FindInFilesSilverSearcher::writeSettings(QSettings *settings) const } QFuture FindInFilesSilverSearcher::executeSearch( - const FileFindParameters ¶meters, BaseFileFind * /*baseFileFind*/) + const FileFindParameters ¶meters) { return Utils::asyncRun(runSilverSeacher, parameters); } diff --git a/src/plugins/silversearcher/findinfilessilversearcher.h b/src/plugins/silversearcher/findinfilessilversearcher.h index bc5e224c21f..b70684f6ec8 100644 --- a/src/plugins/silversearcher/findinfilessilversearcher.h +++ b/src/plugins/silversearcher/findinfilessilversearcher.h @@ -32,7 +32,7 @@ public: void readSettings(QSettings *settings) override; void writeSettings(QSettings *settings) const override; QFuture executeSearch( - const TextEditor::FileFindParameters ¶meters, TextEditor::BaseFileFind *) override; + const TextEditor::FileFindParameters ¶meters) override; Core::IEditor *openEditor(const Utils::SearchResultItem &item, const TextEditor::FileFindParameters ¶meters) override; diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index efec7708720..23ef9c75d74 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -145,14 +145,10 @@ public: QVariant parameters() const override { return {}; } void readSettings(QSettings * /*settings*/) override {} void writeSettings(QSettings * /*settings*/) const override {} - QFuture executeSearch(const TextEditor::FileFindParameters ¶meters, - BaseFileFind *baseFileFind) override + QFuture executeSearch(const FileFindParameters ¶meters) override { - const FileContainer container = baseFileFind->files(parameters.nameFilters, - parameters.exclusionFilters, - parameters.additionalParameters); - return Utils::findInFiles(parameters.text, container, parameters.flags, - TextDocument::openedTextDocumentContents()); + return Utils::findInFiles(parameters.text, parameters.fileContainerProvider(), + parameters.flags, TextDocument::openedTextDocumentContents()); } Core::IEditor *openEditor(const SearchResultItem &/*item*/, @@ -324,6 +320,8 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, parameters.additionalParameters = additionalParameters(); parameters.searchEngineParameters = currentSearchEngine()->parameters(); parameters.searchEngineIndex = d->m_currentSearchEngineIndex; + parameters.fileContainerProvider = fileContainerProvider(); + search->setUserData(QVariant::fromValue(parameters)); connect(search, &SearchResult::activated, this, [this, search](const SearchResultItem &item) { openEditor(search, item); @@ -600,7 +598,7 @@ FilePaths BaseFileFind::replaceAll(const QString &text, const SearchResultItems QFuture BaseFileFind::executeSearch(const FileFindParameters ¶meters) { - return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters, this); + return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters); } namespace Internal { diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index c92b857b577..95226730d6e 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -27,6 +27,8 @@ class BaseFileFindPrivate; class SearchEnginePrivate; } // Internal +using FileContainerProvider = std::function; + class TEXTEDITOR_EXPORT FileFindParameters { public: @@ -37,6 +39,7 @@ public: QVariant searchEngineParameters; int searchEngineIndex; Utils::FindFlags flags; + FileContainerProvider fileContainerProvider = {}; }; using ProcessSetupHandler = std::function; @@ -65,7 +68,7 @@ public: virtual void readSettings(QSettings *settings) = 0; virtual void writeSettings(QSettings *settings) const = 0; virtual QFuture executeSearch( - const FileFindParameters ¶meters, BaseFileFind *baseFileFind) = 0; + const FileFindParameters ¶meters) = 0; virtual Core::IEditor *openEditor(const Utils::SearchResultItem &item, const FileFindParameters ¶meters) = 0; bool isEnabled() const; @@ -95,9 +98,6 @@ public: /* returns the list of unique files that were passed in items */ static Utils::FilePaths replaceAll(const QString &txt, const Utils::SearchResultItems &items, bool preserveCase = false); - virtual Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const = 0; protected: virtual QVariant additionalParameters() const = 0; @@ -121,6 +121,7 @@ signals: void currentSearchEngineChanged(); private: + virtual FileContainerProvider fileContainerProvider() const = 0; void openEditor(Core::SearchResult *result, const Utils::SearchResultItem &item); void doReplace(const QString &txt, const Utils::SearchResultItems &items, bool preserveCase); void hideHighlightAll(bool visible); diff --git a/src/plugins/texteditor/findincurrentfile.cpp b/src/plugins/texteditor/findincurrentfile.cpp index ce471c1c12d..197d02f53e6 100644 --- a/src/plugins/texteditor/findincurrentfile.cpp +++ b/src/plugins/texteditor/findincurrentfile.cpp @@ -36,18 +36,15 @@ QString FindInCurrentFile::displayName() const return Tr::tr("Current File"); } -FileContainer FindInCurrentFile::files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const +FileContainerProvider FindInCurrentFile::fileContainerProvider() const { - Q_UNUSED(nameFilters) - Q_UNUSED(exclusionFilters) - const auto fileName = FilePath::fromVariant(additionalParameters); - QMap openEditorEncodings = TextDocument::openedTextDocumentEncodings(); - QTextCodec *codec = openEditorEncodings.value(fileName); - if (!codec) - codec = Core::EditorManager::defaultTextCodec(); - return FileListContainer({fileName}, {codec}); + return [fileName = m_currentDocument->filePath()] { + const QMap encodings = TextDocument::openedTextDocumentEncodings(); + QTextCodec *codec = encodings.value(fileName); + if (!codec) + codec = Core::EditorManager::defaultTextCodec(); + return FileListContainer({fileName}, {codec}); + }; } QVariant FindInCurrentFile::additionalParameters() const diff --git a/src/plugins/texteditor/findincurrentfile.h b/src/plugins/texteditor/findincurrentfile.h index c5f07eb8b9b..5eb75de05b0 100644 --- a/src/plugins/texteditor/findincurrentfile.h +++ b/src/plugins/texteditor/findincurrentfile.h @@ -29,14 +29,12 @@ public: void readSettings(QSettings *settings) override; protected: - Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const override; QVariant additionalParameters() const override; QString label() const override; QString toolTip() const override; private: + FileContainerProvider fileContainerProvider() const override; void handleFileChange(Core::IEditor *editor); QPointer m_currentDocument; diff --git a/src/plugins/texteditor/findinfiles.cpp b/src/plugins/texteditor/findinfiles.cpp index 908e53d875b..3f073f82296 100644 --- a/src/plugins/texteditor/findinfiles.cpp +++ b/src/plugins/texteditor/findinfiles.cpp @@ -58,12 +58,13 @@ QString FindInFiles::displayName() const return Tr::tr("Files in File System"); } -FileContainer FindInFiles::files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const +FileContainerProvider FindInFiles::fileContainerProvider() const { - return SubDirFileContainer({FilePath::fromVariant(additionalParameters)}, nameFilters, - exclusionFilters, EditorManager::defaultTextCodec()); + return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters(), + filePath = path()] { + return SubDirFileContainer({filePath}, nameFilters, exclusionFilters, + EditorManager::defaultTextCodec()); + }; } QVariant FindInFiles::additionalParameters() const diff --git a/src/plugins/texteditor/findinfiles.h b/src/plugins/texteditor/findinfiles.h index c7e923b9506..3713ab0b1d7 100644 --- a/src/plugins/texteditor/findinfiles.h +++ b/src/plugins/texteditor/findinfiles.h @@ -44,15 +44,13 @@ signals: void pathChanged(const Utils::FilePath &directory); protected: - Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const override; QVariant additionalParameters() const override; QString label() const override; QString toolTip() const override; void syncSearchEngineCombo(int selectedSearchEngineIndex) override; private: + FileContainerProvider fileContainerProvider() const override; void setValid(bool valid); void searchEnginesSelectionChanged(int index); Utils::FilePath path() const; diff --git a/src/plugins/texteditor/findinopenfiles.cpp b/src/plugins/texteditor/findinopenfiles.cpp index 6bfdd1b04ec..6b3e7dbe9cb 100644 --- a/src/plugins/texteditor/findinopenfiles.cpp +++ b/src/plugins/texteditor/findinopenfiles.cpp @@ -36,30 +36,25 @@ QString FindInOpenFiles::displayName() const return Tr::tr("Open Documents"); } -FileContainer FindInOpenFiles::files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const +FileContainerProvider FindInOpenFiles::fileContainerProvider() const { - Q_UNUSED(nameFilters) - Q_UNUSED(exclusionFilters) - Q_UNUSED(additionalParameters) - QMap openEditorEncodings - = TextDocument::openedTextDocumentEncodings(); - FilePaths fileNames; - QList codecs; - const QList entries = Core::DocumentModel::entries(); - for (Core::DocumentModel::Entry *entry : entries) { - const FilePath fileName = entry->filePath(); - if (!fileName.isEmpty()) { - fileNames.append(fileName); - QTextCodec *codec = openEditorEncodings.value(fileName); - if (!codec) - codec = Core::EditorManager::defaultTextCodec(); - codecs.append(codec); + return [] { + const QMap encodings = TextDocument::openedTextDocumentEncodings(); + FilePaths fileNames; + QList codecs; + const QList entries = Core::DocumentModel::entries(); + for (Core::DocumentModel::Entry *entry : entries) { + const FilePath fileName = entry->filePath(); + if (!fileName.isEmpty()) { + fileNames.append(fileName); + QTextCodec *codec = encodings.value(fileName); + if (!codec) + codec = Core::EditorManager::defaultTextCodec(); + codecs.append(codec); + } } - } - - return FileListContainer(fileNames, codecs); + return FileListContainer(fileNames, codecs); + }; } QVariant FindInOpenFiles::additionalParameters() const diff --git a/src/plugins/texteditor/findinopenfiles.h b/src/plugins/texteditor/findinopenfiles.h index 3431331b5b2..a96cd4f0611 100644 --- a/src/plugins/texteditor/findinopenfiles.h +++ b/src/plugins/texteditor/findinopenfiles.h @@ -22,14 +22,12 @@ public: void readSettings(QSettings *settings) override; protected: - Utils::FileContainer files(const QStringList &nameFilters, - const QStringList &exclusionFilters, - const QVariant &additionalParameters) const override; QVariant additionalParameters() const override; QString label() const override; QString toolTip() const override; private: + FileContainerProvider fileContainerProvider() const override; void updateEnabledState(); };