diff options
author | Tobias Hunger <[email protected]> | 2018-04-26 16:39:15 +0200 |
---|---|---|
committer | Tobias Hunger <[email protected]> | 2018-05-04 09:02:56 +0000 |
commit | bdd2dd371ecd6d6b61f913050f3d1dd130846caa (patch) | |
tree | 226959dc8f3d70cb93d939a775514a599c103205 /src/plugins | |
parent | 1a2376856343b6ea535af37050deb1b6ff7b052f (diff) |
ProjectExplorer: Add FolderNode::addNestedNodes taking unique_ptrs
Use that in CMake's tealeafreader.
Change-Id: Id1c372b083df380d0d930668cf7eec4ee89060c2
Reviewed-by: Ulf Hermann <[email protected]>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakecbpparser.cpp | 32 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakecbpparser.h | 10 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/tealeafreader.cpp | 31 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/tealeafreader.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/project.cpp | 10 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectnodes.cpp | 8 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectnodes.h | 4 |
7 files changed, 56 insertions, 41 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakecbpparser.cpp b/src/plugins/cmakeprojectmanager/cmakecbpparser.cpp index 96cf7d138df..2f14ac45df9 100644 --- a/src/plugins/cmakeprojectmanager/cmakecbpparser.cpp +++ b/src/plugins/cmakeprojectmanager/cmakecbpparser.cpp @@ -61,11 +61,11 @@ int distance(const FileName &targetDirectory, const FileName &fileName) void CMakeCbpParser::sortFiles() { QLoggingCategory log("qtc.cmakeprojectmanager.filetargetmapping"); - FileNameList fileNames = transform(m_fileList, &FileNode::filePath); + FileNameList fileNames = transform<QList>(m_fileList, &FileNode::filePath); sort(fileNames); - CMakeBuildTarget *last = 0; + CMakeBuildTarget *last = nullptr; FileName parentDirectory; qCDebug(log) << "###############"; @@ -428,7 +428,8 @@ void CMakeCbpParser::parseUnit() if (!fileName.endsWith(".rule") && !m_processedUnits.contains(fileName)) { // Now check whether we found a virtual element beneath if (m_parsingCMakeUnit) { - m_cmakeFileList.append( new FileNode(fileName, FileType::Project, false)); + m_cmakeFileList.emplace_back( + std::make_unique<FileNode>(fileName, FileType::Project, false)); } else { bool generated = false; QString onlyFileName = fileName.fileName(); @@ -437,10 +438,15 @@ void CMakeCbpParser::parseUnit() || (onlyFileName.startsWith("qrc_") && onlyFileName.endsWith(".cxx"))) generated = true; - if (fileName.endsWith(".qrc")) - m_fileList.append( new FileNode(fileName, FileType::Resource, generated)); - else - m_fileList.append( new FileNode(fileName, FileType::Source, generated)); + if (fileName.endsWith(".qrc")) { + m_fileList.emplace_back( + std::make_unique<FileNode>(fileName, FileType::Resource, + generated)); + } else { + m_fileList.emplace_back( + std::make_unique<FileNode>(fileName, FileType::Source, + generated)); + } } m_unitTargetMap.insert(fileName, m_unitTargets); m_processedUnits.insert(fileName); @@ -488,19 +494,9 @@ void CMakeCbpParser::parseUnknownElement() } } -QList<FileNode *> CMakeCbpParser::fileList() -{ - return m_fileList; -} - -QList<FileNode *> CMakeCbpParser::cmakeFileList() -{ - return m_cmakeFileList; -} - bool CMakeCbpParser::hasCMakeFiles() { - return !m_cmakeFileList.isEmpty(); + return m_cmakeFileList.size() > 0; } QList<CMakeBuildTarget> CMakeCbpParser::buildTargets() diff --git a/src/plugins/cmakeprojectmanager/cmakecbpparser.h b/src/plugins/cmakeprojectmanager/cmakecbpparser.h index d1f5cf9569f..44da473bcf8 100644 --- a/src/plugins/cmakeprojectmanager/cmakecbpparser.h +++ b/src/plugins/cmakeprojectmanager/cmakecbpparser.h @@ -48,8 +48,10 @@ class CMakeCbpParser : public QXmlStreamReader public: bool parseCbpFile(CMakeTool::PathMapper mapper, const Utils::FileName &fileName, const Utils::FileName &sourceDirectory); - QList<ProjectExplorer::FileNode *> fileList(); - QList<ProjectExplorer::FileNode *> cmakeFileList(); + std::vector<std::unique_ptr<ProjectExplorer::FileNode>> && + takeFileList() { return std::move(m_fileList); } + std::vector<std::unique_ptr<ProjectExplorer::FileNode>> && + takeCmakeFileList() { return std::move(m_cmakeFileList); } QList<CMakeBuildTarget> buildTargets(); QString projectName() const; QString compilerName() const; @@ -74,8 +76,8 @@ private: QMap<Utils::FileName, QStringList> m_unitTargetMap; CMakeTool::PathMapper m_pathMapper; - QList<ProjectExplorer::FileNode *> m_fileList; - QList<ProjectExplorer::FileNode *> m_cmakeFileList; + std::vector<std::unique_ptr<ProjectExplorer::FileNode>> m_fileList; + std::vector<std::unique_ptr<ProjectExplorer::FileNode>> m_cmakeFileList; QSet<Utils::FileName> m_processedUnits; bool m_parsingCMakeUnit = false; diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index abdcd2a4ef8..8783b9e8848 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -166,7 +166,6 @@ void TeaLeafReader::resetData() m_projectName.clear(); m_buildTargets.clear(); - qDeleteAll(m_files); m_files.clear(); } @@ -265,7 +264,7 @@ CMakeConfig TeaLeafReader::takeParsedConfiguration() void TeaLeafReader::generateProjectTree(CMakeProjectNode *root, const QList<const FileNode *> &allFiles) { - if (m_files.isEmpty()) + if (m_files.size() == 0) return; root->setDisplayName(m_projectName); @@ -312,18 +311,20 @@ void TeaLeafReader::generateProjectTree(CMakeProjectNode *root, const QList<cons }); // filter duplicates: - auto alreadySeen = QSet<FileName>::fromList(Utils::transform(m_files, &FileNode::filePath)); + auto alreadySeen = Utils::transform<QSet>(m_files, &FileNode::filePath); const QList<const FileNode *> unseenMissingHeaders = Utils::filtered(missingHeaders, [&alreadySeen](const FileNode *fn) { const int count = alreadySeen.count(); alreadySeen.insert(fn->filePath()); return (alreadySeen.count() != count); }); - const QList<FileNode *> fileNodes = m_files - + Utils::transform(unseenMissingHeaders, [](const FileNode *fn) { return fn->clone(); }); + root->addNestedNodes(std::move(m_files), m_parameters.sourceDirectory); - root->addNestedNodes(fileNodes, m_parameters.sourceDirectory); - m_files.clear(); // Some of the FileNodes in files() were deleted! + std::vector<std::unique_ptr<FileNode>> fileNodes + = transform<std::vector>(unseenMissingHeaders, [](const FileNode *fn) { + return std::unique_ptr<FileNode>(fn->clone()); + }); + root->addNestedNodes(std::move(fileNodes), m_parameters.sourceDirectory); } static void processCMakeIncludes(const CMakeBuildTarget &cbt, const ToolChain *tc, @@ -417,7 +418,7 @@ void TeaLeafReader::extractData() resetData(); m_projectName = m_parameters.projectName; - m_files.append(new FileNode(topCMake, FileType::Project, false)); + m_files.emplace_back(std::make_unique<FileNode>(topCMake, FileType::Project, false)); // Do not insert topCMake into m_cmakeFiles: The project already watches that! // Find cbp file @@ -440,16 +441,20 @@ void TeaLeafReader::extractData() m_projectName = cbpparser.projectName(); - m_files = cbpparser.fileList(); + m_files = cbpparser.takeFileList(); if (cbpparser.hasCMakeFiles()) { - m_files.append(cbpparser.cmakeFileList()); - foreach (const FileNode *node, cbpparser.cmakeFileList()) + std::vector<std::unique_ptr<FileNode>> cmakeNodes = cbpparser.takeCmakeFileList(); + for (const std::unique_ptr<FileNode> &node : cmakeNodes) m_cmakeFiles.insert(node->filePath()); + + std::move(std::begin(cmakeNodes), std::end(cmakeNodes), std::back_inserter(m_files)); } // Make sure the top cmakelists.txt file is always listed: - if (!contains(m_files, [topCMake](FileNode *fn) { return fn->filePath() == topCMake; })) - m_files.append(new FileNode(topCMake, FileType::Project, false)); + if (!contains(m_files, [topCMake](const std::unique_ptr<FileNode> &fn) { + return fn->filePath() == topCMake; + })) + m_files.emplace_back(std::make_unique<FileNode>(topCMake, FileType::Project, false)); Utils::sort(m_files, &Node::sortByPath); diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.h b/src/plugins/cmakeprojectmanager/tealeafreader.h index 2e699aecf16..df3ec8e59d0 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.h +++ b/src/plugins/cmakeprojectmanager/tealeafreader.h @@ -82,7 +82,7 @@ private: QSet<Utils::FileName> m_cmakeFiles; QString m_projectName; QList<CMakeBuildTarget> m_buildTargets; - QList<ProjectExplorer::FileNode *> m_files; + std::vector<std::unique_ptr<ProjectExplorer::FileNode>> m_files; QSet<Internal::CMakeFile *> m_watchedFiles; // RegExps for function-like macrosses names fixups diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 721b8dc4c7d..e9d5f3f83c0 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -1029,11 +1029,11 @@ void ProjectExplorerPlugin::testProject_parsingFail() std::unique_ptr<ProjectNode> createFileTree(Project *project) { std::unique_ptr<ProjectNode> root = std::make_unique<TestProjectNode>(project->projectDirectory()); - QList<FileNode *> nodes; - nodes.append(new FileNode(TEST_PROJECT_PATH, FileType::Project, false)); - nodes.append(new FileNode(TEST_PROJECT_CPP_FILE, FileType::Source, false)); - nodes.append(new FileNode(TEST_PROJECT_GENERATED_FILE, FileType::Source, true)); - root->addNestedNodes(nodes); + std::vector<std::unique_ptr<FileNode>> nodes; + nodes.emplace_back(std::make_unique<FileNode>(TEST_PROJECT_PATH, FileType::Project, false)); + nodes.emplace_back(std::make_unique<FileNode>(TEST_PROJECT_CPP_FILE, FileType::Source, false)); + nodes.emplace_back(std::make_unique<FileNode>(TEST_PROJECT_GENERATED_FILE, FileType::Source, true)); + root->addNestedNodes(std::move(nodes)); return root; } diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index f6afe790c7c..7702a83ecb5 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -564,6 +564,14 @@ void FolderNode::addNestedNodes(const QList<FileNode *> &files, const Utils::Fil addNestedNode(std::unique_ptr<FileNode>(fileNode), overrideBaseDir, factory); } +void FolderNode::addNestedNodes(std::vector<std::unique_ptr<FileNode> > &&files, + const Utils::FileName &overrideBaseDir, + const FolderNode::FolderNodeFactory &factory) +{ + for (std::unique_ptr<FileNode> &f : files) + addNestedNode(std::move(f), overrideBaseDir, factory); +} + // "Compress" a tree of foldernodes such that foldernodes with exactly one foldernode as a child // are merged into one. This e.g. turns a sequence of FolderNodes "foo" "bar" "baz" into one // FolderNode named "foo/bar/baz", saving a lot of clicks in the Project View to get to the actual diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 9455d23ad1e..3a6fd472cc3 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -227,6 +227,10 @@ public: const Utils::FileName &overrideBaseDir = Utils::FileName(), const FolderNodeFactory &factory = [](const Utils::FileName &fn) {return std::make_unique<FolderNode>(fn); }); + void addNestedNodes(std::vector<std::unique_ptr<FileNode>> &&files, + const Utils::FileName &overrideBaseDir = Utils::FileName(), + const FolderNodeFactory &factory + = [](const Utils::FileName &fn) { return std::make_unique<FolderNode>(fn); }); void addNestedNode(std::unique_ptr<FileNode> &&fileNode, const Utils::FileName &overrideBaseDir = Utils::FileName(), const FolderNodeFactory &factory |