From 426f8185c2bc707238f5ee316262e96db63d3853 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 13 Jul 2021 16:58:02 +0200 Subject: [PATCH] ProjectTree: Improve performance of finding nodes Using projectNode->forEachGenericNode(...) to find a node is much slower than using project->nodeForFilePath(...), since the latter uses a binary search. Fixes: QTCREATORBUG-25845 Change-Id: I91be577a11b03915d1f21fe86a4cdd9ab0381f51 Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/project.cpp | 2 +- src/plugins/projectexplorer/project.h | 2 +- src/plugins/projectexplorer/projecttree.cpp | 17 ++++++++--------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 7064e47204a..25fe115afd3 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -851,7 +851,7 @@ bool Project::isKnownFile(const Utils::FilePath &filename) const } const Node *Project::nodeForFilePath(const Utils::FilePath &filePath, - const Project::NodeMatcher &extraMatcher) + const Project::NodeMatcher &extraMatcher) const { const FileNode dummy(filePath, FileType::Unknown); const auto range = std::equal_range(d->m_sortedNodeList.cbegin(), d->m_sortedNodeList.cend(), diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 9b783b7127c..7eca3cc0645 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -128,7 +128,7 @@ public: Utils::FilePaths files(const NodeMatcher &matcher) const; bool isKnownFile(const Utils::FilePath &filename) const; const Node *nodeForFilePath(const Utils::FilePath &filePath, - const NodeMatcher &extraMatcher = {}); + const NodeMatcher &extraMatcher = {}) const; virtual QVariantMap toMap() const; diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index e94dcb602c2..22e0ee88d0c 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -458,15 +458,14 @@ Node *ProjectTree::nodeForFile(const FilePath &fileName) { Node *node = nullptr; for (const Project *project : SessionManager::projects()) { - if (ProjectNode *projectNode = project->rootProjectNode()) { - projectNode->forEachGenericNode([&](Node *n) { - if (n->filePath() == fileName) { - // prefer file nodes - if (!node || (!node->asFileNode() && n->asFileNode())) - node = n; - } - }); - } + project->nodeForFilePath(fileName, [&](const Node *n) { + if (!node || (!node->asFileNode() && n->asFileNode())) + node = const_cast(n); + return false; + }); + // early return: + if (node && node->asFileNode()) + return node; } return node; }