From 669d04a686418541f83a1936d4b278721ec986fe Mon Sep 17 00:00:00 2001 From: Florian Apolloner Date: Fri, 23 Sep 2016 10:48:02 +0200 Subject: [PATCH] Massively speed up CMakeProject::buildTree This is done by updating folders once and not per file. Task-number: QTCREATORBUG-16930 Change-Id: I6c1959031e7ad774cfd22c7364c88e1d0bd32962 Reviewed-by: Tobias Hunger --- .../cmakeprojectmanager/cmakeproject.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index ab6673ed3bd..a2a6e9b4c92 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -444,18 +444,27 @@ void CMakeProject::buildTree(CMakeProjectNode *rootNode, QList > addedFolderMapping; + QHash > deletedFolderMapping; + // add added nodes foreach (ProjectExplorer::FileNode *fn, added) { // Get relative path to rootNode QString parentDir = fn->filePath().toFileInfo().absolutePath(); ProjectExplorer::FolderNode *folder = findOrCreateFolder(rootNode, parentDir); - folder->addFileNodes(QList()<< fn); + addedFolderMapping[folder] << fn; } + for (auto i = addedFolderMapping.constBegin(); i != addedFolderMapping.constEnd(); ++i) + i.key()->addFileNodes(i.value()); + // remove old file nodes and check whether folder nodes can be removed - foreach (ProjectExplorer::FileNode *fn, deleted) { - ProjectExplorer::FolderNode *parent = fn->parentFolderNode(); - parent->removeFileNodes(QList() << fn); + foreach (ProjectExplorer::FileNode *fn, deleted) + deletedFolderMapping[fn->parentFolderNode()] << fn; + + for (auto i = deletedFolderMapping.constBegin(); i != deletedFolderMapping.constEnd(); ++i) { + ProjectExplorer::FolderNode *parent = i.key(); + parent->removeFileNodes(i.value()); // Check for empty parent while (parent->subFolderNodes().isEmpty() && parent->fileNodes().isEmpty()) { ProjectExplorer::FolderNode *grandparent = parent->parentFolderNode();