diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 64f74b38e1a..8432551696b 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -258,9 +258,10 @@ CMakeConfig ServerModeReader::takeParsedConfiguration() } static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, - const QString &displayName, const QList &files) + const QString &displayName, + std::vector> &&files) { - if (files.isEmpty()) + if (files.size() == 0) return; FolderNode *folder = base; if (!displayName.isEmpty()) { @@ -269,28 +270,28 @@ static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, i folder = newFolder.get(); base->addNode(std::move(newFolder)); } - folder->addNestedNodes(files); + folder->addNestedNodes(std::move(files)); for (FolderNode *fn : folder->folderNodes()) fn->compress(); } -static QList removeKnownNodes(const QSet &knownFiles, const QList &files) +static std::vector> && +removeKnownNodes(const QSet &knownFiles, + std::vector> &&files) { - return Utils::filtered(files, [&knownFiles](const FileNode *n) { - if (knownFiles.contains(n->filePath())) { - delete n; - return false; - } - return true; + std::remove_if(std::begin(files), std::end(files), + [&knownFiles](const std::unique_ptr &n) { + return knownFiles.contains(n->filePath()); }); + return std::move(files); } static void addCMakeInputs(FolderNode *root, const Utils::FileName &sourceDir, const Utils::FileName &buildDir, - QList &sourceInputs, - QList &buildInputs, - QList &rootInputs) + std::vector> &&sourceInputs, + std::vector> &&buildInputs, + std::vector> &&rootInputs) { std::unique_ptr cmakeVFolder = std::make_unique(root->filePath()); @@ -300,13 +301,13 @@ static void addCMakeInputs(FolderNode *root, knownFiles.insert(n->filePath()); }); - addCMakeVFolder(cmakeVFolder.get(), sourceDir, 1000, QString(), removeKnownNodes(knownFiles, sourceInputs)); + addCMakeVFolder(cmakeVFolder.get(), sourceDir, 1000, QString(), removeKnownNodes(knownFiles, std::move(sourceInputs))); addCMakeVFolder(cmakeVFolder.get(), buildDir, 100, QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), - removeKnownNodes(knownFiles, buildInputs)); + removeKnownNodes(knownFiles, std::move(buildInputs))); addCMakeVFolder(cmakeVFolder.get(), Utils::FileName(), 10, QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", ""), - removeKnownNodes(knownFiles, rootInputs)); + removeKnownNodes(knownFiles, std::move(rootInputs))); root->addNode(std::move(cmakeVFolder)); } @@ -315,21 +316,21 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root, const QList &allFiles) { // Split up cmake inputs into useful chunks: - QList cmakeFilesSource; - QList cmakeFilesBuild; - QList cmakeFilesOther; - QList cmakeLists; + std::vector> cmakeFilesSource; + std::vector> cmakeFilesBuild; + std::vector> cmakeFilesOther; + std::vector> cmakeLists; - foreach (FileNode *fn, m_cmakeInputsFileNodes) { + for (std::unique_ptr &fn : m_cmakeInputsFileNodes) { const FileName path = fn->filePath(); if (path.fileName().compare("CMakeLists.txt", HostOsInfo::fileNameCaseSensitivity()) == 0) - cmakeLists.append(fn); + cmakeLists.emplace_back(std::move(fn)); else if (path.isChildOf(m_parameters.workDirectory)) - cmakeFilesBuild.append(fn); + cmakeFilesBuild.emplace_back(std::move(fn)); else if (path.isChildOf(m_parameters.sourceDirectory)) - cmakeFilesSource.append(fn); + cmakeFilesSource.emplace_back(std::move(fn)); else - cmakeFilesOther.append(fn); + cmakeFilesOther.emplace_back(std::move(fn)); } m_cmakeInputsFileNodes.clear(); // Clean out, they are not going to be used anymore! @@ -339,15 +340,17 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root, if (topLevel) root->setDisplayName(topLevel->name); - QHash cmakeListsNodes = addCMakeLists(root, cmakeLists); + QHash cmakeListsNodes + = addCMakeLists(root, std::move(cmakeLists)); QList knownHeaders; addProjects(cmakeListsNodes, m_projects, knownHeaders); addHeaderNodes(root, knownHeaders, allFiles); - if (!cmakeFilesSource.isEmpty() || !cmakeFilesBuild.isEmpty() || !cmakeFilesOther.isEmpty()) + if (cmakeFilesSource.size() > 0 || cmakeFilesBuild.size() > 0 || cmakeFilesOther.size() > 0) addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.workDirectory, - cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); + std::move(cmakeFilesSource), std::move(cmakeFilesBuild), + std::move(cmakeFilesOther)); } void ServerModeReader::updateCodeModel(CppTools::RawProjectParts &rpps) @@ -651,7 +654,8 @@ void ServerModeReader::extractCMakeInputsData(const QVariantMap &data) if (oldCount < m_cmakeFiles.count() && (!isCMake || sfn.toString().endsWith("/CMakeLists.txt"))) { // Always include CMakeLists.txt files, even when cmake things these are part of its // stuff. This unbreaks cmake binaries running from their own build directory. - m_cmakeInputsFileNodes.append(new FileNode(sfn, FileType::Project, isTemporary)); + m_cmakeInputsFileNodes.emplace_back( + std::make_unique(sfn, FileType::Project, isTemporary)); } } } @@ -720,14 +724,17 @@ void ServerModeReader::fixTarget(ServerModeReader::Target *target) const } QHash -ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists) +ServerModeReader::addCMakeLists(CMakeProjectNode *root, + std::vector> &&cmakeLists) { QHash cmakeListsNodes; cmakeListsNodes.insert(root->filePath(), root); const QSet cmakeDirs - = Utils::transform(cmakeLists, [](const Node *n) { return n->filePath().parentDir(); }); - root->addNestedNodes(cmakeLists, Utils::FileName(), + = Utils::transform(cmakeLists, [](const std::unique_ptr &n) { + return n->filePath().parentDir(); + }); + root->addNestedNodes(std::move(cmakeLists), Utils::FileName(), [&cmakeDirs, &cmakeListsNodes](const Utils::FileName &fp) -> std::unique_ptr { if (cmakeDirs.contains(fp)) { @@ -840,7 +847,7 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, const QList &fileGroups, QList &knownHeaderNodes) { - QList toList; + std::vector> toList; QSet alreadyListed; // Files already added by other configurations: targetRoot->forEachGenericNode([&alreadyListed](const Node *n) { @@ -853,33 +860,35 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, alreadyListed.insert(fn); return count != alreadyListed.count(); }); - const QList newFileNodes - = Utils::transform(newSources, [f, &knownHeaderNodes](const Utils::FileName &fn) { - auto node = new FileNode(fn, Node::fileTypeForFileName(fn), f->isGenerated); + std::vector> newFileNodes + = Utils::transform(newSources, + [f, &knownHeaderNodes](const Utils::FileName &fn) { + auto node + = std::make_unique(fn, Node::fileTypeForFileName(fn), f->isGenerated); if (node->fileType() == FileType::Header) - knownHeaderNodes.append(node); + knownHeaderNodes.append(node.get()); return node; }); - toList.append(newFileNodes); + std::move(std::begin(newFileNodes), std::end(newFileNodes), std::back_inserter(toList)); } // Split up files in groups (based on location): const bool inSourceBuild = (m_parameters.workDirectory == m_parameters.sourceDirectory); - QList sourceFileNodes; - QList buildFileNodes; - QList otherFileNodes; - foreach (FileNode *fn, toList) { + std::vector> sourceFileNodes; + std::vector> buildFileNodes; + std::vector> otherFileNodes; + for (std::unique_ptr &fn : toList) { if (fn->filePath().isChildOf(m_parameters.workDirectory) && !inSourceBuild) - buildFileNodes.append(fn); + buildFileNodes.emplace_back(std::move(fn)); else if (fn->filePath().isChildOf(m_parameters.sourceDirectory)) - sourceFileNodes.append(fn); + sourceFileNodes.emplace_back(std::move(fn)); else - otherFileNodes.append(fn); + otherFileNodes.emplace_back(std::move(fn)); } - addCMakeVFolder(targetRoot, sourceDirectory, 1000, QString(), sourceFileNodes); - addCMakeVFolder(targetRoot, buildDirectory, 100, tr(""), buildFileNodes); - addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr(""), otherFileNodes); + addCMakeVFolder(targetRoot, sourceDirectory, 1000, QString(), std::move(sourceFileNodes)); + addCMakeVFolder(targetRoot, buildDirectory, 100, tr(""), std::move(buildFileNodes)); + addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr(""), std::move(otherFileNodes)); } void ServerModeReader::addHeaderNodes(ProjectNode *root, const QList knownHeaders, @@ -888,8 +897,10 @@ void ServerModeReader::addHeaderNodes(ProjectNode *root, const QList if (root->isEmpty()) return; - static QIcon headerNodeIcon = Core::FileIconProvider::directoryIcon(ProjectExplorer::Constants::FILEOVERLAY_H); - auto headerNode = std::make_unique(root->filePath(), Node::DefaultPriority - 5); + static QIcon headerNodeIcon + = Core::FileIconProvider::directoryIcon(ProjectExplorer::Constants::FILEOVERLAY_H); + auto headerNode + = std::make_unique(root->filePath(), Node::DefaultPriority - 5); headerNode->setDisplayName(tr("")); headerNode->setIcon(headerNodeIcon); diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index bfde93ca1c9..35515fb139d 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -144,7 +144,7 @@ private: void fixTarget(Target *target) const; QHash - addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists); + addCMakeLists(CMakeProjectNode *root, std::vector > &&cmakeLists); void addProjects(const QHash &cmakeListsNodes, const QList &projects, QList &knownHeaderNodes); @@ -169,7 +169,7 @@ private: CMakeConfig m_cmakeConfiguration; QSet m_cmakeFiles; - QList m_cmakeInputsFileNodes; + std::vector> m_cmakeInputsFileNodes; QList m_projects; QList m_targets; diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 7702a83ecb5..6284c33d058 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -557,13 +557,6 @@ void FolderNode::addNestedNode(std::unique_ptr &&fileNode, folder->addNode(std::move(fileNode)); } -void FolderNode::addNestedNodes(const QList &files, const Utils::FileName &overrideBaseDir, - const FolderNodeFactory &factory) -{ - for (FileNode *fileNode : files) - addNestedNode(std::unique_ptr(fileNode), overrideBaseDir, factory); -} - void FolderNode::addNestedNodes(std::vector > &&files, const Utils::FileName &overrideBaseDir, const FolderNode::FolderNodeFactory &factory) diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 3a6fd472cc3..459a9e73856 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -223,10 +223,6 @@ public: FileNode *fileNode(const Utils::FileName &file) const; QList folderNodes() const; using FolderNodeFactory = std::function(const Utils::FileName &)>; - void addNestedNodes(const QList &files, - const Utils::FileName &overrideBaseDir = Utils::FileName(), - const FolderNodeFactory &factory - = [](const Utils::FileName &fn) {return std::make_unique(fn); }); void addNestedNodes(std::vector> &&files, const Utils::FileName &overrideBaseDir = Utils::FileName(), const FolderNodeFactory &factory