forked from qt-creator/qt-creator
ProjectExplorer: Add FolderNode::addNestedNodes taking unique_ptrs
Use that in CMake's tealeafreader. Change-Id: Id1c372b083df380d0d930668cf7eec4ee89060c2 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user