From b11726bf050f34bba68e0cf70a9f396336008b9c Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 15 Dec 2016 13:19:44 +0100 Subject: [PATCH] CMake: Do not list twice Do not list twice when switching from a temporary build folder to the real one. Change-Id: Id7d5f4a4b48d6c63dd4c7da2932b6a857ff0c7f7 Reviewed-by: Alessandro Portale --- .../cmakeprojectmanager/servermodereader.cpp | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 24b832cbb92..01be80e86d1 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -226,21 +226,21 @@ CMakeConfig ServerModeReader::takeParsedConfiguration() FolderNode *setupCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, const QString &displayName, QList &files) { + if (files.isEmpty()) + return nullptr; + FolderNode *folder = findOrDefault(base->folderNodes(), [basePath](const FolderNode *fn) { return fn->filePath() == basePath; }); - if (files.isEmpty()) { - return folder; - } else { - if (!folder) { - folder = new VirtualFolderNode(basePath, priority); - folder->setDisplayName(displayName); - base->addFolderNodes({ folder }); - } - folder->buildTree(files); + + if (!folder) { + folder = new VirtualFolderNode(basePath, priority); + folder->setDisplayName(displayName); + base->addFolderNodes({ folder }); } - return nullptr; + folder->buildTree(files); + return folder; } static ProjectNode *updateCMakeInputs(CMakeListsNode *root, @@ -265,19 +265,21 @@ static ProjectNode *updateCMakeInputs(CMakeListsNode *root, if (!hasInputs) return nullptr; - QList foldersToDelete; - foldersToDelete.append(setupCMakeVFolder(cmakeVFolder, sourceDir, 1000, - QCoreApplication::translate("CMakeProjectManager::Internal", ""), - sourceInputs)); - foldersToDelete.append(setupCMakeVFolder(cmakeVFolder, buildDir, 100, - QCoreApplication::translate("CMakeProjectManager::Internal", ""), - buildInputs)); - foldersToDelete.append(setupCMakeVFolder(cmakeVFolder, Utils::FileName(), 10, - QCoreApplication::translate("CMakeProjectManager::Internal", ""), - rootInputs)); + QList toKeep; + toKeep.append(setupCMakeVFolder(cmakeVFolder, sourceDir, 1000, + QCoreApplication::translate("CMakeProjectManager::Internal", ""), + sourceInputs)); + toKeep.append(setupCMakeVFolder(cmakeVFolder, buildDir, 100, + QCoreApplication::translate("CMakeProjectManager::Internal", ""), + buildInputs)); + toKeep.append(setupCMakeVFolder(cmakeVFolder, Utils::FileName(), 10, + QCoreApplication::translate("CMakeProjectManager::Internal", ""), + rootInputs)); // Clean out unused nodes in "CMake Files": - const QList tmp = filtered(foldersToDelete, [](const FolderNode *fn) { return fn; }); + const QList tmp = filtered(cmakeVFolder->folderNodes(), [&toKeep](FolderNode *fn) { + return !toKeep.contains(fn); + }); cmakeVFolder->removeFolderNodes(tmp); return cmakeVFolder; @@ -755,12 +757,13 @@ void ServerModeReader::updateFileGroups(ProjectNode *targetRoot, otherFileNodes.append(fn); } - QList toDelete; - toDelete.append(setupCMakeVFolder(targetRoot, sourceDirectory, 1000, tr(""), sourceFileNodes)); - toDelete.append(setupCMakeVFolder(targetRoot, buildDirectory, 100, tr(""), buildFileNodes)); - toDelete.append(setupCMakeVFolder(targetRoot, Utils::FileName(), 10, tr(""), otherFileNodes)); + QList toKeep; + toKeep.append(setupCMakeVFolder(targetRoot, sourceDirectory, 1000, tr(""), sourceFileNodes)); + toKeep.append(setupCMakeVFolder(targetRoot, buildDirectory, 100, tr(""), buildFileNodes)); + toKeep.append(setupCMakeVFolder(targetRoot, Utils::FileName(), 10, tr(""), otherFileNodes)); - toDelete = filtered(toDelete, [](FolderNode *fn) { return fn; }); + const QList toDelete + = filtered(targetRoot->folderNodes(), [&toKeep](FolderNode *fn) { return !toKeep.contains(fn); }); if (!toDelete.isEmpty()) targetRoot->removeFolderNodes(toDelete); }