From 3bb3f4af56b538dbf70a907f2ca5d633f8379608 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 6 Sep 2017 12:09:49 +0200 Subject: CMake: Filter out CMake input files that are already listed Filter out CMake input files that are already listed elsewhere in the project tree. This is server-mode only. Change-Id: Ib62cd5b521a51180d12d76ec2868a99dbdecc272 Reviewed-by: Tim Jenssen --- .../cmakeprojectmanager/servermodereader.cpp | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 8d487f5c49..04c69af89f 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -243,7 +243,7 @@ CMakeConfig ServerModeReader::takeParsedConfiguration() } static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, - const QString &displayName, QList &files) + const QString &displayName, const QList &files) { if (files.isEmpty()) return; @@ -258,6 +258,17 @@ static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, i fn->compress(); } +static QList removeKnownNodes(const QSet &knownFiles, const QList &files) +{ + return Utils::filtered(files, [&knownFiles](const FileNode *n) { + if (knownFiles.contains(n->filePath())) { + delete n; + return false; + } + return true; + }); +} + static void addCMakeInputs(FolderNode *root, const Utils::FileName &sourceDir, const Utils::FileName &buildDir, @@ -268,13 +279,19 @@ static void addCMakeInputs(FolderNode *root, ProjectNode *cmakeVFolder = new CMakeInputsNode(root->filePath()); root->addNode(cmakeVFolder); - addCMakeVFolder(cmakeVFolder, sourceDir, 1000, QString(), sourceInputs); + QSet knownFiles; + root->forEachGenericNode([&knownFiles](const Node *n) { + if (n->listInProject()) + knownFiles.insert(n->filePath()); + }); + + addCMakeVFolder(cmakeVFolder, sourceDir, 1000, QString(), removeKnownNodes(knownFiles, sourceInputs)); addCMakeVFolder(cmakeVFolder, buildDir, 100, QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), - buildInputs); + removeKnownNodes(knownFiles, buildInputs)); addCMakeVFolder(cmakeVFolder, Utils::FileName(), 10, QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), - rootInputs); + removeKnownNodes(knownFiles, rootInputs)); } void ServerModeReader::generateProjectTree(CMakeProjectNode *root, @@ -305,15 +322,15 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root, if (topLevel) root->setDisplayName(topLevel->name); - if (!cmakeFilesSource.isEmpty() || !cmakeFilesBuild.isEmpty() || !cmakeFilesOther.isEmpty()) - addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, - cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); - QHash cmakeListsNodes = addCMakeLists(root, cmakeLists); QList knownHeaders; addProjects(cmakeListsNodes, m_projects, knownHeaders); addHeaderNodes(root, knownHeaders, allFiles); + + if (!cmakeFilesSource.isEmpty() || !cmakeFilesBuild.isEmpty() || !cmakeFilesOther.isEmpty()) + addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, + cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); } void ServerModeReader::updateCodeModel(CppTools::RawProjectParts &rpps) -- cgit v1.2.1