diff --git a/src/plugins/projectexplorer/nodesvisitor.cpp b/src/plugins/projectexplorer/nodesvisitor.cpp index ed33ef13697..d432d664488 100644 --- a/src/plugins/projectexplorer/nodesvisitor.cpp +++ b/src/plugins/projectexplorer/nodesvisitor.cpp @@ -81,11 +81,6 @@ QList FindNodesForFileVisitor::nodes() const return m_nodes; } -void FindNodesForFileVisitor::visitProjectNode(ProjectNode *node) -{ - visitFolderNode(node); -} - void FindNodesForFileVisitor::visitFolderNode(FolderNode *node) { if (node->filePath() == m_path) @@ -96,11 +91,6 @@ void FindNodesForFileVisitor::visitFolderNode(FolderNode *node) } } -void FindNodesForFileVisitor::visitSessionNode(SessionNode *node) -{ - visitFolderNode(node); -} - /*! \class FindAllFilesVisitor @@ -112,11 +102,6 @@ Utils::FileNameList FindAllFilesVisitor::filePaths() const return m_filePaths; } -void FindAllFilesVisitor::visitProjectNode(ProjectNode *projectNode) -{ - visitFolderNode(projectNode); -} - void FindAllFilesVisitor::visitFolderNode(FolderNode *folderNode) { m_filePaths.append(folderNode->filePath()); diff --git a/src/plugins/projectexplorer/nodesvisitor.h b/src/plugins/projectexplorer/nodesvisitor.h index 641be9025ab..d57f498589d 100644 --- a/src/plugins/projectexplorer/nodesvisitor.h +++ b/src/plugins/projectexplorer/nodesvisitor.h @@ -36,15 +36,13 @@ namespace ProjectExplorer { class Node; class FileNode; class SessionNode; -class ProjectNode; class FolderNode; -class PROJECTEXPLORER_EXPORT NodesVisitor { +class PROJECTEXPLORER_EXPORT NodesVisitor +{ public: virtual ~NodesVisitor(); - virtual void visitSessionNode(SessionNode *) { } - virtual void visitProjectNode(ProjectNode *) { } virtual void visitFolderNode(FolderNode *) { } protected: @@ -53,26 +51,25 @@ protected: /* useful visitors */ -class PROJECTEXPLORER_EXPORT FindNodesForFileVisitor : public NodesVisitor { +class PROJECTEXPLORER_EXPORT FindNodesForFileVisitor : public NodesVisitor +{ public: explicit FindNodesForFileVisitor(const Utils::FileName &fileToSearch); QList nodes() const; - void visitProjectNode(ProjectNode *node) override; void visitFolderNode(FolderNode *node) override; - void visitSessionNode(SessionNode *node) override; private: Utils::FileName m_path; QList m_nodes; }; -class PROJECTEXPLORER_EXPORT FindAllFilesVisitor : public NodesVisitor { +class PROJECTEXPLORER_EXPORT FindAllFilesVisitor : public NodesVisitor +{ public: Utils::FileNameList filePaths() const; - void visitProjectNode(ProjectNode *projectNode) override; void visitFolderNode(FolderNode *folderNode) override; private: diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 9ec6f7ba273..586d88d19e9 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -686,24 +686,24 @@ QList ProjectNode::runConfigurations() const return QList(); } -void ProjectNode::accept(NodesVisitor *visitor) -{ - visitor->visitProjectNode(this); - - foreach (FolderNode *folder, m_folderNodes) - folder->accept(visitor); -} - ProjectNode *ProjectNode::projectNode(const Utils::FileName &file) const { - return Utils::findOrDefault(m_projectNodes, [&file](const ProjectNode *fn) { - return fn->filePath() == file; - }); + for (FolderNode *node : m_folderNodes) { + if (ProjectNode *pnode = node->asProjectNode()) + if (pnode->filePath() == file) + return pnode; + } + return nullptr; } -QList ProjectNode::projectNodes() const +QList FolderNode::projectNodes() const { - return m_projectNodes; + QList nodes; + for (FolderNode *node : m_folderNodes) { + if (ProjectNode *pnode = node->asProjectNode()) + nodes.append(pnode); + } + return nodes; } /*! @@ -717,31 +717,13 @@ void ProjectNode::addProjectNode(ProjectNode *subProject) subProject->setParentFolderNode(this); m_folderNodes.append(subProject); - m_projectNodes.append(subProject); Utils::sort(m_folderNodes); - Utils::sort(m_projectNodes); } - -/*! - Removes all child nodes from the node hierarchy and deletes them. -*/ - -void ProjectNode::makeEmpty() +bool FolderNode::isEmpty() const { - foreach (ProjectNode *subProject, m_projectNodes) - m_folderNodes.removeAll(subProject); - - qDeleteAll(m_projectNodes); - m_projectNodes.clear(); - - FolderNode::makeEmpty(); -} - -bool ProjectNode::isEmpty() const -{ - return m_fileNodes.isEmpty() && m_folderNodes.isEmpty() && m_projectNodes.isEmpty(); + return m_fileNodes.isEmpty() && m_folderNodes.isEmpty(); } /*! @@ -758,24 +740,11 @@ QList SessionNode::supportedActions(Node *node) const return QList(); } - -void SessionNode::accept(NodesVisitor *visitor) -{ - visitor->visitSessionNode(this); - foreach (ProjectNode *project, m_projectNodes) - project->accept(visitor); -} - bool SessionNode::showInSimpleTree() const { return true; } -QList SessionNode::projectNodes() const -{ - return m_projectNodes; -} - QString SessionNode::addFileFilter() const { return QString::fromLatin1("*.c; *.cc; *.cpp; *.cp; *.cxx; *.c++; *.h; *.hh; *.hpp; *.hxx;"); @@ -787,16 +756,12 @@ void SessionNode::addProjectNode(ProjectNode *projectNode) qDebug("Project node has already a parent folder")); projectNode->setParentFolderNode(this); m_folderNodes.append(projectNode); - m_projectNodes.append(projectNode); - Utils::sort(m_folderNodes); - Utils::sort(m_projectNodes); } void SessionNode::removeProjectNode(ProjectNode *projectNode) { m_folderNodes.removeOne(projectNode); - m_projectNodes.removeOne(projectNode); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 16f6701b815..d440ea7ed00 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -251,6 +251,9 @@ public: void addFolderNode(FolderNode *subFolder); void setFolderNodes(const QList &folders); + // all subFolders that are projects + QList projectNodes() const; + void makeEmpty(); bool isEmpty() const; @@ -296,16 +299,8 @@ public: virtual QList runConfigurations() const; - void accept(NodesVisitor *visitor) override; - ProjectNode *projectNode(const Utils::FileName &file) const; - // all subFolders that are projects - QList projectNodes() const; void addProjectNode(ProjectNode *subProject); - void removeProjectNode(ProjectNode *subProject); - - void makeEmpty(); - bool isEmpty() const; ProjectNode *asProjectNode() final { return this; } const ProjectNode *asProjectNode() const final { return this; } @@ -316,8 +311,6 @@ protected: explicit ProjectNode(const Utils::FileName &projectFilePath); private: - QList m_projectNodes; - // let SessionNode call setParentFolderNode friend class SessionNode; }; @@ -327,12 +320,10 @@ class PROJECTEXPLORER_EXPORT SessionNode : public FolderNode { public: SessionNode(); - QList projectNodes() const; private: QList supportedActions(Node *node) const final; QString addFileFilter() const final; - void accept(NodesVisitor *visitor) final; bool showInSimpleTree() const final; void projectDisplayNameChanged(Node *node); @@ -343,8 +334,6 @@ private: friend class SessionManager; void addProjectNode(ProjectNode *projectNode); void removeProjectNode(ProjectNode *projectNode); - - QList m_projectNodes; }; } // namespace ProjectExplorer diff --git a/src/plugins/qmakeprojectmanager/findqmakeprofiles.cpp b/src/plugins/qmakeprojectmanager/findqmakeprofiles.cpp index 29f8f34b87e..c0f3a5e9cbb 100644 --- a/src/plugins/qmakeprojectmanager/findqmakeprofiles.cpp +++ b/src/plugins/qmakeprojectmanager/findqmakeprofiles.cpp @@ -36,8 +36,8 @@ QList FindQmakeProFiles::operator()(ProjectExplorer::Project return m_proFiles; } -void FindQmakeProFiles::visitProjectNode(ProjectExplorer::ProjectNode *projectNode) +void FindQmakeProFiles::visitFolderNode(ProjectExplorer::FolderNode *folderNode) { - if (QmakeProFileNode *pro = dynamic_cast(projectNode)) + if (QmakeProFileNode *pro = dynamic_cast(folderNode)) m_proFiles.append(pro); } diff --git a/src/plugins/qmakeprojectmanager/findqmakeprofiles.h b/src/plugins/qmakeprojectmanager/findqmakeprofiles.h index ba1772c78c6..4a19267b4d0 100644 --- a/src/plugins/qmakeprojectmanager/findqmakeprofiles.h +++ b/src/plugins/qmakeprojectmanager/findqmakeprofiles.h @@ -27,6 +27,8 @@ #include +namespace ProjectExplorer { class ProjectNode; } + namespace QmakeProjectManager { class QmakeProFileNode; namespace Internal { @@ -36,7 +38,7 @@ class FindQmakeProFiles: protected ProjectExplorer::NodesVisitor public: QList operator()(ProjectExplorer::ProjectNode *root); protected: - virtual void visitProjectNode(ProjectExplorer::ProjectNode *projectNode); + void visitFolderNode(ProjectExplorer::FolderNode *folderNode) final; private: QList m_proFiles; }; diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 30dcf659461..c86ae7496a8 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -1391,18 +1391,15 @@ static QmakeProjectType proFileTemplateTypeToProjectType(ProFileEvaluator::Templ namespace { // feed all files accepted by any of the factories to the callback. - class FindGeneratorSourcesVisitor : public NodesVisitor { + class FindGeneratorSourcesVisitor : public NodesVisitor + { public: FindGeneratorSourcesVisitor( const QList &factories, std::function callback) : factories(factories), callback(callback) {} - void visitProjectNode(ProjectNode *projectNode) - { - visitFolderNode(projectNode); - } - void visitFolderNode(FolderNode *folderNode) + void visitFolderNode(FolderNode *folderNode) final { foreach (FileNode *fileNode, folderNode->fileNodes()) { foreach (ProjectExplorer::ExtraCompilerFactory *factory, factories) { diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 490c06157b4..85bf9e64c98 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -161,11 +161,9 @@ class ProjectFilesVisitor : public NodesVisitor ProjectFilesVisitor(QmakeProjectFiles *files); public: - static void findProjectFiles(QmakeProFileNode *rootNode, QmakeProjectFiles *files); - void visitProjectNode(ProjectNode *projectNode); - void visitFolderNode(FolderNode *folderNode); + void visitFolderNode(FolderNode *folderNode) final; private: QmakeProjectFiles *m_files; @@ -199,14 +197,10 @@ void ProjectFilesVisitor::findProjectFiles(QmakeProFileNode *rootNode, QmakeProj unique(files->proFiles); } -void ProjectFilesVisitor::visitProjectNode(ProjectNode *projectNode) -{ - m_files->proFiles.append(projectNode->filePath().toString()); - visitFolderNode(projectNode); -} - void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode) { + if (ProjectNode *projectNode = folderNode->asProjectNode()) + m_files->proFiles.append(projectNode->filePath().toString()); if (dynamic_cast(folderNode)) m_files->files[static_cast(FileType::Resource)].push_back(folderNode->filePath().toString());