aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorTobias Hunger <[email protected]>2018-04-26 16:39:15 +0200
committerTobias Hunger <[email protected]>2018-05-04 09:02:56 +0000
commitbdd2dd371ecd6d6b61f913050f3d1dd130846caa (patch)
tree226959dc8f3d70cb93d939a775514a599c103205 /src/plugins
parent1a2376856343b6ea535af37050deb1b6ff7b052f (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.cpp32
-rw-r--r--src/plugins/cmakeprojectmanager/cmakecbpparser.h10
-rw-r--r--src/plugins/cmakeprojectmanager/tealeafreader.cpp31
-rw-r--r--src/plugins/cmakeprojectmanager/tealeafreader.h2
-rw-r--r--src/plugins/projectexplorer/project.cpp10
-rw-r--r--src/plugins/projectexplorer/projectnodes.cpp8
-rw-r--r--src/plugins/projectexplorer/projectnodes.h4
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