forked from qt-creator/qt-creator
CMake: Use FolderNode::addNestedNodes for unique_ptr in server-mode
Remove FolderNode::addNestedNodes that take raw pointers now that the last user is gone. Change-Id: If2ca3864934d9239ac136e65c0b7dbcea7caf220 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
@@ -258,9 +258,10 @@ CMakeConfig ServerModeReader::takeParsedConfiguration()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority,
|
static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority,
|
||||||
const QString &displayName, const QList<FileNode *> &files)
|
const QString &displayName,
|
||||||
|
std::vector<std::unique_ptr<FileNode>> &&files)
|
||||||
{
|
{
|
||||||
if (files.isEmpty())
|
if (files.size() == 0)
|
||||||
return;
|
return;
|
||||||
FolderNode *folder = base;
|
FolderNode *folder = base;
|
||||||
if (!displayName.isEmpty()) {
|
if (!displayName.isEmpty()) {
|
||||||
@@ -269,28 +270,28 @@ static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, i
|
|||||||
folder = newFolder.get();
|
folder = newFolder.get();
|
||||||
base->addNode(std::move(newFolder));
|
base->addNode(std::move(newFolder));
|
||||||
}
|
}
|
||||||
folder->addNestedNodes(files);
|
folder->addNestedNodes(std::move(files));
|
||||||
for (FolderNode *fn : folder->folderNodes())
|
for (FolderNode *fn : folder->folderNodes())
|
||||||
fn->compress();
|
fn->compress();
|
||||||
}
|
}
|
||||||
|
|
||||||
static QList<FileNode *> removeKnownNodes(const QSet<Utils::FileName> &knownFiles, const QList<FileNode *> &files)
|
static std::vector<std::unique_ptr<FileNode>> &&
|
||||||
|
removeKnownNodes(const QSet<Utils::FileName> &knownFiles,
|
||||||
|
std::vector<std::unique_ptr<FileNode>> &&files)
|
||||||
{
|
{
|
||||||
return Utils::filtered(files, [&knownFiles](const FileNode *n) {
|
std::remove_if(std::begin(files), std::end(files),
|
||||||
if (knownFiles.contains(n->filePath())) {
|
[&knownFiles](const std::unique_ptr<FileNode> &n) {
|
||||||
delete n;
|
return knownFiles.contains(n->filePath());
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
|
return std::move(files);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addCMakeInputs(FolderNode *root,
|
static void addCMakeInputs(FolderNode *root,
|
||||||
const Utils::FileName &sourceDir,
|
const Utils::FileName &sourceDir,
|
||||||
const Utils::FileName &buildDir,
|
const Utils::FileName &buildDir,
|
||||||
QList<FileNode *> &sourceInputs,
|
std::vector<std::unique_ptr<FileNode>> &&sourceInputs,
|
||||||
QList<FileNode *> &buildInputs,
|
std::vector<std::unique_ptr<FileNode>> &&buildInputs,
|
||||||
QList<FileNode *> &rootInputs)
|
std::vector<std::unique_ptr<FileNode>> &&rootInputs)
|
||||||
{
|
{
|
||||||
std::unique_ptr<ProjectNode> cmakeVFolder = std::make_unique<CMakeInputsNode>(root->filePath());
|
std::unique_ptr<ProjectNode> cmakeVFolder = std::make_unique<CMakeInputsNode>(root->filePath());
|
||||||
|
|
||||||
@@ -300,13 +301,13 @@ static void addCMakeInputs(FolderNode *root,
|
|||||||
knownFiles.insert(n->filePath());
|
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,
|
addCMakeVFolder(cmakeVFolder.get(), buildDir, 100,
|
||||||
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Build Directory>"),
|
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Build Directory>"),
|
||||||
removeKnownNodes(knownFiles, buildInputs));
|
removeKnownNodes(knownFiles, std::move(buildInputs)));
|
||||||
addCMakeVFolder(cmakeVFolder.get(), Utils::FileName(), 10,
|
addCMakeVFolder(cmakeVFolder.get(), Utils::FileName(), 10,
|
||||||
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Other Locations>"),
|
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Other Locations>"),
|
||||||
removeKnownNodes(knownFiles, rootInputs));
|
removeKnownNodes(knownFiles, std::move(rootInputs)));
|
||||||
|
|
||||||
root->addNode(std::move(cmakeVFolder));
|
root->addNode(std::move(cmakeVFolder));
|
||||||
}
|
}
|
||||||
@@ -315,21 +316,21 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root,
|
|||||||
const QList<const FileNode *> &allFiles)
|
const QList<const FileNode *> &allFiles)
|
||||||
{
|
{
|
||||||
// Split up cmake inputs into useful chunks:
|
// Split up cmake inputs into useful chunks:
|
||||||
QList<FileNode *> cmakeFilesSource;
|
std::vector<std::unique_ptr<FileNode>> cmakeFilesSource;
|
||||||
QList<FileNode *> cmakeFilesBuild;
|
std::vector<std::unique_ptr<FileNode>> cmakeFilesBuild;
|
||||||
QList<FileNode *> cmakeFilesOther;
|
std::vector<std::unique_ptr<FileNode>> cmakeFilesOther;
|
||||||
QList<FileNode *> cmakeLists;
|
std::vector<std::unique_ptr<FileNode>> cmakeLists;
|
||||||
|
|
||||||
foreach (FileNode *fn, m_cmakeInputsFileNodes) {
|
for (std::unique_ptr<FileNode> &fn : m_cmakeInputsFileNodes) {
|
||||||
const FileName path = fn->filePath();
|
const FileName path = fn->filePath();
|
||||||
if (path.fileName().compare("CMakeLists.txt", HostOsInfo::fileNameCaseSensitivity()) == 0)
|
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))
|
else if (path.isChildOf(m_parameters.workDirectory))
|
||||||
cmakeFilesBuild.append(fn);
|
cmakeFilesBuild.emplace_back(std::move(fn));
|
||||||
else if (path.isChildOf(m_parameters.sourceDirectory))
|
else if (path.isChildOf(m_parameters.sourceDirectory))
|
||||||
cmakeFilesSource.append(fn);
|
cmakeFilesSource.emplace_back(std::move(fn));
|
||||||
else
|
else
|
||||||
cmakeFilesOther.append(fn);
|
cmakeFilesOther.emplace_back(std::move(fn));
|
||||||
}
|
}
|
||||||
m_cmakeInputsFileNodes.clear(); // Clean out, they are not going to be used anymore!
|
m_cmakeInputsFileNodes.clear(); // Clean out, they are not going to be used anymore!
|
||||||
|
|
||||||
@@ -339,15 +340,17 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root,
|
|||||||
if (topLevel)
|
if (topLevel)
|
||||||
root->setDisplayName(topLevel->name);
|
root->setDisplayName(topLevel->name);
|
||||||
|
|
||||||
QHash<Utils::FileName, ProjectNode *> cmakeListsNodes = addCMakeLists(root, cmakeLists);
|
QHash<Utils::FileName, ProjectNode *> cmakeListsNodes
|
||||||
|
= addCMakeLists(root, std::move(cmakeLists));
|
||||||
QList<FileNode *> knownHeaders;
|
QList<FileNode *> knownHeaders;
|
||||||
addProjects(cmakeListsNodes, m_projects, knownHeaders);
|
addProjects(cmakeListsNodes, m_projects, knownHeaders);
|
||||||
|
|
||||||
addHeaderNodes(root, knownHeaders, allFiles);
|
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,
|
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)
|
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"))) {
|
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
|
// 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.
|
// 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<FileNode>(sfn, FileType::Project, isTemporary));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -720,14 +724,17 @@ void ServerModeReader::fixTarget(ServerModeReader::Target *target) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
QHash<Utils::FileName, ProjectNode *>
|
QHash<Utils::FileName, ProjectNode *>
|
||||||
ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList<FileNode *> &cmakeLists)
|
ServerModeReader::addCMakeLists(CMakeProjectNode *root,
|
||||||
|
std::vector<std::unique_ptr<FileNode>> &&cmakeLists)
|
||||||
{
|
{
|
||||||
QHash<Utils::FileName, ProjectNode *> cmakeListsNodes;
|
QHash<Utils::FileName, ProjectNode *> cmakeListsNodes;
|
||||||
cmakeListsNodes.insert(root->filePath(), root);
|
cmakeListsNodes.insert(root->filePath(), root);
|
||||||
|
|
||||||
const QSet<Utils::FileName> cmakeDirs
|
const QSet<Utils::FileName> cmakeDirs
|
||||||
= Utils::transform<QSet>(cmakeLists, [](const Node *n) { return n->filePath().parentDir(); });
|
= Utils::transform<QSet>(cmakeLists, [](const std::unique_ptr<FileNode> &n) {
|
||||||
root->addNestedNodes(cmakeLists, Utils::FileName(),
|
return n->filePath().parentDir();
|
||||||
|
});
|
||||||
|
root->addNestedNodes(std::move(cmakeLists), Utils::FileName(),
|
||||||
[&cmakeDirs, &cmakeListsNodes](const Utils::FileName &fp)
|
[&cmakeDirs, &cmakeListsNodes](const Utils::FileName &fp)
|
||||||
-> std::unique_ptr<ProjectExplorer::FolderNode> {
|
-> std::unique_ptr<ProjectExplorer::FolderNode> {
|
||||||
if (cmakeDirs.contains(fp)) {
|
if (cmakeDirs.contains(fp)) {
|
||||||
@@ -840,7 +847,7 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot,
|
|||||||
const QList<ServerModeReader::FileGroup *> &fileGroups,
|
const QList<ServerModeReader::FileGroup *> &fileGroups,
|
||||||
QList<FileNode *> &knownHeaderNodes)
|
QList<FileNode *> &knownHeaderNodes)
|
||||||
{
|
{
|
||||||
QList<FileNode *> toList;
|
std::vector<std::unique_ptr<FileNode>> toList;
|
||||||
QSet<Utils::FileName> alreadyListed;
|
QSet<Utils::FileName> alreadyListed;
|
||||||
// Files already added by other configurations:
|
// Files already added by other configurations:
|
||||||
targetRoot->forEachGenericNode([&alreadyListed](const Node *n) {
|
targetRoot->forEachGenericNode([&alreadyListed](const Node *n) {
|
||||||
@@ -853,33 +860,35 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot,
|
|||||||
alreadyListed.insert(fn);
|
alreadyListed.insert(fn);
|
||||||
return count != alreadyListed.count();
|
return count != alreadyListed.count();
|
||||||
});
|
});
|
||||||
const QList<FileNode *> newFileNodes
|
std::vector<std::unique_ptr<FileNode>> newFileNodes
|
||||||
= Utils::transform(newSources, [f, &knownHeaderNodes](const Utils::FileName &fn) {
|
= Utils::transform<std::vector>(newSources,
|
||||||
auto node = new FileNode(fn, Node::fileTypeForFileName(fn), f->isGenerated);
|
[f, &knownHeaderNodes](const Utils::FileName &fn) {
|
||||||
|
auto node
|
||||||
|
= std::make_unique<FileNode>(fn, Node::fileTypeForFileName(fn), f->isGenerated);
|
||||||
if (node->fileType() == FileType::Header)
|
if (node->fileType() == FileType::Header)
|
||||||
knownHeaderNodes.append(node);
|
knownHeaderNodes.append(node.get());
|
||||||
return node;
|
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):
|
// Split up files in groups (based on location):
|
||||||
const bool inSourceBuild = (m_parameters.workDirectory == m_parameters.sourceDirectory);
|
const bool inSourceBuild = (m_parameters.workDirectory == m_parameters.sourceDirectory);
|
||||||
QList<FileNode *> sourceFileNodes;
|
std::vector<std::unique_ptr<FileNode>> sourceFileNodes;
|
||||||
QList<FileNode *> buildFileNodes;
|
std::vector<std::unique_ptr<FileNode>> buildFileNodes;
|
||||||
QList<FileNode *> otherFileNodes;
|
std::vector<std::unique_ptr<FileNode>> otherFileNodes;
|
||||||
foreach (FileNode *fn, toList) {
|
for (std::unique_ptr<FileNode> &fn : toList) {
|
||||||
if (fn->filePath().isChildOf(m_parameters.workDirectory) && !inSourceBuild)
|
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))
|
else if (fn->filePath().isChildOf(m_parameters.sourceDirectory))
|
||||||
sourceFileNodes.append(fn);
|
sourceFileNodes.emplace_back(std::move(fn));
|
||||||
else
|
else
|
||||||
otherFileNodes.append(fn);
|
otherFileNodes.emplace_back(std::move(fn));
|
||||||
}
|
}
|
||||||
|
|
||||||
addCMakeVFolder(targetRoot, sourceDirectory, 1000, QString(), sourceFileNodes);
|
addCMakeVFolder(targetRoot, sourceDirectory, 1000, QString(), std::move(sourceFileNodes));
|
||||||
addCMakeVFolder(targetRoot, buildDirectory, 100, tr("<Build Directory>"), buildFileNodes);
|
addCMakeVFolder(targetRoot, buildDirectory, 100, tr("<Build Directory>"), std::move(buildFileNodes));
|
||||||
addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr("<Other Locations>"), otherFileNodes);
|
addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr("<Other Locations>"), std::move(otherFileNodes));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerModeReader::addHeaderNodes(ProjectNode *root, const QList<FileNode *> knownHeaders,
|
void ServerModeReader::addHeaderNodes(ProjectNode *root, const QList<FileNode *> knownHeaders,
|
||||||
@@ -888,8 +897,10 @@ void ServerModeReader::addHeaderNodes(ProjectNode *root, const QList<FileNode *>
|
|||||||
if (root->isEmpty())
|
if (root->isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
static QIcon headerNodeIcon = Core::FileIconProvider::directoryIcon(ProjectExplorer::Constants::FILEOVERLAY_H);
|
static QIcon headerNodeIcon
|
||||||
auto headerNode = std::make_unique<VirtualFolderNode>(root->filePath(), Node::DefaultPriority - 5);
|
= Core::FileIconProvider::directoryIcon(ProjectExplorer::Constants::FILEOVERLAY_H);
|
||||||
|
auto headerNode
|
||||||
|
= std::make_unique<VirtualFolderNode>(root->filePath(), Node::DefaultPriority - 5);
|
||||||
headerNode->setDisplayName(tr("<Headers>"));
|
headerNode->setDisplayName(tr("<Headers>"));
|
||||||
headerNode->setIcon(headerNodeIcon);
|
headerNode->setIcon(headerNodeIcon);
|
||||||
|
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ private:
|
|||||||
void fixTarget(Target *target) const;
|
void fixTarget(Target *target) const;
|
||||||
|
|
||||||
QHash<Utils::FileName, ProjectExplorer::ProjectNode *>
|
QHash<Utils::FileName, ProjectExplorer::ProjectNode *>
|
||||||
addCMakeLists(CMakeProjectNode *root, const QList<ProjectExplorer::FileNode *> &cmakeLists);
|
addCMakeLists(CMakeProjectNode *root, std::vector<std::unique_ptr<ProjectExplorer::FileNode> > &&cmakeLists);
|
||||||
void addProjects(const QHash<Utils::FileName, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
|
void addProjects(const QHash<Utils::FileName, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
|
||||||
const QList<Project *> &projects,
|
const QList<Project *> &projects,
|
||||||
QList<ProjectExplorer::FileNode *> &knownHeaderNodes);
|
QList<ProjectExplorer::FileNode *> &knownHeaderNodes);
|
||||||
@@ -169,7 +169,7 @@ private:
|
|||||||
CMakeConfig m_cmakeConfiguration;
|
CMakeConfig m_cmakeConfiguration;
|
||||||
|
|
||||||
QSet<Utils::FileName> m_cmakeFiles;
|
QSet<Utils::FileName> m_cmakeFiles;
|
||||||
QList<ProjectExplorer::FileNode *> m_cmakeInputsFileNodes;
|
std::vector<std::unique_ptr<ProjectExplorer::FileNode>> m_cmakeInputsFileNodes;
|
||||||
|
|
||||||
QList<Project *> m_projects;
|
QList<Project *> m_projects;
|
||||||
QList<Target *> m_targets;
|
QList<Target *> m_targets;
|
||||||
|
|||||||
@@ -557,13 +557,6 @@ void FolderNode::addNestedNode(std::unique_ptr<FileNode> &&fileNode,
|
|||||||
folder->addNode(std::move(fileNode));
|
folder->addNode(std::move(fileNode));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FolderNode::addNestedNodes(const QList<FileNode *> &files, const Utils::FileName &overrideBaseDir,
|
|
||||||
const FolderNodeFactory &factory)
|
|
||||||
{
|
|
||||||
for (FileNode *fileNode : files)
|
|
||||||
addNestedNode(std::unique_ptr<FileNode>(fileNode), overrideBaseDir, factory);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FolderNode::addNestedNodes(std::vector<std::unique_ptr<FileNode> > &&files,
|
void FolderNode::addNestedNodes(std::vector<std::unique_ptr<FileNode> > &&files,
|
||||||
const Utils::FileName &overrideBaseDir,
|
const Utils::FileName &overrideBaseDir,
|
||||||
const FolderNode::FolderNodeFactory &factory)
|
const FolderNode::FolderNodeFactory &factory)
|
||||||
|
|||||||
@@ -223,10 +223,6 @@ public:
|
|||||||
FileNode *fileNode(const Utils::FileName &file) const;
|
FileNode *fileNode(const Utils::FileName &file) const;
|
||||||
QList<FolderNode *> folderNodes() const;
|
QList<FolderNode *> folderNodes() const;
|
||||||
using FolderNodeFactory = std::function<std::unique_ptr<FolderNode>(const Utils::FileName &)>;
|
using FolderNodeFactory = std::function<std::unique_ptr<FolderNode>(const Utils::FileName &)>;
|
||||||
void addNestedNodes(const QList<FileNode *> &files,
|
|
||||||
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,
|
void addNestedNodes(std::vector<std::unique_ptr<FileNode>> &&files,
|
||||||
const Utils::FileName &overrideBaseDir = Utils::FileName(),
|
const Utils::FileName &overrideBaseDir = Utils::FileName(),
|
||||||
const FolderNodeFactory &factory
|
const FolderNodeFactory &factory
|
||||||
|
|||||||
Reference in New Issue
Block a user