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: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2023-06-28 17:03:58 +02:00
parent 6e16512eba
commit de5efffeff
18 changed files with 85 additions and 104 deletions

View File

@@ -264,8 +264,7 @@ void GitGrep::writeSettings(QSettings *settings) const
settings->setValue(GitGrepRef, m_treeLineEdit->text()); settings->setValue(GitGrepRef, m_treeLineEdit->text());
} }
QFuture<SearchResultItems> GitGrep::executeSearch(const FileFindParameters &parameters, QFuture<SearchResultItems> GitGrep::executeSearch(const FileFindParameters &parameters)
BaseFileFind *)
{ {
return Utils::asyncRun(runGitGrep, parameters); return Utils::asyncRun(runGitGrep, parameters);
} }

View File

@@ -28,8 +28,7 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
void writeSettings(QSettings *settings) const override; void writeSettings(QSettings *settings) const override;
QFuture<Utils::SearchResultItems> executeSearch( QFuture<Utils::SearchResultItems> executeSearch(
const TextEditor::FileFindParameters &parameters, const TextEditor::FileFindParameters &parameters) override;
TextEditor::BaseFileFind *baseFileFind) override;
Core::IEditor *openEditor(const Utils::SearchResultItem &item, Core::IEditor *openEditor(const Utils::SearchResultItem &item,
const TextEditor::FileFindParameters &parameters) override; const TextEditor::FileFindParameters &parameters) override;

View File

@@ -47,17 +47,16 @@ bool AllProjectsFind::isEnabled() const
return BaseFileFind::isEnabled() && ProjectManager::hasProjects(); return BaseFileFind::isEnabled() && ProjectManager::hasProjects();
} }
FileContainer AllProjectsFind::files(const QStringList &nameFilters, FileContainerProvider AllProjectsFind::fileContainerProvider() const
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const
{ {
Q_UNUSED(additionalParameters) return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters()] {
return filesForProjects(nameFilters, exclusionFilters, ProjectManager::projects()); return filesForProjects(nameFilters, exclusionFilters, ProjectManager::projects());
};
} }
FileContainer AllProjectsFind::filesForProjects(const QStringList &nameFilters, FileContainer AllProjectsFind::filesForProjects(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QList<Project *> &projects) const const QList<Project *> &projects)
{ {
std::function<FilePaths(const FilePaths &)> filterFiles std::function<FilePaths(const FilePaths &)> filterFiles
= Utils::filterFilesFunction(nameFilters, exclusionFilters); = Utils::filterFilesFunction(nameFilters, exclusionFilters);

View File

@@ -30,18 +30,16 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
protected: protected:
Utils::FileContainer files(const QStringList &nameFilters, static Utils::FileContainer filesForProjects(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QVariant &additionalParameters) const override; const QList<Project *> &projects);
Utils::FileContainer filesForProjects(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QList<Project *> &projects) const;
QVariant additionalParameters() const override; QVariant additionalParameters() const override;
QString label() const override; QString label() const override;
QString toolTip() const override; QString toolTip() const override;
private: private:
TextEditor::FileContainerProvider fileContainerProvider() const override;
void handleFileListChanged(); void handleFileListChanged();
QPointer<QWidget> m_configWidget; QPointer<QWidget> m_configWidget;

View File

@@ -57,17 +57,22 @@ QVariant CurrentProjectFind::additionalParameters() const
return QVariant(); return QVariant();
} }
FileContainer CurrentProjectFind::files(const QStringList &nameFilters, static FilePath currentProjectFilePath()
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const
{ {
QTC_ASSERT(additionalParameters.isValid(), return {}); Project *project = ProjectTree::currentProject();
const FilePath projectFile = FilePath::fromVariant(additionalParameters); return project ? project->projectFilePath() : FilePath();
}
FileContainerProvider CurrentProjectFind::fileContainerProvider() const
{
return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters(),
projectFile = currentProjectFilePath()] {
for (Project *project : ProjectManager::projects()) { for (Project *project : ProjectManager::projects()) {
if (project && projectFile == project->projectFilePath()) if (project && projectFile == project->projectFilePath())
return filesForProjects(nameFilters, exclusionFilters, {project}); return filesForProjects(nameFilters, exclusionFilters, {project});
} }
return {}; return FileContainer();
};
} }
QString CurrentProjectFind::label() const QString CurrentProjectFind::label() const
@@ -85,8 +90,7 @@ void CurrentProjectFind::handleProjectChanged()
void CurrentProjectFind::setupSearch(Core::SearchResult *search) void CurrentProjectFind::setupSearch(Core::SearchResult *search)
{ {
Project *project = ProjectTree::currentProject(); const FilePath projectFile = currentProjectFilePath();
const FilePath projectFile = project ? project->projectFilePath() : FilePath();
connect(this, &IFindFilter::enabledChanged, search, [search, projectFile] { connect(this, &IFindFilter::enabledChanged, search, [search, projectFile] {
const QList<Project *> projects = ProjectManager::projects(); const QList<Project *> projects = ProjectManager::projects();
for (Project *project : projects) { for (Project *project : projects) {

View File

@@ -27,13 +27,11 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
protected: protected:
Utils::FileContainer files(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const override;
QVariant additionalParameters() const override; QVariant additionalParameters() const override;
QString label() const override; QString label() const override;
private: private:
TextEditor::FileContainerProvider fileContainerProvider() const override;
void handleProjectChanged(); void handleProjectChanged();
void setupSearch(Core::SearchResult *search) override; void setupSearch(Core::SearchResult *search) override;
}; };

View File

@@ -13,6 +13,7 @@
#include <QSettings> #include <QSettings>
using namespace TextEditor;
using namespace Utils; using namespace Utils;
namespace ProjectExplorer { namespace ProjectExplorer {
@@ -47,16 +48,15 @@ void FilesInAllProjectsFind::readSettings(QSettings *settings)
settings->endGroup(); settings->endGroup();
} }
FileContainer FilesInAllProjectsFind::files(const QStringList &nameFilters, FileContainerProvider FilesInAllProjectsFind::fileContainerProvider() const
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const
{ {
Q_UNUSED(additionalParameters) return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters()] {
const QSet<FilePath> dirs = Utils::transform<QSet>(ProjectManager::projects(), [](Project *p) { const QSet<FilePath> dirs = Utils::transform<QSet>(ProjectManager::projects(), [](Project *p) {
return p->projectFilePath().parentDir(); return p->projectFilePath().parentDir();
}); });
return SubDirFileContainer(FilePaths(dirs.constBegin(), dirs.constEnd()), nameFilters, return SubDirFileContainer(FilePaths(dirs.constBegin(), dirs.constEnd()), nameFilters,
exclusionFilters, Core::EditorManager::defaultTextCodec()); exclusionFilters, Core::EditorManager::defaultTextCodec());
};
} }
QString FilesInAllProjectsFind::label() const QString FilesInAllProjectsFind::label() const

View File

@@ -20,9 +20,7 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
protected: protected:
Utils::FileContainer files(const QStringList &nameFilters, TextEditor::FileContainerProvider fileContainerProvider() const override;
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const override;
QString label() const override; QString label() const override;
}; };

View File

@@ -165,7 +165,7 @@ void FindInFilesSilverSearcher::writeSettings(QSettings *settings) const
} }
QFuture<SearchResultItems> FindInFilesSilverSearcher::executeSearch( QFuture<SearchResultItems> FindInFilesSilverSearcher::executeSearch(
const FileFindParameters &parameters, BaseFileFind * /*baseFileFind*/) const FileFindParameters &parameters)
{ {
return Utils::asyncRun(runSilverSeacher, parameters); return Utils::asyncRun(runSilverSeacher, parameters);
} }

View File

@@ -32,7 +32,7 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
void writeSettings(QSettings *settings) const override; void writeSettings(QSettings *settings) const override;
QFuture<Utils::SearchResultItems> executeSearch( QFuture<Utils::SearchResultItems> executeSearch(
const TextEditor::FileFindParameters &parameters, TextEditor::BaseFileFind *) override; const TextEditor::FileFindParameters &parameters) override;
Core::IEditor *openEditor(const Utils::SearchResultItem &item, Core::IEditor *openEditor(const Utils::SearchResultItem &item,
const TextEditor::FileFindParameters &parameters) override; const TextEditor::FileFindParameters &parameters) override;

View File

@@ -145,14 +145,10 @@ public:
QVariant parameters() const override { return {}; } QVariant parameters() const override { return {}; }
void readSettings(QSettings * /*settings*/) override {} void readSettings(QSettings * /*settings*/) override {}
void writeSettings(QSettings * /*settings*/) const override {} void writeSettings(QSettings * /*settings*/) const override {}
QFuture<SearchResultItems> executeSearch(const TextEditor::FileFindParameters &parameters, QFuture<SearchResultItems> executeSearch(const FileFindParameters &parameters) override
BaseFileFind *baseFileFind) override
{ {
const FileContainer container = baseFileFind->files(parameters.nameFilters, return Utils::findInFiles(parameters.text, parameters.fileContainerProvider(),
parameters.exclusionFilters, parameters.flags, TextDocument::openedTextDocumentContents());
parameters.additionalParameters);
return Utils::findInFiles(parameters.text, container, parameters.flags,
TextDocument::openedTextDocumentContents());
} }
Core::IEditor *openEditor(const SearchResultItem &/*item*/, Core::IEditor *openEditor(const SearchResultItem &/*item*/,
@@ -324,6 +320,8 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags,
parameters.additionalParameters = additionalParameters(); parameters.additionalParameters = additionalParameters();
parameters.searchEngineParameters = currentSearchEngine()->parameters(); parameters.searchEngineParameters = currentSearchEngine()->parameters();
parameters.searchEngineIndex = d->m_currentSearchEngineIndex; parameters.searchEngineIndex = d->m_currentSearchEngineIndex;
parameters.fileContainerProvider = fileContainerProvider();
search->setUserData(QVariant::fromValue(parameters)); search->setUserData(QVariant::fromValue(parameters));
connect(search, &SearchResult::activated, this, [this, search](const SearchResultItem &item) { connect(search, &SearchResult::activated, this, [this, search](const SearchResultItem &item) {
openEditor(search, item); openEditor(search, item);
@@ -600,7 +598,7 @@ FilePaths BaseFileFind::replaceAll(const QString &text, const SearchResultItems
QFuture<SearchResultItems> BaseFileFind::executeSearch(const FileFindParameters &parameters) QFuture<SearchResultItems> BaseFileFind::executeSearch(const FileFindParameters &parameters)
{ {
return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters, this); return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters);
} }
namespace Internal { namespace Internal {

View File

@@ -27,6 +27,8 @@ class BaseFileFindPrivate;
class SearchEnginePrivate; class SearchEnginePrivate;
} // Internal } // Internal
using FileContainerProvider = std::function<Utils::FileContainer()>;
class TEXTEDITOR_EXPORT FileFindParameters class TEXTEDITOR_EXPORT FileFindParameters
{ {
public: public:
@@ -37,6 +39,7 @@ public:
QVariant searchEngineParameters; QVariant searchEngineParameters;
int searchEngineIndex; int searchEngineIndex;
Utils::FindFlags flags; Utils::FindFlags flags;
FileContainerProvider fileContainerProvider = {};
}; };
using ProcessSetupHandler = std::function<void(Utils::Process &)>; using ProcessSetupHandler = std::function<void(Utils::Process &)>;
@@ -65,7 +68,7 @@ public:
virtual void readSettings(QSettings *settings) = 0; virtual void readSettings(QSettings *settings) = 0;
virtual void writeSettings(QSettings *settings) const = 0; virtual void writeSettings(QSettings *settings) const = 0;
virtual QFuture<Utils::SearchResultItems> executeSearch( virtual QFuture<Utils::SearchResultItems> executeSearch(
const FileFindParameters &parameters, BaseFileFind *baseFileFind) = 0; const FileFindParameters &parameters) = 0;
virtual Core::IEditor *openEditor(const Utils::SearchResultItem &item, virtual Core::IEditor *openEditor(const Utils::SearchResultItem &item,
const FileFindParameters &parameters) = 0; const FileFindParameters &parameters) = 0;
bool isEnabled() const; bool isEnabled() const;
@@ -95,9 +98,6 @@ public:
/* returns the list of unique files that were passed in items */ /* returns the list of unique files that were passed in items */
static Utils::FilePaths replaceAll(const QString &txt, const Utils::SearchResultItems &items, static Utils::FilePaths replaceAll(const QString &txt, const Utils::SearchResultItems &items,
bool preserveCase = false); bool preserveCase = false);
virtual Utils::FileContainer files(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const = 0;
protected: protected:
virtual QVariant additionalParameters() const = 0; virtual QVariant additionalParameters() const = 0;
@@ -121,6 +121,7 @@ signals:
void currentSearchEngineChanged(); void currentSearchEngineChanged();
private: private:
virtual FileContainerProvider fileContainerProvider() const = 0;
void openEditor(Core::SearchResult *result, const Utils::SearchResultItem &item); void openEditor(Core::SearchResult *result, const Utils::SearchResultItem &item);
void doReplace(const QString &txt, const Utils::SearchResultItems &items, bool preserveCase); void doReplace(const QString &txt, const Utils::SearchResultItems &items, bool preserveCase);
void hideHighlightAll(bool visible); void hideHighlightAll(bool visible);

View File

@@ -36,18 +36,15 @@ QString FindInCurrentFile::displayName() const
return Tr::tr("Current File"); return Tr::tr("Current File");
} }
FileContainer FindInCurrentFile::files(const QStringList &nameFilters, FileContainerProvider FindInCurrentFile::fileContainerProvider() const
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const
{ {
Q_UNUSED(nameFilters) return [fileName = m_currentDocument->filePath()] {
Q_UNUSED(exclusionFilters) const QMap<FilePath, QTextCodec *> encodings = TextDocument::openedTextDocumentEncodings();
const auto fileName = FilePath::fromVariant(additionalParameters); QTextCodec *codec = encodings.value(fileName);
QMap<FilePath, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings();
QTextCodec *codec = openEditorEncodings.value(fileName);
if (!codec) if (!codec)
codec = Core::EditorManager::defaultTextCodec(); codec = Core::EditorManager::defaultTextCodec();
return FileListContainer({fileName}, {codec}); return FileListContainer({fileName}, {codec});
};
} }
QVariant FindInCurrentFile::additionalParameters() const QVariant FindInCurrentFile::additionalParameters() const

View File

@@ -29,14 +29,12 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
protected: protected:
Utils::FileContainer files(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const override;
QVariant additionalParameters() const override; QVariant additionalParameters() const override;
QString label() const override; QString label() const override;
QString toolTip() const override; QString toolTip() const override;
private: private:
FileContainerProvider fileContainerProvider() const override;
void handleFileChange(Core::IEditor *editor); void handleFileChange(Core::IEditor *editor);
QPointer<Core::IDocument> m_currentDocument; QPointer<Core::IDocument> m_currentDocument;

View File

@@ -58,12 +58,13 @@ QString FindInFiles::displayName() const
return Tr::tr("Files in File System"); return Tr::tr("Files in File System");
} }
FileContainer FindInFiles::files(const QStringList &nameFilters, FileContainerProvider FindInFiles::fileContainerProvider() const
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const
{ {
return SubDirFileContainer({FilePath::fromVariant(additionalParameters)}, nameFilters, return [nameFilters = fileNameFilters(), exclusionFilters = fileExclusionFilters(),
exclusionFilters, EditorManager::defaultTextCodec()); filePath = path()] {
return SubDirFileContainer({filePath}, nameFilters, exclusionFilters,
EditorManager::defaultTextCodec());
};
} }
QVariant FindInFiles::additionalParameters() const QVariant FindInFiles::additionalParameters() const

View File

@@ -44,15 +44,13 @@ signals:
void pathChanged(const Utils::FilePath &directory); void pathChanged(const Utils::FilePath &directory);
protected: protected:
Utils::FileContainer files(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const override;
QVariant additionalParameters() const override; QVariant additionalParameters() const override;
QString label() const override; QString label() const override;
QString toolTip() const override; QString toolTip() const override;
void syncSearchEngineCombo(int selectedSearchEngineIndex) override; void syncSearchEngineCombo(int selectedSearchEngineIndex) override;
private: private:
FileContainerProvider fileContainerProvider() const override;
void setValid(bool valid); void setValid(bool valid);
void searchEnginesSelectionChanged(int index); void searchEnginesSelectionChanged(int index);
Utils::FilePath path() const; Utils::FilePath path() const;

View File

@@ -36,15 +36,10 @@ QString FindInOpenFiles::displayName() const
return Tr::tr("Open Documents"); return Tr::tr("Open Documents");
} }
FileContainer FindInOpenFiles::files(const QStringList &nameFilters, FileContainerProvider FindInOpenFiles::fileContainerProvider() const
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const
{ {
Q_UNUSED(nameFilters) return [] {
Q_UNUSED(exclusionFilters) const QMap<FilePath, QTextCodec *> encodings = TextDocument::openedTextDocumentEncodings();
Q_UNUSED(additionalParameters)
QMap<FilePath, QTextCodec *> openEditorEncodings
= TextDocument::openedTextDocumentEncodings();
FilePaths fileNames; FilePaths fileNames;
QList<QTextCodec *> codecs; QList<QTextCodec *> codecs;
const QList<Core::DocumentModel::Entry *> entries = Core::DocumentModel::entries(); const QList<Core::DocumentModel::Entry *> entries = Core::DocumentModel::entries();
@@ -52,14 +47,14 @@ FileContainer FindInOpenFiles::files(const QStringList &nameFilters,
const FilePath fileName = entry->filePath(); const FilePath fileName = entry->filePath();
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
fileNames.append(fileName); fileNames.append(fileName);
QTextCodec *codec = openEditorEncodings.value(fileName); QTextCodec *codec = encodings.value(fileName);
if (!codec) if (!codec)
codec = Core::EditorManager::defaultTextCodec(); codec = Core::EditorManager::defaultTextCodec();
codecs.append(codec); codecs.append(codec);
} }
} }
return FileListContainer(fileNames, codecs); return FileListContainer(fileNames, codecs);
};
} }
QVariant FindInOpenFiles::additionalParameters() const QVariant FindInOpenFiles::additionalParameters() const

View File

@@ -22,14 +22,12 @@ public:
void readSettings(QSettings *settings) override; void readSettings(QSettings *settings) override;
protected: protected:
Utils::FileContainer files(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QVariant &additionalParameters) const override;
QVariant additionalParameters() const override; QVariant additionalParameters() const override;
QString label() const override; QString label() const override;
QString toolTip() const override; QString toolTip() const override;
private: private:
FileContainerProvider fileContainerProvider() const override;
void updateEnabledState(); void updateEnabledState();
}; };