forked from qt-creator/qt-creator
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 <tobias.hunger@qt.io>
This commit is contained in:
@@ -444,18 +444,27 @@ void CMakeProject::buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::
|
|||||||
|
|
||||||
qDeleteAll(ProjectExplorer::subtractSortedList(newList, added, sortNodesByPath));
|
qDeleteAll(ProjectExplorer::subtractSortedList(newList, added, sortNodesByPath));
|
||||||
|
|
||||||
|
QHash<ProjectExplorer::FolderNode *, QList<ProjectExplorer::FileNode *> > addedFolderMapping;
|
||||||
|
QHash<ProjectExplorer::FolderNode *, QList<ProjectExplorer::FileNode *> > deletedFolderMapping;
|
||||||
|
|
||||||
// add added nodes
|
// add added nodes
|
||||||
foreach (ProjectExplorer::FileNode *fn, added) {
|
foreach (ProjectExplorer::FileNode *fn, added) {
|
||||||
// Get relative path to rootNode
|
// Get relative path to rootNode
|
||||||
QString parentDir = fn->filePath().toFileInfo().absolutePath();
|
QString parentDir = fn->filePath().toFileInfo().absolutePath();
|
||||||
ProjectExplorer::FolderNode *folder = findOrCreateFolder(rootNode, parentDir);
|
ProjectExplorer::FolderNode *folder = findOrCreateFolder(rootNode, parentDir);
|
||||||
folder->addFileNodes(QList<ProjectExplorer::FileNode *>()<< 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
|
// remove old file nodes and check whether folder nodes can be removed
|
||||||
foreach (ProjectExplorer::FileNode *fn, deleted) {
|
foreach (ProjectExplorer::FileNode *fn, deleted)
|
||||||
ProjectExplorer::FolderNode *parent = fn->parentFolderNode();
|
deletedFolderMapping[fn->parentFolderNode()] << fn;
|
||||||
parent->removeFileNodes(QList<ProjectExplorer::FileNode *>() << fn);
|
|
||||||
|
for (auto i = deletedFolderMapping.constBegin(); i != deletedFolderMapping.constEnd(); ++i) {
|
||||||
|
ProjectExplorer::FolderNode *parent = i.key();
|
||||||
|
parent->removeFileNodes(i.value());
|
||||||
// Check for empty parent
|
// Check for empty parent
|
||||||
while (parent->subFolderNodes().isEmpty() && parent->fileNodes().isEmpty()) {
|
while (parent->subFolderNodes().isEmpty() && parent->fileNodes().isEmpty()) {
|
||||||
ProjectExplorer::FolderNode *grandparent = parent->parentFolderNode();
|
ProjectExplorer::FolderNode *grandparent = parent->parentFolderNode();
|
||||||
|
Reference in New Issue
Block a user