Utils: Wrap various file system iteration flags and filters

... into a single class.

This makes passing them around as a whole easier, and opens a path
to have "generic" filters in form of a lambda or such.

Change-Id: Ibf644b2fedcf0f1a35258030710afff8f5873f88
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2022-01-21 12:22:54 +01:00
parent c6fdb66b2b
commit 1fc83d2a56
35 changed files with 121 additions and 143 deletions

View File

@@ -88,9 +88,7 @@ static FilePath findQmakeInDir(const FilePath &dir)
// Prefer qmake-qt5 to qmake-qt4 by sorting the filenames in reverse order.
const FilePaths candidates = dir.dirEntries(
BuildableHelperLibrary::possibleQMakeCommands(),
QDir::Files,
QDirIterator::NoIteratorFlags,
{BuildableHelperLibrary::possibleQMakeCommands(), QDir::Files},
QDir::Name | QDir::Reversed);
for (const FilePath &candidate : candidates) {
if (candidate == qmakePath)

View File

@@ -718,19 +718,16 @@ bool FilePath::createDir() const
return dir.mkpath(dir.absolutePath());
}
FilePaths FilePath::dirEntries(const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags,
QDir::SortFlags sort) const
FilePaths FilePath::dirEntries(const FileFilter &filter, QDir::SortFlags sort) const
{
FilePaths result;
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.iterateDirectory, return {});
const auto callBack = [&result](const FilePath &path) { result.append(path); return true; };
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags);
s_deviceHooks.iterateDirectory(*this, callBack, filter);
} else {
QDirIterator dit(m_data, nameFilters, filters, flags);
QDirIterator dit(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
while (dit.hasNext())
result.append(FilePath::fromString(dit.next()));
}
@@ -748,7 +745,7 @@ FilePaths FilePath::dirEntries(const QStringList &nameFilters,
FilePaths FilePath::dirEntries(QDir::Filters filters) const
{
return dirEntries({}, filters);
return dirEntries(FileFilter({}, filters));
}
// This runs \a callBack on each directory entry matching all \a filters and
@@ -756,17 +753,15 @@ FilePaths FilePath::dirEntries(QDir::Filters filters) const
// An empty \nameFilters list matches every name.
void FilePath::iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
const FileFilter &filter) const
{
if (needsDevice()) {
QTC_ASSERT(s_deviceHooks.iterateDirectory, return);
s_deviceHooks.iterateDirectory(*this, callBack, nameFilters, filters, flags);
s_deviceHooks.iterateDirectory(*this, callBack, filter);
return;
}
QDirIterator it(m_data, nameFilters, filters, flags);
QDirIterator it(m_data, filter.nameFilters, filter.fileFilters, filter.iteratorFlags);
while (it.hasNext()) {
if (!callBack(FilePath::fromString(it.next())))
return;
@@ -1454,6 +1449,15 @@ QTextStream &operator<<(QTextStream &s, const FilePath &fn)
return s << fn.toString();
}
FileFilter::FileFilter(const QStringList &nameFilters,
const QDir::Filters fileFilters,
const QDirIterator::IteratorFlags flags)
: nameFilters(nameFilters),
fileFilters(fileFilters),
iteratorFlags(flags)
{
}
} // namespace Utils
std::hash<Utils::FilePath>::result_type

View File

@@ -51,6 +51,18 @@ namespace Utils {
class Environment;
class EnvironmentChange;
class QTCREATOR_UTILS_EXPORT FileFilter
{
public:
FileFilter(const QStringList &nameFilters,
const QDir::Filters fileFilters = QDir::NoFilter,
const QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags);
const QStringList nameFilters;
const QDir::Filters fileFilters = QDir::NoFilter;
const QDirIterator::IteratorFlags iteratorFlags = QDirIterator::NoIteratorFlags;
};
class QTCREATOR_UTILS_EXPORT FilePath
{
public:
@@ -121,9 +133,7 @@ public:
qint64 fileSize() const;
qint64 bytesAvailable() const;
bool createDir() const;
QList<FilePath> dirEntries(const QStringList &nameFilters,
QDir::Filters filters = QDir::NoFilter,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags,
QList<FilePath> dirEntries(const FileFilter &filter,
QDir::SortFlags sort = QDir::NoSort) const;
QList<FilePath> dirEntries(QDir::Filters filters) const;
QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const;
@@ -160,9 +170,7 @@ public:
[[nodiscard]] FilePath onDevice(const FilePath &deviceTemplate) const;
[[nodiscard]] FilePath withNewPath(const QString &newPath) const;
void iterateDirectory(const std::function<bool(const FilePath &item)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters = QDir::NoFilter,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const;
const FileFilter &filter) const;
// makes sure that capitalization of directories is canonical
// on Windows and macOS. This is rarely needed.

View File

@@ -82,9 +82,7 @@ public:
std::function<QString(const FilePath &)> mapToDevicePath;
std::function<void(const FilePath &,
const std::function<bool(const FilePath &)> &, // Abort on 'false' return.
const QStringList &,
QDir::Filters,
QDirIterator::IteratorFlags)> iterateDirectory;
const FileFilter &)> iterateDirectory;
std::function<QByteArray(const FilePath &, qint64, qint64)> fileContents;
std::function<bool(const FilePath &, const QByteArray &)> writeFileContents;
std::function<QDateTime(const FilePath &)> lastModified;

View File

@@ -221,7 +221,7 @@ FilePaths BackUpStrategy::readFileCandidates(const FilePath &baseFileName) const
const QStringList filter(baseFileName.fileName() + '*');
const FilePath baseFileDir = baseFileName.parentDir();
return baseFileDir.dirEntries(filter, QDir::Files | QDir::Hidden | QDir::System);
return baseFileDir.dirEntries({filter, QDir::Files | QDir::Hidden | QDir::System});
}
int BackUpStrategy::compare(const SettingsAccessor::RestoreData &data1,

View File

@@ -382,8 +382,7 @@ QVector<int> AndroidConfig::availableNdkPlatforms(const QtVersion *qtVersion) co
.toInt());
return true;
},
{"android-*"},
QDir::Dirs);
{{"android-*"}, QDir::Dirs});
Utils::sort(availableNdkPlatforms, std::greater<>());
return availableNdkPlatforms;

View File

@@ -423,7 +423,7 @@ QString AndroidManager::apkDevicePreferredAbi(const Target *target)
QStringList apkAbis;
const FilePaths libsPaths = libsPath.dirEntries(QDir::Dirs | QDir::NoDotAndDotDot);
for (const FilePath &abiDir : libsPaths) {
if (!abiDir.dirEntries(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty())
if (!abiDir.dirEntries({{"*.so"}, QDir::Files | QDir::NoDotAndDotDot}).isEmpty())
apkAbis << abiDir.fileName();
}
return preferredAbi(apkAbis, target);

View File

@@ -256,7 +256,7 @@ static QImage scaleWithoutStretching(const QImage& original, const QSize& target
static bool similarFilesExist(const FilePath &path)
{
const FilePaths entries = path.parentDir().dirEntries({path.completeBaseName() + ".*"}, {});
const FilePaths entries = path.parentDir().dirEntries({{path.completeBaseName() + ".*"}});
return !entries.empty();
}

View File

@@ -73,9 +73,7 @@ static void setSdkFilesExecPermission( const FilePath &sdkExtractPath)
}
return true;
},
{"*"},
QDir::Files,
QDirIterator::Subdirectories);
{{"*"}, QDir::Files, QDirIterator::Subdirectories});
}
void AndroidSdkDownloader::downloadAndExtractSdk(const FilePath &jdkPath, const FilePath &sdkExtractPath)

View File

@@ -322,7 +322,7 @@ void JLSClient::updateProjectFiles()
const FilePath androidJar = sdkLocation / QString("platforms/%2/android.jar")
.arg(targetSDK);
FilePaths libs = {androidJar};
libs << packageSourceDir.pathAppended("libs").dirEntries({"*.jar"}, QDir::Files);
libs << packageSourceDir.pathAppended("libs").dirEntries({{"*.jar"}, QDir::Files});
generateProjectFile(projectDir, qtSrc, project()->displayName());
generateClassPathFile(projectDir, sourceDir, libs);
}

View File

@@ -79,7 +79,7 @@ static QStringList scanDirectory(const FilePath &path, const QString &prefix)
QStringList result;
qCDebug(cmInputLog) << "Scanning for directories matching" << prefix << "in" << path;
foreach (const FilePath &entry, path.dirEntries({prefix + "*"}, QDir::Dirs | QDir::NoDotAndDotDot)) {
foreach (const FilePath &entry, path.dirEntries({{prefix + "*"}, QDir::Dirs | QDir::NoDotAndDotDot})) {
QTC_ASSERT(entry.isDir(), continue);
result.append(entry.toString());
}

View File

@@ -948,10 +948,7 @@ FilePath FileApiParser::scanForCMakeReplyFile(const FilePath &buildDirectory)
if (!replyDir.exists())
return {};
const FilePaths entries = replyDir.dirEntries({"index-*.json"},
QDir::Files,
QDirIterator::NoIteratorFlags,
QDir::Name);
const FilePaths entries = replyDir.dirEntries({{"index-*.json"}, QDir::Files}, QDir::Name);
return entries.isEmpty() ? FilePath() : entries.first();
}

View File

@@ -780,7 +780,7 @@ void DebuggerItemManagerPrivate::autoDetectGdbOrLldbDebuggers(const FilePaths &s
const auto addSuspect = [&suspects](const FilePath &entry) { suspects.append(entry); return true; };
for (const FilePath &path : paths)
path.iterateDirectory(addSuspect, filters, QDir::Files | QDir::Executable);
path.iterateDirectory(addSuspect, {filters, QDir::Files | QDir::Executable});
QStringList logMessages{tr("Searching debuggers...")};
for (const FilePath &command : qAsConst(suspects)) {

View File

@@ -1615,9 +1615,7 @@ QString GdbEngine::cleanupFullName(const QString &fileName)
}
return true;
},
{"*"},
QDir::NoFilter,
QDirIterator::Subdirectories);
{{"*"}, QDir::NoFilter, QDirIterator::Subdirectories});
}
}

View File

@@ -1455,17 +1455,20 @@ bool DockerDevice::setPermissions(const FilePath &filePath, QFileDevice::Permiss
void DockerDevice::iterateWithFind(const FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters) const
const FileFilter &filter) const
{
QTC_ASSERT(callBack, return);
QTC_CHECK(filePath.isAbsolutePath());
QStringList arguments{filePath.path(), "-maxdepth", "1"};
QStringList arguments{filePath.path()};
const QDir::Filters filters = filter.fileFilters;
if (filters & QDir::NoSymLinks)
arguments.prepend("-H");
else
arguments.prepend("-L");
if (!filter.iteratorFlags.testFlag(QDirIterator::Subdirectories))
arguments.append({"-maxdepth", "1"});
QStringList filterOptions;
if (filters & QDir::Dirs)
@@ -1493,12 +1496,12 @@ void DockerDevice::iterateWithFind(const FilePath &filePath,
const QString nameOption = (filters & QDir::CaseSensitive) ? QString{"-name"}
: QString{"-iname"};
QStringList criticalWildcards;
if (!nameFilters.isEmpty()) {
if (!filter.nameFilters.isEmpty()) {
const QRegularExpression oneChar("\\[.*?\\]");
for (int i = 0, len = nameFilters.size(); i < len; ++i) {
for (int i = 0, len = filter.nameFilters.size(); i < len; ++i) {
if (i > 0)
filterOptions << "-o";
QString current = nameFilters.at(i);
QString current = filter.nameFilters.at(i);
if (current.indexOf(oneChar) != -1)
criticalWildcards.append(current);
current.replace(oneChar, "?"); // BAD! but still better than nothing
@@ -1537,15 +1540,17 @@ void DockerDevice::iterateWithFind(const FilePath &filePath,
static void filterEntriesHelper(const FilePath &base,
const std::function<bool(const FilePath &)> &callBack,
const QStringList &entries,
const QStringList &nameFilters,
QDir::Filters filters)
const FileFilter &filter)
{
const QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) {
QRegularExpression re;
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
QTC_CHECK(re.isValid());
return re;
});
QTC_CHECK(filter.iteratorFlags != QDirIterator::NoIteratorFlags); // FIXME: Not supported yet below.
const QList<QRegularExpression> nameRegexps =
transform(filter.nameFilters, [](const QString &filter) {
QRegularExpression re;
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
QTC_CHECK(re.isValid());
return re;
});
const auto nameMatches = [&nameRegexps](const QString &fileName) {
for (const QRegularExpression &re : nameRegexps) {
@@ -1557,7 +1562,7 @@ static void filterEntriesHelper(const FilePath &base,
};
// FIXME: Handle filters. For now bark on unsupported options.
QTC_CHECK(filters == QDir::NoFilter);
QTC_CHECK(filter.fileFilters == QDir::NoFilter);
for (const QString &entry : entries) {
if (!nameMatches(entry))
@@ -1569,12 +1574,8 @@ static void filterEntriesHelper(const FilePath &base,
void DockerDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
const FileFilter &filter) const
{
Q_UNUSED(flags) // FIXME: Use it.
QTC_ASSERT(handlesFile(filePath), return);
updateContainerAccess();
if (hasLocalFileAccess()) {
@@ -1582,12 +1583,12 @@ void DockerDevice::iterateDirectory(const FilePath &filePath,
local.iterateDirectory([&callBack, this](const FilePath &entry) {
return callBack(mapFromLocalAccess(entry));
},
nameFilters, filters);
filter);
return;
}
if (d->m_useFind) {
iterateWithFind(filePath, callBack, nameFilters, filters);
iterateWithFind(filePath, callBack, filter);
// d->m_useFind will be set to false if 'find' is not found. In this
// case fall back to 'ls' below.
if (d->m_useFind)
@@ -1597,7 +1598,7 @@ void DockerDevice::iterateDirectory(const FilePath &filePath,
// if we do not have find - use ls as fallback
const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}});
const QStringList entries = output.split('\n', Qt::SkipEmptyParts);
filterEntriesHelper(filePath, callBack, entries, nameFilters, filters);
filterEntriesHelper(filePath, callBack, entries, filter);
}
QByteArray DockerDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const

View File

@@ -96,9 +96,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const override;
const Utils::FileFilter &filter) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override;
bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
QDateTime lastModified(const Utils::FilePath &filePath) const override;
@@ -127,8 +125,7 @@ protected:
private:
void iterateWithFind(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters) const;
const Utils::FileFilter &filter) const;
void aboutToBeRemoved() const final;

View File

@@ -70,7 +70,7 @@ static FilePath detectApp(const QString &defaultExe)
if (!gitBinDir.endsWith("/usr/bin"))
return {};
path = gitBinDir.parentDir().parentDir();
const FilePaths entries = path.dirEntries({"mingw*"}, {});
const FilePaths entries = path.dirEntries({{"mingw*"}});
if (entries.isEmpty())
return {};
path = entries.first() / "bin" / defaultApp;

View File

@@ -217,8 +217,7 @@ static McuPackage *createRGLPackage()
if (rglPath.exists()) {
defaultPath = rglPath;
const FilePaths subDirs =
defaultPath.dirEntries({QLatin1String("rgl_ghs_D1Mx_*")},
QDir::Dirs | QDir::NoDotAndDotDot);
defaultPath.dirEntries({{"rgl_ghs_D1Mx_*"}, QDir::Dirs | QDir::NoDotAndDotDot});
if (subDirs.count() == 1)
defaultPath = subDirs.first();
}
@@ -272,8 +271,7 @@ static McuPackage *createMcuXpressoIdePackage()
defaultPath = programPath;
// If default dir has exactly one sub dir that could be the IDE path, pre-select that.
const FilePaths subDirs =
defaultPath.dirEntries({QLatin1String("MCUXpressoIDE*")},
QDir::Dirs | QDir::NoDotAndDotDot);
defaultPath.dirEntries({{"MCUXpressoIDE*"}, QDir::Dirs | QDir::NoDotAndDotDot});
if (subDirs.count() == 1)
defaultPath = subDirs.first();
}
@@ -304,8 +302,8 @@ static McuPackage *createCypressProgrammerPackage()
const FilePath candidate = findInProgramFiles("Cypress");
if (candidate.exists()) {
// "Cypress Auto Flash Utility 1.0"
const auto subDirs = candidate.dirEntries({"Cypress Auto Flash Utility*"},
QDir::Dirs, QDirIterator::NoIteratorFlags, QDir::Unsorted);
const auto subDirs = candidate.dirEntries({{"Cypress Auto Flash Utility*"}, QDir::Dirs},
QDir::Unsorted);
if (!subDirs.empty())
defaultPath = subDirs.first();
}
@@ -331,8 +329,8 @@ static McuPackage *createRenesasProgrammerPackage()
const FilePath candidate = findInProgramFiles("Renesas Electronics/Programming Tools");
if (candidate.exists()) {
// "Renesas Flash Programmer V3.09"
const auto subDirs = candidate.dirEntries({"Renesas Flash Programmer*"},
QDir::Dirs, QDirIterator::NoIteratorFlags, QDir::Unsorted);
const auto subDirs = candidate.dirEntries({{"Renesas Flash Programmer*"}, QDir::Dirs},
QDir::Unsorted);
if (!subDirs.empty())
defaultPath = subDirs.first();
}

View File

@@ -177,13 +177,11 @@ bool DesktopDevice::handlesFile(const FilePath &filePath) const
}
void DesktopDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
const std::function<bool(const FilePath &)> &callBack,
const FileFilter &filter) const
{
QTC_CHECK(!filePath.needsDevice());
filePath.iterateDirectory(callBack, nameFilters, filters, flags);
filePath.iterateDirectory(callBack, filter);
}
qint64 DesktopDevice::fileSize(const FilePath &filePath) const

View File

@@ -75,9 +75,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const override;
const Utils::FileFilter &filter) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override;
bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
qint64 fileSize(const Utils::FilePath &filePath) const override;

View File

@@ -524,12 +524,10 @@ DeviceManager::DeviceManager(bool isInstance) : d(std::make_unique<DeviceManager
deviceHooks.iterateDirectory = [](const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) {
const FileFilter &filter) {
auto device = DeviceManager::deviceForPath(filePath);
QTC_ASSERT(device, return);
device->iterateDirectory(filePath, callBack, nameFilters, filters, flags);
device->iterateDirectory(filePath, callBack, filter);
};
deviceHooks.fileContents = [](const FilePath &filePath, qint64 maxSize, qint64 offset) {

View File

@@ -363,15 +363,11 @@ FilePath IDevice::symLinkTarget(const FilePath &filePath) const
void IDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
const FileFilter &filter) const
{
Q_UNUSED(filePath);
Q_UNUSED(callBack);
Q_UNUSED(nameFilters);
Q_UNUSED(filters);
Q_UNUSED(flags);
Q_UNUSED(filter);
QTC_CHECK(false);
}

View File

@@ -33,7 +33,6 @@
#include <QAbstractSocket>
#include <QCoreApplication>
#include <QDir>
#include <QList>
#include <QObject>
#include <QSharedPointer>
@@ -257,13 +256,11 @@ public:
virtual bool renameFile(const Utils::FilePath &filePath, const Utils::FilePath &target) const;
virtual Utils::FilePath searchExecutableInPath(const QString &fileName) const;
virtual Utils::FilePath searchExecutable(const QString &fileName,
const QList<Utils::FilePath> &dirs) const;
const Utils::FilePaths &dirs) const;
virtual Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const;
virtual void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags = QDirIterator::NoIteratorFlags) const;
const Utils::FileFilter &filter) const;
virtual QByteArray fileContents(const Utils::FilePath &filePath,
qint64 limit,
qint64 offset) const;

View File

@@ -1126,7 +1126,8 @@ static FilePaths findCompilerCandidates(const IDevice::ConstPtr &device,
return true;
};
const FilePath globalDir = device->mapToGlobalPath(deviceDir);
device->iterateDirectory(globalDir, callBack, nameFilters, QDir::Files | QDir::Executable);
device->iterateDirectory(globalDir, callBack,
{nameFilters, QDir::Files | QDir::Executable});
}
} else {
// The normal, local host case.

View File

@@ -423,10 +423,11 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
continue;
}
const QDir::Filters filters = QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot;
const FileFilter filter {
{}, QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags
};
const QDir::SortFlags sortflags = QDir::Name|QDir::IgnoreCase;
const QDirIterator::IteratorFlag iteratorFlags = QDirIterator::NoIteratorFlags;
FilePaths dirs = path.dirEntries({}, filters, iteratorFlags, sortflags);
FilePaths dirs = path.dirEntries(filter, sortflags);
while (!dirs.isEmpty()) {
const FilePath currentDir = dirs.takeFirst();
@@ -483,7 +484,7 @@ QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
result << factory;
} else {
FilePaths subDirs = currentDir.dirEntries({}, filters, iteratorFlags, sortflags);
FilePaths subDirs = currentDir.dirEntries(filter, sortflags);
if (!subDirs.isEmpty()) {
// There is no QList::prepend(QList)...
dirs.swap(subDirs);
@@ -579,7 +580,7 @@ static QString qmlProjectName(const FilePath &folder)
{
FilePath currentFolder = folder;
while (!currentFolder.isEmpty()) {
const QList<FilePath> fileList = currentFolder.dirEntries({"*.qmlproject"});
const FilePaths fileList = currentFolder.dirEntries({{"*.qmlproject"}});
if (!fileList.isEmpty())
return fileList.first().baseName();
currentFolder = currentFolder.parentDir();

View File

@@ -694,7 +694,7 @@ static ProjectExplorerPluginPrivate *dd = nullptr;
static FilePaths projectFilesInDirectory(const FilePath &path)
{
return path.dirEntries(ProjectExplorerPlugin::projectFileGlobs(), QDir::Files);
return path.dirEntries({ProjectExplorerPlugin::projectFileGlobs(), QDir::Files});
}
static FilePaths projectsInDirectory(const FilePath &filePath)

View File

@@ -791,8 +791,7 @@ QStringList SessionManager::sessions()
{
if (d->m_sessions.isEmpty()) {
// We are not initialized yet, so do that now
const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({"*.qws"},
QDir::NoFilter, QDirIterator::NoIteratorFlags, QDir::Time);
const FilePaths sessionFiles = ICore::userResourcePath().dirEntries({{"*qws"}}, QDir::Time);
for (const FilePath &file : sessionFiles) {
const QString &name = file.completeBaseName();
d->m_sessionDateTimes.insert(name, file.lastModified());

View File

@@ -354,7 +354,7 @@ void generateModuleCmake(const FilePath &dir, const QString &uri)
QString fileTemplate = GenerateCmake::readTemplate(MODULEFILE_TEMPLATE_PATH);
QString singletonContent;
FilePaths qmldirFileList = dir.dirEntries(QStringList(FILENAME_QMLDIR), FILES_ONLY);
FilePaths qmldirFileList = dir.dirEntries({QStringList(FILENAME_QMLDIR), FILES_ONLY});
if (!qmldirFileList.isEmpty()) {
QStringList singletons = getSingletonsFromQmldirFile(qmldirFileList.first());
for (QString &singleton : singletons) {
@@ -418,7 +418,7 @@ FilePaths getDirectoryQmls(const FilePath &dir)
{
const QStringList qmlFilesOnly("*.qml");
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
FilePaths allFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY);
FilePaths allFiles = dir.dirEntries({qmlFilesOnly, FILES_ONLY});
FilePaths moduleFiles;
for (FilePath &file : allFiles) {
if (!isFileBlacklisted(file.fileName()) &&
@@ -436,7 +436,7 @@ QStringList getDirectoryTreeQmls(const FilePath &dir)
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject();
QStringList qmlFileList;
FilePaths thisDirFiles = dir.dirEntries(qmlFilesOnly, FILES_ONLY);
FilePaths thisDirFiles = dir.dirEntries({qmlFilesOnly, FILES_ONLY});
for (FilePath &file : thisDirFiles) {
if (!isFileBlacklisted(file.fileName()) &&
project->isKnownFile(file)) {

View File

@@ -444,9 +444,8 @@ void QnxConfiguration::updateTargets()
void QnxConfiguration::assignDebuggersToTargets()
{
const FilePath hostUsrBinDir = m_qnxHost.pathAppended("usr/bin");
FilePaths debuggerNames = hostUsrBinDir.dirEntries(
QStringList(HostOsInfo::withExecutableSuffix("nto*-gdb")),
QDir::Files);
const FilePaths debuggerNames = hostUsrBinDir.dirEntries(
{{HostOsInfo::withExecutableSuffix("nto*-gdb")}, QDir::Files});
Environment sysEnv = Environment::systemEnvironment();
sysEnv.modify(qnxEnvironmentItems());
for (const FilePath &debuggerPath : debuggerNames) {

View File

@@ -144,9 +144,9 @@ FilePath QnxUtils::envFilePath(const FilePath &sdpPath)
{
FilePaths entries;
if (sdpPath.osType() == OsTypeWindows)
entries = sdpPath.dirEntries({"*-env.bat"});
entries = sdpPath.dirEntries({{"*-env.bat"}});
else
entries = sdpPath.dirEntries({"*-env.sh"});
entries = sdpPath.dirEntries({{"*-env.sh"}});
if (!entries.isEmpty())
return entries.first();

View File

@@ -114,8 +114,7 @@ void FileSystemAccessTest::testDirStatuses()
}
return false;
},
{"test"},
QDir::Files);
{{"test"}, QDir::Files});
QVERIFY(fileExists);
QVERIFY(testFilePath.removeFile());

View File

@@ -679,16 +679,15 @@ bool LinuxDevice::setPermissions(const Utils::FilePath &filePath, QFileDevice::P
static void filterEntriesHelper(const FilePath &base,
const std::function<bool(const FilePath &)> &callBack,
const QStringList &entries,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags)
const FileFilter &filter)
{
const QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) {
QRegularExpression re;
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
QTC_CHECK(re.isValid());
return re;
});
const QList<QRegularExpression> nameRegexps =
transform(filter.nameFilters, [](const QString &filter) {
QRegularExpression re;
re.setPattern(QRegularExpression::wildcardToRegularExpression(filter));
QTC_CHECK(re.isValid());
return re;
});
const auto nameMatches = [&nameRegexps](const QString &fileName) {
for (const QRegularExpression &re : nameRegexps) {
@@ -700,8 +699,8 @@ static void filterEntriesHelper(const FilePath &base,
};
// FIXME: Handle filters. For now bark on unsupported options.
QTC_CHECK(filters == QDir::NoFilter);
QTC_CHECK(flags == QDirIterator::NoIteratorFlags);
QTC_CHECK(filter.fileFilters == QDir::NoFilter);
QTC_CHECK(filter.iteratorFlags == QDirIterator::NoIteratorFlags);
for (const QString &entry : entries) {
if (!nameMatches(entry))
@@ -713,15 +712,13 @@ static void filterEntriesHelper(const FilePath &base,
void LinuxDevice::iterateDirectory(const FilePath &filePath,
const std::function<bool(const FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const
const FileFilter &filter) const
{
QTC_ASSERT(handlesFile(filePath), return);
// if we do not have find - use ls as fallback
const QString output = d->outputForRunInShell({"ls", {"-1", "-b", "--", filePath.path()}});
const QStringList entries = output.split('\n', Qt::SkipEmptyParts);
filterEntriesHelper(filePath, callBack, entries, nameFilters, filters, flags);
filterEntriesHelper(filePath, callBack, entries, filter);
}
QByteArray LinuxDevice::fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const

View File

@@ -78,9 +78,7 @@ public:
Utils::FilePath symLinkTarget(const Utils::FilePath &filePath) const override;
void iterateDirectory(const Utils::FilePath &filePath,
const std::function<bool(const Utils::FilePath &)> &callBack,
const QStringList &nameFilters,
QDir::Filters filters,
QDirIterator::IteratorFlags flags) const override;
const Utils::FileFilter &filter) const override;
QByteArray fileContents(const Utils::FilePath &filePath, qint64 limit, qint64 offset) const override;
bool writeFileContents(const Utils::FilePath &filePath, const QByteArray &data) const override;
QDateTime lastModified(const Utils::FilePath &filePath) const override;

View File

@@ -58,7 +58,7 @@ FilePath findFallbackDefinitionsLocation()
FilePath("/opt") / kateSyntaxPath
};
for (const FilePath &path : paths) {
if (path.exists() && !path.dirEntries({"*.xml"}).isEmpty())
if (path.exists() && !path.dirEntries({{"*.xml"}}).isEmpty())
return path;
}
}
@@ -76,7 +76,7 @@ FilePath findFallbackDefinitionsLocation()
const FilePath dir = FilePath::fromString(output);
for (auto &kateSyntaxPath : kateSyntaxPaths) {
const FilePath path = dir / kateSyntaxPath;
if (path.exists() && !path.dirEntries({"*.xml"}).isEmpty())
if (path.exists() && !path.dirEntries({{"*.xml"}}).isEmpty())
return path;
}
}
@@ -84,7 +84,7 @@ FilePath findFallbackDefinitionsLocation()
}
const FilePath dir = Core::ICore::resourcePath("generic-highlighter");
if (dir.exists() && !dir.dirEntries({"*.xml"}).isEmpty())
if (dir.exists() && !dir.dirEntries({{"*.xml"}}).isEmpty())
return dir;
return {};

View File

@@ -95,7 +95,8 @@ SnippetsCollection *SnippetsCollection::instance()
// SnippetsCollection
SnippetsCollection::SnippetsCollection()
: m_userSnippetsFile(Core::ICore::userResourcePath("snippets/snippets.xml")),
m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets").dirEntries({"*.xml"}))
m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets")
.dirEntries(FileFilter({"*.xml"})))
{
connect(Core::ICore::instance(), &Core::ICore::coreOpened,