forked from qt-creator/qt-creator
Avoid creation of temporary lists of ProjectNodes
Change-Id: Iac84f7f95291fb3b12a071a066d358aaab309c52 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -497,11 +497,8 @@ FolderNode *createSourceGroupNode(const QString &sourceGroupName,
|
|||||||
const QStringList parts = sourceGroupName.split("\\");
|
const QStringList parts = sourceGroupName.split("\\");
|
||||||
|
|
||||||
for (const QString &p : parts) {
|
for (const QString &p : parts) {
|
||||||
FolderNode *existingNode = Utils::findOrDefault(currentNode->folderNodes(),
|
FolderNode *existingNode = currentNode->findChildFolderNode(
|
||||||
[&p](const FolderNode *fn) {
|
[&p](const FolderNode *fn) { return fn->displayName() == p; });
|
||||||
return fn->displayName() == p;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!existingNode) {
|
if (!existingNode) {
|
||||||
auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p);
|
auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p);
|
||||||
node->setListInProject(false);
|
node->setListInProject(false);
|
||||||
|
@@ -42,8 +42,7 @@ void addCMakeVFolder(FolderNode *base,
|
|||||||
base->addNode(std::move(newFolder));
|
base->addNode(std::move(newFolder));
|
||||||
}
|
}
|
||||||
folder->addNestedNodes(std::move(files));
|
folder->addNestedNodes(std::move(files));
|
||||||
for (FolderNode *fn : folder->folderNodes())
|
folder->forEachFolderNode([] (FolderNode *fn) { fn->compress(); });
|
||||||
fn->compress();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<FileNode>> &&removeKnownNodes(
|
std::vector<std::unique_ptr<FileNode>> &&removeKnownNodes(
|
||||||
|
@@ -223,13 +223,10 @@ FolderNode *addChildFolderNode(FolderNode *parent, const QString &childName)
|
|||||||
|
|
||||||
FolderNode *addOrGetChildFolderNode(FolderNode *parent, const QString &childName)
|
FolderNode *addOrGetChildFolderNode(FolderNode *parent, const QString &childName)
|
||||||
{
|
{
|
||||||
for (FolderNode *folder : parent->folderNodes()) {
|
FolderNode *fn = parent->findChildFolderNode([&](FolderNode *folder) {
|
||||||
if (folder->filePath().fileName() == childName) {
|
return folder->filePath().fileName() == childName;
|
||||||
return folder;
|
});
|
||||||
}
|
return fn ? fn : addChildFolderNode(parent, childName);
|
||||||
}
|
|
||||||
|
|
||||||
return addChildFolderNode(parent, childName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the node for folderPath.
|
// Return the node for folderPath.
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
// TODO implement removing include dependencies that are not longer used
|
// TODO implement removing include dependencies that are not longer used
|
||||||
// TODO refactor add/remove relations between ancestor packages into extra controller class
|
// TODO refactor add/remove relations between ancestor packages into extra controller class
|
||||||
|
|
||||||
|
using namespace ProjectExplorer;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
namespace ModelEditor {
|
namespace ModelEditor {
|
||||||
@@ -217,17 +218,16 @@ QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt:
|
|||||||
void UpdateIncludeDependenciesVisitor::collectElementPaths(const ProjectExplorer::FolderNode *folderNode,
|
void UpdateIncludeDependenciesVisitor::collectElementPaths(const ProjectExplorer::FolderNode *folderNode,
|
||||||
QMultiHash<QString, Node> *filePathsMap)
|
QMultiHash<QString, Node> *filePathsMap)
|
||||||
{
|
{
|
||||||
const QList<ProjectExplorer::FileNode *> fileNodes = folderNode->fileNodes();
|
folderNode->forEachFileNode([&](FileNode *fileNode) {
|
||||||
for (const ProjectExplorer::FileNode *fileNode : fileNodes) {
|
|
||||||
QString elementName = qmt::NameController::convertFileNameToElementName(fileNode->filePath().toString());
|
QString elementName = qmt::NameController::convertFileNameToElementName(fileNode->filePath().toString());
|
||||||
QFileInfo fileInfo = fileNode->filePath().toFileInfo();
|
QFileInfo fileInfo = fileNode->filePath().toFileInfo();
|
||||||
QString nodePath = fileInfo.path();
|
QString nodePath = fileInfo.path();
|
||||||
QStringList elementsPath = qmt::NameController::buildElementsPath(nodePath, false);
|
QStringList elementsPath = qmt::NameController::buildElementsPath(nodePath, false);
|
||||||
filePathsMap->insert(elementName, Node(fileNode->filePath().toString(), elementsPath));
|
filePathsMap->insert(elementName, Node(fileNode->filePath().toString(), elementsPath));
|
||||||
}
|
});
|
||||||
const QList<ProjectExplorer::FolderNode *> subNodes = folderNode->folderNodes();
|
folderNode->forEachFolderNode([&](FolderNode *subNode) {
|
||||||
for (const ProjectExplorer::FolderNode *subNode : subNodes)
|
|
||||||
collectElementPaths(subNode, filePathsMap);
|
collectElementPaths(subNode, filePathsMap);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
qmt::MComponent *UpdateIncludeDependenciesVisitor::findComponentFromFilePath(const QString &filePath)
|
qmt::MComponent *UpdateIncludeDependenciesVisitor::findComponentFromFilePath(const QString &filePath)
|
||||||
|
@@ -34,6 +34,8 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
|
||||||
|
using namespace ProjectExplorer;
|
||||||
|
|
||||||
namespace ModelEditor {
|
namespace ModelEditor {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -447,18 +449,20 @@ QString ModelIndexer::findFirstModel(ProjectExplorer::FolderNode *folderNode,
|
|||||||
{
|
{
|
||||||
if (!mimeType.isValid())
|
if (!mimeType.isValid())
|
||||||
return QString();
|
return QString();
|
||||||
const QList<ProjectExplorer::FileNode *> fileNodes = folderNode->fileNodes();
|
|
||||||
for (const ProjectExplorer::FileNode *fileNode : fileNodes) {
|
const QStringList suffixes = mimeType.suffixes();
|
||||||
if (mimeType.suffixes().contains(fileNode->filePath().completeSuffix()))
|
FileNode *foundFileNode = folderNode->findChildFileNode([&](FileNode *fn) {
|
||||||
return fileNode->filePath().toString();
|
return suffixes.contains(fn->filePath().completeSuffix());
|
||||||
}
|
});
|
||||||
const QList<ProjectExplorer::FolderNode *> subFolderNodes = folderNode->folderNodes();
|
if (foundFileNode)
|
||||||
for (ProjectExplorer::FolderNode *subFolderNode : subFolderNodes) {
|
return foundFileNode->filePath().toString();
|
||||||
QString modelFileName = findFirstModel(subFolderNode, mimeType);
|
|
||||||
if (!modelFileName.isEmpty())
|
QString modelFileName;
|
||||||
|
folderNode->findChildFolderNode([&](FolderNode *fn) {
|
||||||
|
modelFileName = findFirstModel(fn, mimeType);
|
||||||
|
return !modelFileName.isEmpty();
|
||||||
|
});
|
||||||
return modelFileName;
|
return modelFileName;
|
||||||
}
|
|
||||||
return QString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelIndexer::forgetProject(ProjectExplorer::Project *project)
|
void ModelIndexer::forgetProject(ProjectExplorer::Project *project)
|
||||||
|
@@ -326,14 +326,13 @@ FilePath Node::pathOrDirectory(bool dir) const
|
|||||||
FilePath location;
|
FilePath location;
|
||||||
// Virtual Folder case
|
// Virtual Folder case
|
||||||
// If there are files directly below or no subfolders, take the folder path
|
// If there are files directly below or no subfolders, take the folder path
|
||||||
if (!folder->fileNodes().isEmpty() || folder->folderNodes().isEmpty()) {
|
auto Any = [](auto) { return true; };
|
||||||
|
if (folder->findChildFileNode(Any) || !folder->findChildFolderNode(Any)) {
|
||||||
location = m_filePath;
|
location = m_filePath;
|
||||||
} else {
|
} else {
|
||||||
// Otherwise we figure out a commonPath from the subfolders
|
// Otherwise we figure out a commonPath from the subfolders
|
||||||
FilePaths list;
|
FilePaths list;
|
||||||
const QList<FolderNode *> folders = folder->folderNodes();
|
folder->forEachFolderNode([&](FolderNode *f) { list << f->filePath(); });
|
||||||
for (FolderNode *f : folders)
|
|
||||||
list << f->filePath();
|
|
||||||
location = FileUtils::commonPath(list);
|
location = FileUtils::commonPath(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,16 +603,6 @@ const QList<Node *> FolderNode::nodes() const
|
|||||||
return Utils::toRawPointer<QList>(m_nodes);
|
return Utils::toRawPointer<QList>(m_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<FileNode *> FolderNode::fileNodes() const
|
|
||||||
{
|
|
||||||
QList<FileNode *> result;
|
|
||||||
for (const std::unique_ptr<Node> &n : m_nodes) {
|
|
||||||
if (FileNode *fn = n->asFileNode())
|
|
||||||
result.append(fn);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
FileNode *FolderNode::fileNode(const Utils::FilePath &file) const
|
FileNode *FolderNode::fileNode(const Utils::FilePath &file) const
|
||||||
{
|
{
|
||||||
return static_cast<FileNode *>(Utils::findOrDefault(m_nodes,
|
return static_cast<FileNode *>(Utils::findOrDefault(m_nodes,
|
||||||
@@ -623,16 +612,6 @@ FileNode *FolderNode::fileNode(const Utils::FilePath &file) const
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<FolderNode *> FolderNode::folderNodes() const
|
|
||||||
{
|
|
||||||
QList<FolderNode *> result;
|
|
||||||
for (const std::unique_ptr<Node> &n : m_nodes) {
|
|
||||||
if (FolderNode *fn = n->asFolderNode())
|
|
||||||
result.append(fn);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
FolderNode *FolderNode::folderNode(const Utils::FilePath &directory) const
|
FolderNode *FolderNode::folderNode(const Utils::FilePath &directory) const
|
||||||
{
|
{
|
||||||
Node *node = Utils::findOrDefault(m_nodes, [directory](const std::unique_ptr<Node> &n) {
|
Node *node = Utils::findOrDefault(m_nodes, [directory](const std::unique_ptr<Node> &n) {
|
||||||
@@ -705,8 +684,7 @@ void FolderNode::compress()
|
|||||||
|
|
||||||
compress();
|
compress();
|
||||||
} else {
|
} else {
|
||||||
for (FolderNode *fn : folderNodes())
|
forEachFolderNode([&](FolderNode *fn) { fn->compress(); });
|
||||||
fn->compress();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -236,9 +236,7 @@ public:
|
|||||||
FolderNode *findChildFolderNode(const std::function<bool (FolderNode *)> &predicate) const; // non-recursive
|
FolderNode *findChildFolderNode(const std::function<bool (FolderNode *)> &predicate) const; // non-recursive
|
||||||
FileNode *findChildFileNode(const std::function<bool (FileNode *)> &predicate) const; // non-recursive
|
FileNode *findChildFileNode(const std::function<bool (FileNode *)> &predicate) const; // non-recursive
|
||||||
const QList<Node *> nodes() const;
|
const QList<Node *> nodes() const;
|
||||||
QList<FileNode *> fileNodes() const;
|
|
||||||
FileNode *fileNode(const Utils::FilePath &file) const;
|
FileNode *fileNode(const Utils::FilePath &file) const;
|
||||||
QList<FolderNode *> folderNodes() const;
|
|
||||||
FolderNode *folderNode(const Utils::FilePath &directory) const;
|
FolderNode *folderNode(const Utils::FilePath &directory) const;
|
||||||
|
|
||||||
using FolderNodeFactory = std::function<std::unique_ptr<FolderNode>(const Utils::FilePath &)>;
|
using FolderNodeFactory = std::function<std::unique_ptr<FolderNode>(const Utils::FilePath &)>;
|
||||||
|
@@ -245,12 +245,10 @@ static AddNewTree *buildAddFilesTree(FolderNode *root, const FilePaths &files,
|
|||||||
Node *contextNode, BestNodeSelector *selector)
|
Node *contextNode, BestNodeSelector *selector)
|
||||||
{
|
{
|
||||||
QList<AddNewTree *> children;
|
QList<AddNewTree *> children;
|
||||||
const QList<FolderNode *> folderNodes = root->folderNodes();
|
root->forEachFolderNode([&](FolderNode *fn) {
|
||||||
for (FolderNode *fn : folderNodes) {
|
if (AddNewTree *child = buildAddFilesTree(fn, files, contextNode, selector))
|
||||||
AddNewTree *child = buildAddFilesTree(fn, files, contextNode, selector);
|
|
||||||
if (child)
|
|
||||||
children.append(child);
|
children.append(child);
|
||||||
}
|
});
|
||||||
|
|
||||||
if (root->supportsAction(AddNewFile, root) && !root->supportsAction(InheritedFromParent, root)) {
|
if (root->supportsAction(AddNewFile, root) && !root->supportsAction(InheritedFromParent, root)) {
|
||||||
FolderNode::AddNewInformation info = root->addNewInformation(files, contextNode);
|
FolderNode::AddNewInformation info = root->addNewInformation(files, contextNode);
|
||||||
|
@@ -115,9 +115,7 @@ bool QmakeBuildSystem::supportsAction(Node *context, ProjectAction action, const
|
|||||||
const FolderNode *folder = node->asFolderNode();
|
const FolderNode *folder = node->asFolderNode();
|
||||||
if (folder) {
|
if (folder) {
|
||||||
FilePaths list;
|
FilePaths list;
|
||||||
const auto folderNodes = folder->folderNodes();
|
folder->forEachFolderNode([&](FolderNode *f) { list << f->filePath(); });
|
||||||
for (FolderNode *f : folderNodes)
|
|
||||||
list << f->filePath();
|
|
||||||
if (n->deploysFolder(FileUtils::commonPath(list).toString()))
|
if (n->deploysFolder(FileUtils::commonPath(list).toString()))
|
||||||
addExistingFiles = false;
|
addExistingFiles = false;
|
||||||
}
|
}
|
||||||
|
@@ -195,8 +195,7 @@ static void createTree(QmakeBuildSystem *buildSystem,
|
|||||||
fileNode->setEnabled(fn.second == FileOrigin::ExactParse);
|
fileNode->setEnabled(fn.second == FileOrigin::ExactParse);
|
||||||
vfolder->addNestedNode(std::move(fileNode));
|
vfolder->addNestedNode(std::move(fileNode));
|
||||||
}
|
}
|
||||||
for (FolderNode *fn : vfolder->folderNodes())
|
vfolder->forEachFolderNode([](FolderNode *fn) { fn->compress(); });
|
||||||
fn->compress();
|
|
||||||
}
|
}
|
||||||
node->addNode(std::move(vfolder));
|
node->addNode(std::move(vfolder));
|
||||||
}
|
}
|
||||||
|
@@ -777,32 +777,25 @@ Tasks QmakeProject::projectIssues(const Kit *k) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find the folder that contains a file with a certain name (recurse down)
|
// Find the folder that contains a file with a certain name (recurse down)
|
||||||
static FolderNode *folderOf(FolderNode *in, const FilePath &fileName)
|
static FolderNode *folderOf(FolderNode *in, const FilePath &filePath)
|
||||||
{
|
{
|
||||||
const QList<FileNode*> fileNodeList = in->fileNodes();
|
if (in->findChildFileNode([&filePath](FileNode *fn) { return fn->filePath() == filePath; }))
|
||||||
for (FileNode *fn : fileNodeList) {
|
|
||||||
if (fn->filePath() == fileName)
|
|
||||||
return in;
|
return in;
|
||||||
}
|
|
||||||
const QList<FolderNode *> folderNodeList = in->folderNodes();
|
return in->findChildFolderNode([&filePath](FolderNode *folder) {
|
||||||
for (FolderNode *folder : folderNodeList) {
|
return folderOf(folder, filePath);
|
||||||
if (FolderNode *pn = folderOf(folder, fileName))
|
});
|
||||||
return pn;
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the QmakeProFileNode that contains a certain file.
|
// Find the QmakeProFileNode that contains a certain file.
|
||||||
// First recurse down to folder, then find the pro-file.
|
// First recurse down to folder, then find the pro-file.
|
||||||
static FileNode *fileNodeOf(FolderNode *in, const FilePath &fileName)
|
static FileNode *fileNodeOf(FolderNode *in, const FilePath &filePath)
|
||||||
{
|
{
|
||||||
for (FolderNode *folder = folderOf(in, fileName); folder; folder = folder->parentFolderNode()) {
|
for (FolderNode *folder = folderOf(in, filePath); folder; folder = folder->parentFolderNode()) {
|
||||||
if (auto *proFile = dynamic_cast<QmakeProFileNode *>(folder)) {
|
if (auto proFile = dynamic_cast<QmakeProFileNode *>(folder)) {
|
||||||
const QList<FileNode*> fileNodeList = proFile->fileNodes();
|
return proFile->findChildFileNode([&filePath](FileNode *fn) {
|
||||||
for (FileNode *fileNode : fileNodeList) {
|
return fn->filePath() == filePath;
|
||||||
if (fileNode->filePath() == fileName)
|
});
|
||||||
return fileNode;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
using namespace ProjectExplorer;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
@@ -413,8 +414,10 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists,
|
|||||||
if (node->isVirtualFolderType() && node->displayName() == "Resources") {
|
if (node->isVirtualFolderType() && node->displayName() == "Resources") {
|
||||||
ProjectExplorer::FolderNode *virtualFolderNode = node->asFolderNode();
|
ProjectExplorer::FolderNode *virtualFolderNode = node->asFolderNode();
|
||||||
if (QTC_GUARD(virtualFolderNode)) {
|
if (QTC_GUARD(virtualFolderNode)) {
|
||||||
for (int subFolderIndex = 0; subFolderIndex < virtualFolderNode->folderNodes().size() && !iconQrcFileNode; ++subFolderIndex) {
|
QList<FolderNode *> folderNodes;
|
||||||
ProjectExplorer::FolderNode *subFolderNode = virtualFolderNode->folderNodes().at(subFolderIndex);
|
virtualFolderNode->forEachFolderNode([&](FolderNode *fn) { folderNodes.append(fn); });
|
||||||
|
for (int subFolderIndex = 0; subFolderIndex < folderNodes.size() && !iconQrcFileNode; ++subFolderIndex) {
|
||||||
|
ProjectExplorer::FolderNode *subFolderNode = folderNodes.at(subFolderIndex);
|
||||||
|
|
||||||
qCDebug(documentManagerLog) << "Checking if" << subFolderNode->displayName() << "("
|
qCDebug(documentManagerLog) << "Checking if" << subFolderNode->displayName() << "("
|
||||||
<< subFolderNode << ") is" << isoIconsQrcFile;
|
<< subFolderNode << ") is" << isoIconsQrcFile;
|
||||||
|
@@ -268,9 +268,7 @@ static void compressTree(FolderNode *n)
|
|||||||
compressable->compress();
|
compressable->compress();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const QList<FolderNode *> childFolders = n->folderNodes();
|
n->forEachFolderNode([](FolderNode *c) { compressTree(c); });
|
||||||
for (FolderNode * const c : childFolders)
|
|
||||||
compressTree(c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceTopLevelNode::addInternalNodes()
|
void ResourceTopLevelNode::addInternalNodes()
|
||||||
|
Reference in New Issue
Block a user