ProjectNodesHelper: Some cleanup

1. Make internal scanForFiles() static.
2. Make it a non-template method.
3. Pass const QFuture<void> & instead of non-const QPromise<Result>,
   since we use it here just for isCanceled() checking.
4. Simplify setting a concurrent call data by eliminating the
   intermediate lambda.

Amends c5564559cc

Change-Id: I4b7e3be6e8428c913920e66f2c00800055e83fde
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Jarek Kobus
2024-06-17 16:47:47 +02:00
parent 15e510abcf
commit 51c9611268

View File

@@ -26,9 +26,8 @@ struct DirectoryScanResult
Utils::FilePaths subDirectories; Utils::FilePaths subDirectories;
}; };
template<typename Result> static DirectoryScanResult scanForFiles(
DirectoryScanResult scanForFiles( const QFuture<void> &future,
QPromise<Result> &promise,
const Utils::FilePath &directory, const Utils::FilePath &directory,
const QDir::Filters &filter, const QDir::Filters &filter,
const std::function<FileNode *(const Utils::FilePath &)> factory, const std::function<FileNode *(const Utils::FilePath &)> factory,
@@ -38,7 +37,7 @@ DirectoryScanResult scanForFiles(
const Utils::FilePaths entries = directory.dirEntries(filter); const Utils::FilePaths entries = directory.dirEntries(filter);
for (const Utils::FilePath &entry : entries) { for (const Utils::FilePath &entry : entries) {
if (promise.isCanceled()) if (future.isCanceled())
return result; return result;
if (Utils::anyOf(versionControls, [entry](const Core::IVersionControl *vc) { if (Utils::anyOf(versionControls, [entry](const Core::IVersionControl *vc) {
@@ -52,7 +51,6 @@ DirectoryScanResult scanForFiles(
else if (FileNode *node = factory(entry)) else if (FileNode *node = factory(entry))
result.nodes.append(node); result.nodes.append(node);
} }
return result; return result;
} }
@@ -65,9 +63,11 @@ QList<FileNode *> scanForFilesRecursively(
const std::function<FileNode *(const Utils::FilePath &)> factory, const std::function<FileNode *(const Utils::FilePath &)> factory,
const QList<Core::IVersionControl *> &versionControls) const QList<Core::IVersionControl *> &versionControls)
{ {
const QFuture<void> future(promise.future());
QSet<Utils::FilePath> visited; QSet<Utils::FilePath> visited;
const DirectoryScanResult result const DirectoryScanResult result
= scanForFiles(promise, directory, filter, factory, versionControls); = scanForFiles(future, directory, filter, factory, versionControls);
QList<FileNode *> fileNodes = result.nodes; QList<FileNode *> fileNodes = result.nodes;
const double progressIncrement = progressRange const double progressIncrement = progressRange
/ static_cast<double>( / static_cast<double>(
@@ -86,15 +86,12 @@ QList<FileNode *> scanForFilesRecursively(
while (!subDirectories.isEmpty()) { while (!subDirectories.isEmpty()) {
using namespace Tasking; using namespace Tasking;
LoopList iterator(subDirectories); const LoopList iterator(subDirectories);
subDirectories.clear(); subDirectories.clear();
auto onSetup = [&, iterator](Utils::Async<DirectoryScanResult> &task) { auto onSetup = [&, iterator](Utils::Async<DirectoryScanResult> &task) {
task.setConcurrentCallData( task.setConcurrentCallData(
[&filter, &factory, &promise, &versionControls, subdir = iterator->first]( scanForFiles, future, iterator->first, filter, factory, versionControls);
QPromise<DirectoryScanResult> &p) {
p.addResult(scanForFiles(promise, subdir, filter, factory, versionControls));
});
}; };
auto onDone = [&, iterator](const Utils::Async<DirectoryScanResult> &task) { auto onDone = [&, iterator](const Utils::Async<DirectoryScanResult> &task) {