diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 03e80f99269..f0fdc443fab 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -885,14 +885,12 @@ bool Project::hasParsingData() const const ProjectNode *Project::findNodeForBuildKey(const QString &buildKey) const { - const ProjectNode *result = nullptr; - if (d->m_rootProjectNode) { - d->m_rootProjectNode->forEachProjectNode([&result, buildKey](const ProjectNode *node) { - if (node->buildKey() == buildKey) - result = node; - }); - } - return result; + if (!d->m_rootProjectNode) + return nullptr; + + return d->m_rootProjectNode->findProjectNode([buildKey](const ProjectNode *node) { + return node->buildKey() == buildKey; + }); } ProjectImporter *Project::projectImporter() const diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 6ba1341d4ed..1c443dd9e8c 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -525,6 +525,22 @@ void FolderNode::forEachProjectNode(const std::function &predicate) const +{ + if (const ProjectNode *projectNode = asProjectNode()) { + if (predicate(projectNode)) + return projectNode; + } + + for (const std::unique_ptr &n : m_nodes) { + if (FolderNode *fn = n->asFolderNode()) { + if (const ProjectNode *pn = fn->findProjectNode(predicate)) + return pn; + } + } + return nullptr; +} + const QList FolderNode::nodes() const { return Utils::toRawPointer(m_nodes); diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 0a288bbc03f..850c0082ec9 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -219,6 +219,7 @@ public: const std::function &folderFilterTask = {}) const; void forEachGenericNode(const std::function &genericTask) const; void forEachProjectNode(const std::function &genericTask) const; + const ProjectNode *findProjectNode(const std::function &predicate) const; const QList nodes() const; QList fileNodes() const; FileNode *fileNode(const Utils::FileName &file) const;