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