From d341ab6371fb97394865cf9c795f0f486174eb51 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 22 Sep 2021 15:55:15 +0200 Subject: [PATCH] CMakePM: Remove virtual project node CMake projects need to add the headers as source files in order to get exported from the CMake file-api json export. Having header files that are not part of the project displayed in the node is error prone and confusing. This also means that you won't get bogus files when doing git commit for example. Fixes: QTCREATORBUG-18206 Fixes: QTCREATORBUG-24609 Fixes: QTCREATORBUG-25407 Change-Id: I89ac4f8a80f452119f8a991b9e4ef14efb7a86b9 Reviewed-by: Eike Ziller --- .../fileapidataextractor.cpp | 40 ++++++------------- .../fileapidataextractor.h | 1 - .../cmakeprojectmanager/fileapireader.cpp | 4 -- .../cmakeprojectmanager/fileapireader.h | 1 - .../cmakeprojectmanager/projecttreehelper.cpp | 33 --------------- .../cmakeprojectmanager/projecttreehelper.h | 4 -- 6 files changed, 13 insertions(+), 70 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 13c99c5bfb4..5c50ce0c977 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -503,8 +503,7 @@ void addCompileGroups(ProjectNode *targetRoot, const Utils::FilePath &topSourceDirectory, const Utils::FilePath &sourceDirectory, const Utils::FilePath &buildDirectory, - const TargetDetails &td, - QSet &knownHeaderNodes) + const TargetDetails &td) { const bool inSourceBuild = (sourceDirectory == buildDirectory); @@ -532,10 +531,6 @@ void addCompileGroups(ProjectNode *targetRoot, auto node = std::make_unique(sourcePath, Node::fileTypeForFileName(sourcePath)); node->setIsGenerated(si.isGenerated); - // Register headers: - if (node->fileType() == FileType::Header) - knownHeaderNodes.insert(node->filePath()); - // Where does the file node need to go? if (sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { buildFileNodes.emplace_back(std::move(node)); @@ -583,8 +578,7 @@ void addTargets(const QHash &cm const Configuration &config, const std::vector &targetDetails, const FilePath &sourceDir, - const FilePath &buildDir, - QSet &knownHeaderNodes) + const FilePath &buildDir) { for (const FileApiDetails::Target &t : config.targets) { const TargetDetails &td = Utils::findOrDefault(targetDetails, @@ -598,42 +592,37 @@ void addTargets(const QHash &cm tNode->setTargetInformation(td.artifacts, td.type); tNode->setBuildDirectory(directoryBuildDir(config, buildDir, t.directory)); - addCompileGroups(tNode, sourceDir, dir, tNode->buildDirectory(), td, knownHeaderNodes); + addCompileGroups(tNode, sourceDir, dir, tNode->buildDirectory(), td); } } -std::pair, QSet> generateRootProjectNode( +std::unique_ptr generateRootProjectNode( PreprocessedData &data, const FilePath &sourceDirectory, const FilePath &buildDirectory) { - std::pair, QSet> result; - result.first = std::make_unique(sourceDirectory); + std::unique_ptr result = std::make_unique(sourceDirectory); const FileApiDetails::Project topLevelProject = findOrDefault(data.codemodel.projects, equal(&FileApiDetails::Project::parent, -1)); if (!topLevelProject.name.isEmpty()) - result.first->setDisplayName(topLevelProject.name); + result->setDisplayName(topLevelProject.name); else - result.first->setDisplayName(sourceDirectory.fileName()); + result->setDisplayName(sourceDirectory.fileName()); - QHash cmakeListsNodes = addCMakeLists(result.first.get(), + QHash cmakeListsNodes = addCMakeLists(result.get(), std::move(data.cmakeListNodes)); data.cmakeListNodes.clear(); // Remove all the nullptr in the vector... - QSet knownHeaders; addProjects(cmakeListsNodes, data.codemodel, sourceDirectory); addTargets(cmakeListsNodes, data.codemodel, data.targetDetails, sourceDirectory, - buildDirectory, - knownHeaders); - - // addHeaderNodes(root.get(), knownHeaders, allFiles); + buildDirectory); if (!data.cmakeNodesSource.empty() || !data.cmakeNodesBuild.empty() || !data.cmakeNodesOther.empty()) - addCMakeInputs(result.first.get(), + addCMakeInputs(result.get(), sourceDirectory, buildDirectory, std::move(data.cmakeNodesSource), @@ -644,8 +633,6 @@ std::pair, QSet> generateRootProject data.cmakeNodesBuild.clear(); // Remove all the nullptr in the vector... data.cmakeNodesOther.clear(); // Remove all the nullptr in the vector... - result.second = knownHeaders; - return result; } @@ -720,10 +707,9 @@ FileApiQtcData extractData(FileApiData &input, result.cmakeFiles = std::move(data.cmakeFiles); result.projectParts = generateRawProjectParts(data, sourceDirectory); - auto pair = generateRootProjectNode(data, sourceDirectory, buildDirectory); - ProjectTree::applyTreeManager(pair.first.get()); // QRC nodes - result.rootProjectNode = std::move(pair.first); - result.knownHeaders = std::move(pair.second); + auto rootProjectNode = generateRootProjectNode(data, sourceDirectory, buildDirectory); + ProjectTree::applyTreeManager(rootProjectNode.get()); // QRC nodes + result.rootProjectNode = std::move(rootProjectNode); setupLocationInfoForTargets(result.rootProjectNode.get(), result.buildTargets); diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.h b/src/plugins/cmakeprojectmanager/fileapidataextractor.h index f42cc27d410..f0ba89d0428 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.h +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.h @@ -67,7 +67,6 @@ public: QList buildTargets; ProjectExplorer::RawProjectParts projectParts; std::unique_ptr rootProjectNode; - QSet knownHeaders; QString ctestPath; bool isMultiConfig = false; bool usesAllCapsTargets = false; diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index 15f95637e2d..24c3c29fe47 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -98,7 +98,6 @@ void FileApiReader::resetData() m_buildTargets.clear(); m_projectParts.clear(); m_rootProjectNode.reset(); - m_knownHeaders.clear(); } void FileApiReader::parse(bool forceCMakeRun, @@ -220,8 +219,6 @@ std::unique_ptr FileApiReader::generateProjectTree( { if (failedToParse) addFileSystemNodes(m_rootProjectNode.get(), allFiles.folderNode); - else - addHeaderNodes(m_rootProjectNode.get(), m_knownHeaders, allFiles.allFiles); return std::exchange(m_rootProjectNode, {}); } @@ -291,7 +288,6 @@ void FileApiReader::endState(const FilePath &replyFilePath, bool restoredFromBac m_buildTargets = std::move(value->buildTargets); m_projectParts = std::move(value->projectParts); m_rootProjectNode = std::move(value->rootProjectNode); - m_knownHeaders = std::move(value->knownHeaders); m_ctestPath = std::move(value->ctestPath); m_isMultiConfig = std::move(value->isMultiConfig); m_usesAllCapsTargets = std::move(value->usesAllCapsTargets); diff --git a/src/plugins/cmakeprojectmanager/fileapireader.h b/src/plugins/cmakeprojectmanager/fileapireader.h index 384e711df73..a0fd38c491d 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.h +++ b/src/plugins/cmakeprojectmanager/fileapireader.h @@ -105,7 +105,6 @@ private: QList m_buildTargets; ProjectExplorer::RawProjectParts m_projectParts; std::unique_ptr m_rootProjectNode; - QSet m_knownHeaders; QString m_ctestPath; bool m_isMultiConfig = false; bool m_usesAllCapsTargets = false; diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index f9a58dc3919..0f070095f24 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -175,39 +175,6 @@ CMakeTargetNode *createTargetNode(const QHash &c return tn; } -void addHeaderNodes(ProjectNode *root, - QSet &seenHeaders, - const QList &allFiles) -{ - QTC_ASSERT(root, return ); - - if (root->isEmpty()) - return; - - auto headerNode = std::make_unique(root->filePath()); - headerNode->setPriority(Node::DefaultPriority - 5); - headerNode->setDisplayName( - QCoreApplication::translate("CMakeProjectManager::Internal::ProjectTreeHelper", - "")); - headerNode->setIcon(DirectoryIcon(ProjectExplorer::Constants::FILEOVERLAY_H)); - - // Add scanned headers: - for (const FileNode *fn : allFiles) { - if (fn->fileType() != FileType::Header || !fn->filePath().isChildOf(root->filePath())) - continue; - const int count = seenHeaders.count(); - seenHeaders.insert(fn->filePath()); - if (seenHeaders.count() != count) { - std::unique_ptr node(fn->clone()); - node->setEnabled(false); - headerNode->addNestedNode(std::move(node)); - } - } - - if (!headerNode->isEmpty()) - root->addNode(std::move(headerNode)); -} - template static std::unique_ptr cloneFolderNode(FolderNode *node) { diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.h b/src/plugins/cmakeprojectmanager/projecttreehelper.h index e25d933141b..8b767a7fad1 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.h +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.h @@ -64,10 +64,6 @@ CMakeTargetNode *createTargetNode( const Utils::FilePath &dir, const QString &displayName); -void addHeaderNodes(ProjectExplorer::ProjectNode *root, - QSet &seenHeaders, - const QList &allFiles); - void addFileSystemNodes(ProjectExplorer::ProjectNode *root, const std::shared_ptr &folderNode); } // namespace Internal