From add60c014871bdae0a038398695425a347b44952 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 20 Jun 2019 15:51:04 +0200 Subject: [PATCH] CMake: Avoid a bit of useless processing when updating the project tree Do not pass around a list of filenodes with all the known header files. That list gets converted into a QSet and then that is used. Just generate the QSet directly and avoid that conversion. Change-Id: I2444a2a6b4a1600fe476e66673a1a2e9c8900764 Reviewed-by: Cristian Adam Reviewed-by: hjk --- .../fileapidataextractor.cpp | 12 ++++---- .../fileapidataextractor.h | 2 +- .../cmakeprojectmanager/fileapireader.h | 2 +- .../cmakeprojectmanager/projecttreehelper.cpp | 5 +--- .../cmakeprojectmanager/projecttreehelper.h | 2 +- .../cmakeprojectmanager/servermodereader.cpp | 29 +++++++++---------- .../cmakeprojectmanager/servermodereader.h | 6 ++-- 7 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index aa881e856e8..0e5b0d25f66 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -384,7 +384,7 @@ void addCompileGroups(ProjectNode *targetRoot, const Utils::FilePath &sourceDirectory, const Utils::FilePath &buildDirectory, const TargetDetails &td, - QVector &knownHeaderNodes) + QSet &knownHeaderNodes) { const bool inSourceBuild = (sourceDirectory == buildDirectory); const QDir currentSourceDir(sourceDirectory.toString()); @@ -418,7 +418,7 @@ void addCompileGroups(ProjectNode *targetRoot, // Register headers: if (node->fileType() == FileType::Header) - knownHeaderNodes.append(node.get()); + knownHeaderNodes.insert(node->filePath()); // Where does the file node need to go? if (sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { @@ -450,7 +450,7 @@ void addTargets(const QHash &cm const FilePath &topSourceDir, const QDir &sourceDir, const QDir &buildDir, - QVector &knownHeaderNodes) + QSet &knownHeaderNodes) { for (const FileApiDetails::Target &t : config.targets) { const TargetDetails &td = Utils::findOrDefault(targetDetails, @@ -470,10 +470,10 @@ void addTargets(const QHash &cm } } -std::pair, QVector> generateRootProjectNode( +std::pair, QSet> generateRootProjectNode( PreprocessedData &data, const FilePath &sourceDirectory, const FilePath &buildDirectory) { - std::pair, QVector> result; + std::pair, QSet> result; result.first = std::make_unique(sourceDirectory); const QDir sourceDir(sourceDirectory.toString()); @@ -488,7 +488,7 @@ std::pair, QVector> generateRootPr std::move(data.cmakeListNodes)); data.cmakeListNodes.clear(); // Remove all the nullptr in the vector... - QVector knownHeaders; + QSet knownHeaders; addProjects(cmakeListsNodes, data.codemodel, sourceDir); addTargets(cmakeListsNodes, diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.h b/src/plugins/cmakeprojectmanager/fileapidataextractor.h index b84abbf7c85..3741f339afd 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.h +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.h @@ -47,7 +47,7 @@ public: QList buildTargets; CppTools::RawProjectParts projectParts; std::unique_ptr rootProjectNode; - QVector knownHeaders; + QSet knownHeaders; }; FileApiQtcData extractData(FileApiData &data, diff --git a/src/plugins/cmakeprojectmanager/fileapireader.h b/src/plugins/cmakeprojectmanager/fileapireader.h index b6e2218f0f4..694f60e1a27 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.h +++ b/src/plugins/cmakeprojectmanager/fileapireader.h @@ -82,7 +82,7 @@ private: QList m_buildTargets; CppTools::RawProjectParts m_projectParts; std::unique_ptr m_rootProjectNode; - QVector m_knownHeaders; + QSet m_knownHeaders; Utils::optional> m_future; diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index 1bc86189d73..58b2f744e8d 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -174,7 +174,7 @@ CMakeTargetNode *createTargetNode(const QHash &c } void addHeaderNodes(ProjectNode *root, - const QVector knownHeaders, + QSet &seenHeaders, const QList &allFiles) { if (root->isEmpty()) @@ -188,9 +188,6 @@ void addHeaderNodes(ProjectNode *root, QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "")); headerNode->setIcon(headerNodeIcon); - // knownHeaders are already listed in their targets: - QSet seenHeaders = Utils::transform(knownHeaders, &FileNode::filePath); - // Add scanned headers: for (const FileNode *fn : allFiles) { if (fn->fileType() != FileType::Header || !fn->filePath().isChildOf(root->filePath())) diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.h b/src/plugins/cmakeprojectmanager/projecttreehelper.h index 58266cd4012..1371330f702 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.h +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.h @@ -67,7 +67,7 @@ CMakeTargetNode *createTargetNode( const QString &displayName); void addHeaderNodes(ProjectExplorer::ProjectNode *root, - const QVector knownHeaders, + QSet &seenHeaders, const QList &allFiles); } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index abf05be4c8f..6b993ecdbb3 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -269,7 +269,7 @@ std::unique_ptr ServerModeReader::generateProjectTree(const QL QHash cmakeListsNodes = addCMakeLists(root.get(), std::move(cmakeLists)); - QVector knownHeaders; + QSet knownHeaders; addProjects(cmakeListsNodes, m_projects, knownHeaders); addHeaderNodes(root.get(), knownHeaders, allFiles); @@ -755,18 +755,18 @@ void ServerModeReader::fixTarget(ServerModeReader::Target *target) const void ServerModeReader::addProjects(const QHash &cmakeListsNodes, const QList &projects, - QVector &knownHeaderNodes) + QSet &knownHeaders) { for (const Project *p : projects) { createProjectNode(cmakeListsNodes, p->sourceDirectory, p->name); - addTargets(cmakeListsNodes, p->targets, knownHeaderNodes); + addTargets(cmakeListsNodes, p->targets, knownHeaders); } } void ServerModeReader::addTargets( const QHash &cmakeListsNodes, const QList &targets, - QVector &knownHeaderNodes) + QSet &knownHeaders) { for (const Target *t : targets) { CMakeTargetNode *tNode = createTargetNode(cmakeListsNodes, t->sourceDirectory, t->name); @@ -802,7 +802,7 @@ void ServerModeReader::addTargets( } } tNode->setLocationInfo(info); - addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, knownHeaderNodes); + addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, knownHeaders); } } @@ -810,7 +810,7 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, const Utils::FilePath &sourceDirectory, const Utils::FilePath &buildDirectory, const QList &fileGroups, - QVector &knownHeaderNodes) + QSet &knownHeaders) { std::vector> toList; QSet alreadyListed; @@ -825,15 +825,14 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, alreadyListed.insert(fn); return count != alreadyListed.count(); }); - std::vector> newFileNodes - = Utils::transform(newSources, - [f, &knownHeaderNodes](const Utils::FilePath &fn) { - auto node = std::make_unique(fn, Node::fileTypeForFileName(fn)); - node->setIsGenerated(f->isGenerated); - if (node->fileType() == FileType::Header) - knownHeaderNodes.append(node.get()); - return node; - }); + std::vector> newFileNodes = Utils::transform( + newSources, [f, &knownHeaders](const Utils::FilePath &fn) { + auto node = std::make_unique(fn, Node::fileTypeForFileName(fn)); + node->setIsGenerated(f->isGenerated); + if (node->fileType() == FileType::Header) + knownHeaders.insert(node->filePath()); + return node; + }); std::move(std::begin(newFileNodes), std::end(newFileNodes), std::back_inserter(toList)); } diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 17737990f08..91b2d25bd2b 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -147,15 +147,15 @@ private: void addProjects(const QHash &cmakeListsNodes, const QList &projects, - QVector &knownHeaderNodes); + QSet &knownHeaders); void addTargets(const QHash &cmakeListsNodes, const QList &targets, - QVector &knownHeaderNodes); + QSet &knownHeaders); void addFileGroups(ProjectExplorer::ProjectNode *targetRoot, const Utils::FilePath &sourceDirectory, const Utils::FilePath &buildDirectory, const QList &fileGroups, - QVector &knowHeaderNodes); + QSet &knownHeaders); std::unique_ptr m_cmakeServer; std::unique_ptr> m_future;