CMake: Fix some more SOFT-ASSERTS in CMake server-mode

Fix two more SOFT-ASSERTs in CMake server-mode that could be triggered
by complex projects.

Move and simplify search functionality into FolderNode and use that instead
of hand-crafting a custom tree search in CMake.

Change-Id: If4bde5c4a7ff84c7d5dba4f595e99b39f54ac8aa
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-03-14 16:21:33 +01:00
parent 6e91fe5046
commit 1621aaa26e
3 changed files with 43 additions and 22 deletions

View File

@@ -401,6 +401,37 @@ QIcon FolderNode::icon() const
return m_icon;
}
Node *FolderNode::findNode(const std::function<bool(Node *)> &filter)
{
if (filter(this))
return this;
for (Node *n : m_nodes) {
if (n->asFileNode() && filter(n)) {
return n;
} else if (FolderNode *folder = n->asFolderNode()) {
Node *result = folder->findNode(filter);
if (result)
return result;
}
}
return nullptr;
}
QList<Node *> FolderNode::findNodes(const std::function<bool(Node *)> &filter)
{
QList<Node *> result;
if (filter(this))
result.append(this);
for (Node *n : m_nodes) {
if (n->asFileNode() && filter(n))
result.append(n);
else if (FolderNode *folder = n->asFolderNode())
result.append(folder->findNode(filter));
}
return result;
}
void FolderNode::forEachNode(const std::function<void(FileNode *)> &fileTask,
const std::function<void(FolderNode *)> &folderTask,
const std::function<bool(const FolderNode *)> &folderFilterTask) const