Core: Use more of Utils::FilePath in locator filters

Change-Id: Ie550691861317f2af6f38170b5dfc6413af5954f
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2019-07-23 18:30:00 +02:00
parent 4216702d95
commit 2c0b69cdc5
8 changed files with 50 additions and 88 deletions

View File

@@ -34,7 +34,6 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QTimer> #include <QTimer>
using namespace Core;
using namespace Utils; using namespace Utils;
namespace Core { namespace Core {
@@ -47,13 +46,11 @@ public:
{ {
iterator.clear(); iterator.clear();
previousResultPaths.clear(); previousResultPaths.clear();
previousResultNames.clear();
previousEntry.clear(); previousEntry.clear();
} }
QSharedPointer<BaseFileFilter::Iterator> iterator; QSharedPointer<BaseFileFilter::Iterator> iterator;
QStringList previousResultPaths; FilePathList previousResultPaths;
QStringList previousResultNames;
bool forceNewSearchList; bool forceNewSearchList;
QString previousEntry; QString previousEntry;
}; };
@@ -66,7 +63,6 @@ public:
}; };
} // Internal } // Internal
} // Core
BaseFileFilter::Iterator::~Iterator() = default; BaseFileFilter::Iterator::~Iterator() = default;
@@ -74,7 +70,7 @@ BaseFileFilter::BaseFileFilter()
: d(new Internal::BaseFileFilterPrivate) : d(new Internal::BaseFileFilterPrivate)
{ {
d->m_data.forceNewSearchList = true; d->m_data.forceNewSearchList = true;
setFileIterator(new ListIterator(QStringList())); setFileIterator(new ListIterator({}));
} }
BaseFileFilter::~BaseFileFilter() BaseFileFilter::~BaseFileFilter()
@@ -87,7 +83,6 @@ void BaseFileFilter::prepareSearch(const QString &entry)
Q_UNUSED(entry) Q_UNUSED(entry)
d->m_current.iterator = d->m_data.iterator; d->m_current.iterator = d->m_data.iterator;
d->m_current.previousResultPaths = d->m_data.previousResultPaths; d->m_current.previousResultPaths = d->m_data.previousResultPaths;
d->m_current.previousResultNames = d->m_data.previousResultNames;
d->m_current.forceNewSearchList = d->m_data.forceNewSearchList; d->m_current.forceNewSearchList = d->m_data.forceNewSearchList;
d->m_current.previousEntry = d->m_data.previousEntry; d->m_current.previousEntry = d->m_data.previousEntry;
d->m_data.forceNewSearchList = false; d->m_data.forceNewSearchList = false;
@@ -132,12 +127,10 @@ QList<LocatorFilterEntry> BaseFileFilter::matchesFor(QFutureInterface<LocatorFil
const bool searchInPreviousResults = !d->m_current.forceNewSearchList && containsPreviousEntry const bool searchInPreviousResults = !d->m_current.forceNewSearchList && containsPreviousEntry
&& !pathSeparatorAdded; && !pathSeparatorAdded;
if (searchInPreviousResults) if (searchInPreviousResults)
d->m_current.iterator.reset(new ListIterator(d->m_current.previousResultPaths, d->m_current.iterator.reset(new ListIterator(d->m_current.previousResultPaths));
d->m_current.previousResultNames));
QTC_ASSERT(d->m_current.iterator.data(), return QList<LocatorFilterEntry>()); QTC_ASSERT(d->m_current.iterator.data(), return QList<LocatorFilterEntry>());
d->m_current.previousResultPaths.clear(); d->m_current.previousResultPaths.clear();
d->m_current.previousResultNames.clear();
d->m_current.previousEntry = fp.filePath; d->m_current.previousEntry = fp.filePath;
d->m_current.iterator->toFront(); d->m_current.iterator->toFront();
bool canceled = false; bool canceled = false;
@@ -148,15 +141,14 @@ QList<LocatorFilterEntry> BaseFileFilter::matchesFor(QFutureInterface<LocatorFil
} }
d->m_current.iterator->next(); d->m_current.iterator->next();
QString path = d->m_current.iterator->filePath(); FilePath path = d->m_current.iterator->filePath();
QString name = d->m_current.iterator->fileName(); QString matchText = hasPathSeparator ? path.toString() : path.fileName();
QString matchText = hasPathSeparator ? path : name;
QRegularExpressionMatch match = regexp.match(matchText); QRegularExpressionMatch match = regexp.match(matchText);
if (match.hasMatch()) { if (match.hasMatch()) {
QFileInfo fi(path); QFileInfo fi(path.toString());
LocatorFilterEntry filterEntry(this, fi.fileName(), QString(path + fp.postfix)); LocatorFilterEntry filterEntry(this, fi.fileName(), QString(path.toString() + fp.postfix));
filterEntry.fileName = path; filterEntry.fileName = path.toString();
filterEntry.extraInfo = FilePath::fromFileInfo(fi).shortNativePath(); filterEntry.extraInfo = FilePath::fromFileInfo(fi).shortNativePath();
const int matchLevel = matchLevelFor(match, matchText); const int matchLevel = matchLevelFor(match, matchText);
@@ -170,7 +162,6 @@ QList<LocatorFilterEntry> BaseFileFilter::matchesFor(QFutureInterface<LocatorFil
entries[matchLevel].append(filterEntry); entries[matchLevel].append(filterEntry);
d->m_current.previousResultPaths.append(path); d->m_current.previousResultPaths.append(path);
d->m_current.previousResultNames.append(name);
} }
} }
@@ -225,32 +216,18 @@ void BaseFileFilter::updatePreviousResultData()
return; // do not update with the new result list etc return; // do not update with the new result list etc
d->m_data.previousEntry = d->m_current.previousEntry; d->m_data.previousEntry = d->m_current.previousEntry;
d->m_data.previousResultPaths = d->m_current.previousResultPaths; d->m_data.previousResultPaths = d->m_current.previousResultPaths;
d->m_data.previousResultNames = d->m_current.previousResultNames;
// forceNewSearchList was already reset in prepareSearch // forceNewSearchList was already reset in prepareSearch
} }
BaseFileFilter::ListIterator::ListIterator(const QStringList &filePaths) BaseFileFilter::ListIterator::ListIterator(const FilePathList &filePaths)
{ {
m_filePaths = filePaths; m_filePaths = filePaths;
for (const QString &path : filePaths) {
QFileInfo fi(path);
m_fileNames.append(fi.fileName());
}
toFront();
}
BaseFileFilter::ListIterator::ListIterator(const QStringList &filePaths,
const QStringList &fileNames)
{
m_filePaths = filePaths;
m_fileNames = fileNames;
toFront(); toFront();
} }
void BaseFileFilter::ListIterator::toFront() void BaseFileFilter::ListIterator::toFront()
{ {
m_pathPosition = m_filePaths.constBegin() - 1; m_pathPosition = m_filePaths.constBegin() - 1;
m_namePosition = m_fileNames.constBegin() - 1;
} }
bool BaseFileFilter::ListIterator::hasNext() const bool BaseFileFilter::ListIterator::hasNext() const
@@ -259,25 +236,18 @@ bool BaseFileFilter::ListIterator::hasNext() const
return m_pathPosition + 1 != m_filePaths.constEnd(); return m_pathPosition + 1 != m_filePaths.constEnd();
} }
QString BaseFileFilter::ListIterator::next() FilePath BaseFileFilter::ListIterator::next()
{ {
QTC_ASSERT(m_pathPosition != m_filePaths.constEnd(), return QString()); QTC_ASSERT(m_pathPosition != m_filePaths.constEnd(), return {});
QTC_ASSERT(m_namePosition != m_fileNames.constEnd(), return QString());
++m_pathPosition; ++m_pathPosition;
++m_namePosition; QTC_ASSERT(m_pathPosition != m_filePaths.constEnd(), return {});
QTC_ASSERT(m_pathPosition != m_filePaths.constEnd(), return QString());
QTC_ASSERT(m_namePosition != m_fileNames.constEnd(), return QString());
return *m_pathPosition; return *m_pathPosition;
} }
QString BaseFileFilter::ListIterator::filePath() const FilePath BaseFileFilter::ListIterator::filePath() const
{ {
QTC_ASSERT(m_pathPosition != m_filePaths.constEnd(), return QString()); QTC_ASSERT(m_pathPosition != m_filePaths.constEnd(), return {});
return *m_pathPosition; return *m_pathPosition;
} }
QString BaseFileFilter::ListIterator::fileName() const } // Core
{
QTC_ASSERT(m_namePosition != m_fileNames.constEnd(), return QString());
return *m_namePosition;
}

View File

@@ -27,8 +27,9 @@
#include "ilocatorfilter.h" #include "ilocatorfilter.h"
#include <utils/fileutils.h>
#include <QSharedPointer> #include <QSharedPointer>
#include <QStringList>
namespace Core { namespace Core {
@@ -44,27 +45,22 @@ public:
virtual ~Iterator(); virtual ~Iterator();
virtual void toFront() = 0; virtual void toFront() = 0;
virtual bool hasNext() const = 0; virtual bool hasNext() const = 0;
virtual QString next() = 0; virtual Utils::FilePath next() = 0;
virtual QString filePath() const = 0; virtual Utils::FilePath filePath() const = 0;
virtual QString fileName() const = 0;
}; };
class CORE_EXPORT ListIterator : public Iterator { class CORE_EXPORT ListIterator : public Iterator {
public: public:
ListIterator(const QStringList &filePaths); ListIterator(const Utils::FilePathList &filePaths);
ListIterator(const QStringList &filePaths, const QStringList &fileNames);
void toFront() override; void toFront() override;
bool hasNext() const override; bool hasNext() const override;
QString next() override; Utils::FilePath next() override;
QString filePath() const override; Utils::FilePath filePath() const override;
QString fileName() const override;
private: private:
QStringList m_filePaths; Utils::FilePathList m_filePaths;
QStringList m_fileNames; Utils::FilePathList::const_iterator m_pathPosition;
QStringList::const_iterator m_pathPosition;
QStringList::const_iterator m_namePosition;
}; };
BaseFileFilter(); BaseFileFilter();

View File

@@ -56,7 +56,7 @@ QByteArray DirectoryFilter::saveState() const
out << m_filters; out << m_filters;
out << shortcutString(); out << shortcutString();
out << isIncludedByDefault(); out << isIncludedByDefault();
out << m_files; out << Utils::transform(m_files, &Utils::FilePath::toString);
out << m_exclusionFilters; out << m_exclusionFilters;
return value; return value;
} }
@@ -69,6 +69,7 @@ void DirectoryFilter::restoreState(const QByteArray &state)
QStringList directories; QStringList directories;
QString shortcut; QString shortcut;
bool defaultFilter; bool defaultFilter;
QStringList files;
QDataStream in(state); QDataStream in(state);
in >> name; in >> name;
@@ -76,7 +77,8 @@ void DirectoryFilter::restoreState(const QByteArray &state)
in >> m_filters; in >> m_filters;
in >> shortcut; in >> shortcut;
in >> defaultFilter; in >> defaultFilter;
in >> m_files; in >> files;
m_files = Utils::transform(files, &Utils::FilePath::fromString);
if (!in.atEnd()) // Qt Creator 4.3 and later if (!in.atEnd()) // Qt Creator 4.3 and later
in >> m_exclusionFilters; in >> m_exclusionFilters;
else else
@@ -231,12 +233,12 @@ void DirectoryFilter::refresh(QFutureInterface<void> &future)
} }
Utils::SubDirFileIterator subDirIterator(directories, m_filters, m_exclusionFilters); Utils::SubDirFileIterator subDirIterator(directories, m_filters, m_exclusionFilters);
future.setProgressRange(0, subDirIterator.maxProgress()); future.setProgressRange(0, subDirIterator.maxProgress());
QStringList filesFound; Utils::FilePathList filesFound;
auto end = subDirIterator.end(); auto end = subDirIterator.end();
for (auto it = subDirIterator.begin(); it != end; ++it) { for (auto it = subDirIterator.begin(); it != end; ++it) {
if (future.isCanceled()) if (future.isCanceled())
break; break;
filesFound << (*it).filePath; filesFound << Utils::FilePath::fromString((*it).filePath);
if (future.isProgressUpdateNeeded() if (future.isProgressUpdateNeeded()
|| future.progressValue() == 0 /*workaround for regression in Qt*/) { || future.progressValue() == 0 /*workaround for regression in Qt*/) {
future.setProgressValueAndText(subDirIterator.currentProgress(), future.setProgressValueAndText(subDirIterator.currentProgress(),

View File

@@ -77,7 +77,7 @@ private:
QDialog *m_dialog = nullptr; QDialog *m_dialog = nullptr;
Internal::Ui::DirectoryFilterOptions *m_ui = nullptr; Internal::Ui::DirectoryFilterOptions *m_ui = nullptr;
mutable QMutex m_lock; mutable QMutex m_lock;
QStringList m_files; Utils::FilePathList m_files;
bool m_isCustomFilter = true; bool m_isCustomFilter = true;
}; };

View File

@@ -45,7 +45,7 @@ QTC_DECLARE_MYTESTDATADIR("../../../../tests/locators/")
class MyBaseFileFilter : public Core::BaseFileFilter class MyBaseFileFilter : public Core::BaseFileFilter
{ {
public: public:
MyBaseFileFilter(const QStringList &theFiles) MyBaseFileFilter(const Utils::FilePathList &theFiles)
{ {
setFileIterator(new BaseFileFilter::ListIterator(theFiles)); setFileIterator(new BaseFileFilter::ListIterator(theFiles));
} }
@@ -74,7 +74,7 @@ void Core::Internal::CorePlugin::test_basefilefilter()
QFETCH(QStringList, testFiles); QFETCH(QStringList, testFiles);
QFETCH(QList<ReferenceData>, referenceDataList); QFETCH(QList<ReferenceData>, referenceDataList);
MyBaseFileFilter filter(testFiles); MyBaseFileFilter filter(Utils::transform(testFiles, &Utils::FilePath::fromString));
BasicLocatorFilterTest test(&filter); BasicLocatorFilterTest test(&filter);
for (const ReferenceData &reference : qAsConst(referenceDataList)) { for (const ReferenceData &reference : qAsConst(referenceDataList)) {

View File

@@ -37,9 +37,9 @@
#include <QTimer> #include <QTimer>
using namespace Core; using namespace Core;
using namespace CppTools;
using namespace CppTools::Internal;
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils;
namespace CppTools { namespace CppTools {
namespace Internal { namespace Internal {
@@ -50,9 +50,8 @@ public:
void toFront() override; void toFront() override;
bool hasNext() const override; bool hasNext() const override;
QString next() override; Utils::FilePath next() override;
QString filePath() const override; Utils::FilePath filePath() const override;
QString fileName() const override;
private: private:
void fetchMore(); void fetchMore();
@@ -62,13 +61,9 @@ private:
QSet<QString> m_queuedPaths; QSet<QString> m_queuedPaths;
QSet<QString> m_allResultPaths; QSet<QString> m_allResultPaths;
QStringList m_resultQueue; QStringList m_resultQueue;
QString m_currentPath; FilePath m_currentPath;
}; };
} // Internal
} // CppTools
CppIncludesIterator::CppIncludesIterator(CPlusPlus::Snapshot snapshot, CppIncludesIterator::CppIncludesIterator(CPlusPlus::Snapshot snapshot,
const QSet<QString> &seedPaths) const QSet<QString> &seedPaths)
: m_snapshot(snapshot), : m_snapshot(snapshot),
@@ -90,26 +85,21 @@ bool CppIncludesIterator::hasNext() const
return !m_resultQueue.isEmpty(); return !m_resultQueue.isEmpty();
} }
QString CppIncludesIterator::next() FilePath CppIncludesIterator::next()
{ {
if (m_resultQueue.isEmpty()) if (m_resultQueue.isEmpty())
return QString(); return {};
m_currentPath = m_resultQueue.takeFirst(); m_currentPath = FilePath::fromString(m_resultQueue.takeFirst());
if (m_resultQueue.isEmpty()) if (m_resultQueue.isEmpty())
fetchMore(); fetchMore();
return m_currentPath; return m_currentPath;
} }
QString CppIncludesIterator::filePath() const FilePath CppIncludesIterator::filePath() const
{ {
return m_currentPath; return m_currentPath;
} }
QString CppIncludesIterator::fileName() const
{
return QFileInfo(m_currentPath).fileName();
}
void CppIncludesIterator::fetchMore() void CppIncludesIterator::fetchMore()
{ {
while (!m_queuedPaths.isEmpty() && m_resultQueue.isEmpty()) { while (!m_queuedPaths.isEmpty() && m_resultQueue.isEmpty()) {
@@ -186,3 +176,7 @@ void CppIncludesFilter::markOutdated()
m_needsUpdate = true; m_needsUpdate = true;
setFileIterator(nullptr); // clean up setFileIterator(nullptr); // clean up
} }
} // Internal
} // CppTools

View File

@@ -57,9 +57,9 @@ void AllProjectsFilter::prepareSearch(const QString &entry)
{ {
Q_UNUSED(entry) Q_UNUSED(entry)
if (!fileIterator()) { if (!fileIterator()) {
QStringList paths; Utils::FilePathList paths;
for (Project *project : SessionManager::projects()) for (Project *project : SessionManager::projects())
paths.append(Utils::transform(project->files(Project::AllFiles), &Utils::FilePath::toString)); paths.append(project->files(Project::AllFiles));
Utils::sort(paths); Utils::sort(paths);
setFileIterator(new BaseFileFilter::ListIterator(paths)); setFileIterator(new BaseFileFilter::ListIterator(paths));
} }

View File

@@ -56,9 +56,9 @@ void CurrentProjectFilter::prepareSearch(const QString &entry)
{ {
Q_UNUSED(entry) Q_UNUSED(entry)
if (!fileIterator()) { if (!fileIterator()) {
QStringList paths; Utils::FilePathList paths;
if (m_project) if (m_project)
paths = Utils::transform(m_project->files(Project::AllFiles), &Utils::FilePath::toString); paths = m_project->files(Project::AllFiles);
setFileIterator(new BaseFileFilter::ListIterator(paths)); setFileIterator(new BaseFileFilter::ListIterator(paths));
} }
BaseFileFilter::prepareSearch(entry); BaseFileFilter::prepareSearch(entry);