Avoid creation of temporary lists of ProjectNodes

Change-Id: Iac84f7f95291fb3b12a071a066d358aaab309c52
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-04-04 16:43:44 +02:00
parent 6b661ef1be
commit d8de6c88e9
13 changed files with 56 additions and 94 deletions

View File

@@ -497,11 +497,8 @@ FolderNode *createSourceGroupNode(const QString &sourceGroupName,
const QStringList parts = sourceGroupName.split("\\");
for (const QString &p : parts) {
FolderNode *existingNode = Utils::findOrDefault(currentNode->folderNodes(),
[&p](const FolderNode *fn) {
return fn->displayName() == p;
});
FolderNode *existingNode = currentNode->findChildFolderNode(
[&p](const FolderNode *fn) { return fn->displayName() == p; });
if (!existingNode) {
auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p);
node->setListInProject(false);

View File

@@ -42,8 +42,7 @@ void addCMakeVFolder(FolderNode *base,
base->addNode(std::move(newFolder));
}
folder->addNestedNodes(std::move(files));
for (FolderNode *fn : folder->folderNodes())
fn->compress();
folder->forEachFolderNode([] (FolderNode *fn) { fn->compress(); });
}
std::vector<std::unique_ptr<FileNode>> &&removeKnownNodes(

View File

@@ -223,13 +223,10 @@ FolderNode *addChildFolderNode(FolderNode *parent, const QString &childName)
FolderNode *addOrGetChildFolderNode(FolderNode *parent, const QString &childName)
{
for (FolderNode *folder : parent->folderNodes()) {
if (folder->filePath().fileName() == childName) {
return folder;
}
}
return addChildFolderNode(parent, childName);
FolderNode *fn = parent->findChildFolderNode([&](FolderNode *folder) {
return folder->filePath().fileName() == childName;
});
return fn ? fn : addChildFolderNode(parent, childName);
}
// Return the node for folderPath.

View File

@@ -29,6 +29,7 @@
// TODO implement removing include dependencies that are not longer used
// TODO refactor add/remove relations between ancestor packages into extra controller class
using namespace ProjectExplorer;
using namespace Utils;
namespace ModelEditor {
@@ -217,17 +218,16 @@ QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt:
void UpdateIncludeDependenciesVisitor::collectElementPaths(const ProjectExplorer::FolderNode *folderNode,
QMultiHash<QString, Node> *filePathsMap)
{
const QList<ProjectExplorer::FileNode *> fileNodes = folderNode->fileNodes();
for (const ProjectExplorer::FileNode *fileNode : fileNodes) {
folderNode->forEachFileNode([&](FileNode *fileNode) {
QString elementName = qmt::NameController::convertFileNameToElementName(fileNode->filePath().toString());
QFileInfo fileInfo = fileNode->filePath().toFileInfo();
QString nodePath = fileInfo.path();
QStringList elementsPath = qmt::NameController::buildElementsPath(nodePath, false);
filePathsMap->insert(elementName, Node(fileNode->filePath().toString(), elementsPath));
}
const QList<ProjectExplorer::FolderNode *> subNodes = folderNode->folderNodes();
for (const ProjectExplorer::FolderNode *subNode : subNodes)
});
folderNode->forEachFolderNode([&](FolderNode *subNode) {
collectElementPaths(subNode, filePathsMap);
});
}
qmt::MComponent *UpdateIncludeDependenciesVisitor::findComponentFromFilePath(const QString &filePath)

View File

@@ -34,6 +34,8 @@
#include <QDebug>
#include <QPointer>
using namespace ProjectExplorer;
namespace ModelEditor {
namespace Internal {
@@ -447,18 +449,20 @@ QString ModelIndexer::findFirstModel(ProjectExplorer::FolderNode *folderNode,
{
if (!mimeType.isValid())
return QString();
const QList<ProjectExplorer::FileNode *> fileNodes = folderNode->fileNodes();
for (const ProjectExplorer::FileNode *fileNode : fileNodes) {
if (mimeType.suffixes().contains(fileNode->filePath().completeSuffix()))
return fileNode->filePath().toString();
}
const QList<ProjectExplorer::FolderNode *> subFolderNodes = folderNode->folderNodes();
for (ProjectExplorer::FolderNode *subFolderNode : subFolderNodes) {
QString modelFileName = findFirstModel(subFolderNode, mimeType);
if (!modelFileName.isEmpty())
return modelFileName;
}
return QString();
const QStringList suffixes = mimeType.suffixes();
FileNode *foundFileNode = folderNode->findChildFileNode([&](FileNode *fn) {
return suffixes.contains(fn->filePath().completeSuffix());
});
if (foundFileNode)
return foundFileNode->filePath().toString();
QString modelFileName;
folderNode->findChildFolderNode([&](FolderNode *fn) {
modelFileName = findFirstModel(fn, mimeType);
return !modelFileName.isEmpty();
});
return modelFileName;
}
void ModelIndexer::forgetProject(ProjectExplorer::Project *project)

View File

@@ -326,14 +326,13 @@ FilePath Node::pathOrDirectory(bool dir) const
FilePath location;
// Virtual Folder case
// 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;
} else {
// Otherwise we figure out a commonPath from the subfolders
FilePaths list;
const QList<FolderNode *> folders = folder->folderNodes();
for (FolderNode *f : folders)
list << f->filePath();
folder->forEachFolderNode([&](FolderNode *f) { list << f->filePath(); });
location = FileUtils::commonPath(list);
}
@@ -604,16 +603,6 @@ const QList<Node *> FolderNode::nodes() const
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
{
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
{
Node *node = Utils::findOrDefault(m_nodes, [directory](const std::unique_ptr<Node> &n) {
@@ -705,8 +684,7 @@ void FolderNode::compress()
compress();
} else {
for (FolderNode *fn : folderNodes())
fn->compress();
forEachFolderNode([&](FolderNode *fn) { fn->compress(); });
}
}

View File

@@ -236,9 +236,7 @@ public:
FolderNode *findChildFolderNode(const std::function<bool (FolderNode *)> &predicate) const; // non-recursive
FileNode *findChildFileNode(const std::function<bool (FileNode *)> &predicate) const; // non-recursive
const QList<Node *> nodes() const;
QList<FileNode *> fileNodes() const;
FileNode *fileNode(const Utils::FilePath &file) const;
QList<FolderNode *> folderNodes() const;
FolderNode *folderNode(const Utils::FilePath &directory) const;
using FolderNodeFactory = std::function<std::unique_ptr<FolderNode>(const Utils::FilePath &)>;

View File

@@ -245,12 +245,10 @@ static AddNewTree *buildAddFilesTree(FolderNode *root, const FilePaths &files,
Node *contextNode, BestNodeSelector *selector)
{
QList<AddNewTree *> children;
const QList<FolderNode *> folderNodes = root->folderNodes();
for (FolderNode *fn : folderNodes) {
AddNewTree *child = buildAddFilesTree(fn, files, contextNode, selector);
if (child)
root->forEachFolderNode([&](FolderNode *fn) {
if (AddNewTree *child = buildAddFilesTree(fn, files, contextNode, selector))
children.append(child);
}
});
if (root->supportsAction(AddNewFile, root) && !root->supportsAction(InheritedFromParent, root)) {
FolderNode::AddNewInformation info = root->addNewInformation(files, contextNode);

View File

@@ -115,9 +115,7 @@ bool QmakeBuildSystem::supportsAction(Node *context, ProjectAction action, const
const FolderNode *folder = node->asFolderNode();
if (folder) {
FilePaths list;
const auto folderNodes = folder->folderNodes();
for (FolderNode *f : folderNodes)
list << f->filePath();
folder->forEachFolderNode([&](FolderNode *f) { list << f->filePath(); });
if (n->deploysFolder(FileUtils::commonPath(list).toString()))
addExistingFiles = false;
}

View File

@@ -195,8 +195,7 @@ static void createTree(QmakeBuildSystem *buildSystem,
fileNode->setEnabled(fn.second == FileOrigin::ExactParse);
vfolder->addNestedNode(std::move(fileNode));
}
for (FolderNode *fn : vfolder->folderNodes())
fn->compress();
vfolder->forEachFolderNode([](FolderNode *fn) { fn->compress(); });
}
node->addNode(std::move(vfolder));
}

View File

@@ -777,32 +777,25 @@ Tasks QmakeProject::projectIssues(const Kit *k) const
}
// 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();
for (FileNode *fn : fileNodeList) {
if (fn->filePath() == fileName)
return in;
}
const QList<FolderNode *> folderNodeList = in->folderNodes();
for (FolderNode *folder : folderNodeList) {
if (FolderNode *pn = folderOf(folder, fileName))
return pn;
}
return {};
if (in->findChildFileNode([&filePath](FileNode *fn) { return fn->filePath() == filePath; }))
return in;
return in->findChildFolderNode([&filePath](FolderNode *folder) {
return folderOf(folder, filePath);
});
}
// Find the QmakeProFileNode that contains a certain 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()) {
if (auto *proFile = dynamic_cast<QmakeProFileNode *>(folder)) {
const QList<FileNode*> fileNodeList = proFile->fileNodes();
for (FileNode *fileNode : fileNodeList) {
if (fileNode->filePath() == fileName)
return fileNode;
}
for (FolderNode *folder = folderOf(in, filePath); folder; folder = folder->parentFolderNode()) {
if (auto proFile = dynamic_cast<QmakeProFileNode *>(folder)) {
return proFile->findChildFileNode([&filePath](FileNode *fn) {
return fn->filePath() == filePath;
});
}
}
return nullptr;

View File

@@ -32,6 +32,7 @@
#include <QMessageBox>
using namespace ProjectExplorer;
using namespace Utils;
namespace QmlDesigner {
@@ -413,8 +414,10 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists,
if (node->isVirtualFolderType() && node->displayName() == "Resources") {
ProjectExplorer::FolderNode *virtualFolderNode = node->asFolderNode();
if (QTC_GUARD(virtualFolderNode)) {
for (int subFolderIndex = 0; subFolderIndex < virtualFolderNode->folderNodes().size() && !iconQrcFileNode; ++subFolderIndex) {
ProjectExplorer::FolderNode *subFolderNode = virtualFolderNode->folderNodes().at(subFolderIndex);
QList<FolderNode *> folderNodes;
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() << "("
<< subFolderNode << ") is" << isoIconsQrcFile;

View File

@@ -268,9 +268,7 @@ static void compressTree(FolderNode *n)
compressable->compress();
return;
}
const QList<FolderNode *> childFolders = n->folderNodes();
for (FolderNode * const c : childFolders)
compressTree(c);
n->forEachFolderNode([](FolderNode *c) { compressTree(c); });
}
void ResourceTopLevelNode::addInternalNodes()