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());
}
QFuture<SearchResultItems> GitGrep::executeSearch(const FileFindParameters &parameters,
BaseFileFind *)
QFuture<SearchResultItems> GitGrep::executeSearch(const FileFindParameters &parameters)
{
return Utils::asyncRun(runGitGrep, parameters);
}

View File

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

View File

@@ -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<Project *> &projects) const
const QList<Project *> &projects)
{
std::function<FilePaths(const FilePaths &)> filterFiles
= Utils::filterFilesFunction(nameFilters, exclusionFilters);

View File

@@ -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<Project *> &projects) const;
static Utils::FileContainer filesForProjects(const QStringList &nameFilters,
const QStringList &exclusionFilters,
const QList<Project *> &projects);
QVariant additionalParameters() const override;
QString label() const override;
QString toolTip() const override;
private:
TextEditor::FileContainerProvider fileContainerProvider() const override;
void handleFileListChanged();
QPointer<QWidget> m_configWidget;

View File

@@ -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<Project *> projects = ProjectManager::projects();
for (Project *project : projects) {

View File

@@ -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;
};

View File

@@ -13,6 +13,7 @@
#include <QSettings>
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<FilePath> dirs = Utils::transform<QSet>(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<FilePath> dirs = Utils::transform<QSet>(ProjectManager::projects(), [](Project *p) {
return p->projectFilePath().parentDir();
});
return SubDirFileContainer(FilePaths(dirs.constBegin(), dirs.constEnd()), nameFilters,
exclusionFilters, Core::EditorManager::defaultTextCodec());
};
}
QString FilesInAllProjectsFind::label() const

View File

@@ -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;
};

View File

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

View File

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

View File

@@ -145,14 +145,10 @@ public:
QVariant parameters() const override { return {}; }
void readSettings(QSettings * /*settings*/) override {}
void writeSettings(QSettings * /*settings*/) const override {}
QFuture<SearchResultItems> executeSearch(const TextEditor::FileFindParameters &parameters,
BaseFileFind *baseFileFind) override
QFuture<SearchResultItems> executeSearch(const FileFindParameters &parameters) 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<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 {

View File

@@ -27,6 +27,8 @@ class BaseFileFindPrivate;
class SearchEnginePrivate;
} // Internal
using FileContainerProvider = std::function<Utils::FileContainer()>;
class TEXTEDITOR_EXPORT FileFindParameters
{
public:
@@ -37,6 +39,7 @@ public:
QVariant searchEngineParameters;
int searchEngineIndex;
Utils::FindFlags flags;
FileContainerProvider fileContainerProvider = {};
};
using ProcessSetupHandler = std::function<void(Utils::Process &)>;
@@ -65,7 +68,7 @@ public:
virtual void readSettings(QSettings *settings) = 0;
virtual void writeSettings(QSettings *settings) const = 0;
virtual QFuture<Utils::SearchResultItems> executeSearch(
const FileFindParameters &parameters, BaseFileFind *baseFileFind) = 0;
const FileFindParameters &parameters) = 0;
virtual Core::IEditor *openEditor(const Utils::SearchResultItem &item,
const FileFindParameters &parameters) = 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);

View File

@@ -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<FilePath, QTextCodec *> 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<FilePath, QTextCodec *> encodings = TextDocument::openedTextDocumentEncodings();
QTextCodec *codec = encodings.value(fileName);
if (!codec)
codec = Core::EditorManager::defaultTextCodec();
return FileListContainer({fileName}, {codec});
};
}
QVariant FindInCurrentFile::additionalParameters() const

View File

@@ -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<Core::IDocument> m_currentDocument;

View File

@@ -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

View File

@@ -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;

View File

@@ -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<FilePath, QTextCodec *> openEditorEncodings
= TextDocument::openedTextDocumentEncodings();
FilePaths fileNames;
QList<QTextCodec *> codecs;
const QList<Core::DocumentModel::Entry *> 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<FilePath, QTextCodec *> encodings = TextDocument::openedTextDocumentEncodings();
FilePaths fileNames;
QList<QTextCodec *> codecs;
const QList<Core::DocumentModel::Entry *> 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

View File

@@ -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();
};