diff options
author | hjk <hjk@qt.io> | 2022-01-21 12:22:54 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2022-01-26 13:13:41 +0000 |
commit | 1fc83d2a568dea3233212b351d6e9ffbc05c75e9 (patch) | |
tree | db9cc36793eef961237f18ea1567baa7732be592 /src | |
parent | c6fdb66b2bd5c1dd30220fb0e87d2fc2e0dc2615 (diff) | |
download | qt-creator-1fc83d2a568dea3233212b351d6e9ffbc05c75e9.tar.gz |
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>
Diffstat (limited to 'src')
35 files changed, 123 insertions, 145 deletions
diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp index a4ab89fe89..f5f5f5d39a 100644 --- a/src/libs/utils/buildablehelperlibrary.cpp +++ b/src/libs/utils/buildablehelperlibrary.cpp @@ -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) diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 2b665d0c84..bcf713687a 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -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 diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index 2cb2ad9d92..501feff17b 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -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. diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index af56d2fb49..163e762e51 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -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; diff --git a/src/libs/utils/settingsaccessor.cpp b/src/libs/utils/settingsaccessor.cpp index 43bb69402a..7c847446f9 100644 --- a/src/libs/utils/settingsaccessor.cpp +++ b/src/libs/utils/settingsaccessor.cpp @@ -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, diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index bf86c19ed8..ca8e29eb38 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -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; diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index a256bf43c7..5a4d2c2fe5 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -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); diff --git a/src/plugins/android/androidmanifesteditoriconwidget.cpp b/src/plugins/android/androidmanifesteditoriconwidget.cpp index 1202c8ebc1..742c1fd631 100644 --- a/src/plugins/android/androidmanifesteditoriconwidget.cpp +++ b/src/plugins/android/androidmanifesteditoriconwidget.cpp @@ -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(); } diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index 59adbe50bd..28837ca8d4 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -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) diff --git a/src/plugins/android/javalanguageserver.cpp b/src/plugins/android/javalanguageserver.cpp index 390a7296bf..4c06b296eb 100644 --- a/src/plugins/android/javalanguageserver.cpp +++ b/src/plugins/android/javalanguageserver.cpp @@ -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); } diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index bb00d0b05d..add008f756 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -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()); } diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index 863aec0c14..3e0f1474a5 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp +++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp @@ -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(); } diff --git a/src/plugins/debugger/debuggeritemmanager.cpp b/src/plugins/debugger/debuggeritemmanager.cpp index 1b1e198d56..fbe0aeb3fa 100644 --- a/src/plugins/debugger/debuggeritemmanager.cpp +++ b/src/plugins/debugger/debuggeritemmanager.cpp @@ -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)) { diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 6aa84a6835..811f8d42e4 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1615,9 +1615,7 @@ QString GdbEngine::cleanupFullName(const QString &fileName) } return true; }, - {"*"}, - QDir::NoFilter, - QDirIterator::Subdirectories); + {{"*"}, QDir::NoFilter, QDirIterator::Subdirectories}); } } diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 7cc8eaea07..26cbaf73e3 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -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 QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) { - QRegularExpression re; - re.setPattern(QRegularExpression::wildcardToRegularExpression(filter)); - QTC_CHECK(re.isValid()); - return re; - }); + const FileFilter &filter) +{ + 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 diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 310dd9e0d9..914fbabcb0 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -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; diff --git a/src/plugins/git/gerrit/gerritparameters.cpp b/src/plugins/git/gerrit/gerritparameters.cpp index 133fdaf02e..75b76158c1 100644 --- a/src/plugins/git/gerrit/gerritparameters.cpp +++ b/src/plugins/git/gerrit/gerritparameters.cpp @@ -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; diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index d23147ee83..44ad3c2356 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -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(); } diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index 3a5c209dda..33969239f7 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -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 diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.h b/src/plugins/projectexplorer/devicesupport/desktopdevice.h index 4523be31bd..06502c559d 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.h +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.h @@ -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; diff --git a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp index 8eb992a88b..32c6add09c 100644 --- a/src/plugins/projectexplorer/devicesupport/devicemanager.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicemanager.cpp @@ -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) { diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index b183e38edf..f9c91dea1a 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -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); } diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index 75491f94fc..7b7f1e572e 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -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; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index b0b9809683..5a83af5401 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -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. diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 6f182cc1e4..705e51aa66 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -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(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 9efd7f2858..f869a9d3cd 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -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) diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index c62d879675..bd48cc84da 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -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()); diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index 7609a31c15..c11f20436c 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -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)) { diff --git a/src/plugins/qnx/qnxconfiguration.cpp b/src/plugins/qnx/qnxconfiguration.cpp index 9e5fbd25ec..751bab3401 100644 --- a/src/plugins/qnx/qnxconfiguration.cpp +++ b/src/plugins/qnx/qnxconfiguration.cpp @@ -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) { diff --git a/src/plugins/qnx/qnxutils.cpp b/src/plugins/qnx/qnxutils.cpp index e8fabfb959..90e3aeb851 100644 --- a/src/plugins/qnx/qnxutils.cpp +++ b/src/plugins/qnx/qnxutils.cpp @@ -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(); diff --git a/src/plugins/remotelinux/filesystemaccess_test.cpp b/src/plugins/remotelinux/filesystemaccess_test.cpp index 5d45484a7d..603cd1b878 100644 --- a/src/plugins/remotelinux/filesystemaccess_test.cpp +++ b/src/plugins/remotelinux/filesystemaccess_test.cpp @@ -114,8 +114,7 @@ void FileSystemAccessTest::testDirStatuses() } return false; }, - {"test"}, - QDir::Files); + {{"test"}, QDir::Files}); QVERIFY(fileExists); QVERIFY(testFilePath.removeFile()); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 91c58bff1e..5422d8d913 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -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 QList<QRegularExpression> nameRegexps = transform(nameFilters, [](const QString &filter) { - QRegularExpression re; - re.setPattern(QRegularExpression::wildcardToRegularExpression(filter)); - QTC_CHECK(re.isValid()); - return re; - }); + const FileFilter &filter) +{ + 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 diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index 189b0229ec..fa68624cac 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -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; diff --git a/src/plugins/texteditor/highlightersettings.cpp b/src/plugins/texteditor/highlightersettings.cpp index f94a5c09e1..75875249b7 100644 --- a/src/plugins/texteditor/highlightersettings.cpp +++ b/src/plugins/texteditor/highlightersettings.cpp @@ -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 {}; diff --git a/src/plugins/texteditor/snippets/snippetscollection.cpp b/src/plugins/texteditor/snippets/snippetscollection.cpp index e678a93ef2..49ededc1b0 100644 --- a/src/plugins/texteditor/snippets/snippetscollection.cpp +++ b/src/plugins/texteditor/snippets/snippetscollection.cpp @@ -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, |