From 4b7c82b1317678f62926e1284d4088379345b4af Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 19 Dec 2017 13:54:16 +0100 Subject: [PATCH] QmakeProject: Centralize some code for subproject runconfig handling Change-Id: Iecd8c326fc7fd1b1e7e5406fd899befc9fdd3c5b Reviewed-by: Tobias Hunger --- src/plugins/ios/iosrunfactories.cpp | 12 ++------ src/plugins/ios/iosrunfactories.h | 4 +-- .../desktopqmakerunconfiguration.cpp | 10 ++----- .../desktopqmakerunconfiguration.h | 3 +- .../qmakeprojectmanager/qmakenodes.cpp | 28 ++++++++++++++----- .../qmakerunconfigurationfactory.cpp | 13 --------- .../qmakerunconfigurationfactory.h | 7 ++--- 7 files changed, 31 insertions(+), 46 deletions(-) diff --git a/src/plugins/ios/iosrunfactories.cpp b/src/plugins/ios/iosrunfactories.cpp index 1cc83f39118..dccf82e9520 100644 --- a/src/plugins/ios/iosrunfactories.cpp +++ b/src/plugins/ios/iosrunfactories.cpp @@ -68,16 +68,10 @@ QList ProjectType::AuxTemplate}); } -QList IosRunConfigurationFactory::runConfigurationsForNode(Target *t, const Node *n) +bool IosRunConfigurationFactory::hasRunConfigForProFile(RunConfiguration *rc, const Utils::FileName &n) const { - QList result; - foreach (RunConfiguration *rc, t->runConfigurations()) { - if (IosRunConfiguration *qt4c = qobject_cast(rc)) { - if (qt4c->profilePath() == n->filePath()) - result << rc; - } - } - return result; + auto iosRc = qobject_cast(rc); + return iosRc && iosRc->profilePath() == n; } } // namespace Internal diff --git a/src/plugins/ios/iosrunfactories.h b/src/plugins/ios/iosrunfactories.h index 6b9e606dabe..ed99b5f69f0 100644 --- a/src/plugins/ios/iosrunfactories.h +++ b/src/plugins/ios/iosrunfactories.h @@ -48,9 +48,7 @@ public: bool canCreateHelper(ProjectExplorer::Target *parent, const QString &suffix) const override; - QList runConfigurationsForNode(ProjectExplorer::Target *t, - const ProjectExplorer::Node *n - ) override; + bool hasRunConfigForProFile(ProjectExplorer::RunConfiguration *rc, const Utils::FileName &n) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index 0de4bca8967..36f39623ebd 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -450,14 +450,10 @@ QList return project->buildTargets(mode); } -QList DesktopQmakeRunConfigurationFactory::runConfigurationsForNode(Target *t, const Node *n) +bool DesktopQmakeRunConfigurationFactory::hasRunConfigForProFile(RunConfiguration *rc, const Utils::FileName &n) const { - QList result; - foreach (RunConfiguration *rc, t->runConfigurations()) - if (DesktopQmakeRunConfiguration *qmakeRc = qobject_cast(rc)) - if (qmakeRc->proFilePath() == n->filePath()) - result << rc; - return result; + auto qmakeRc = qobject_cast(rc); + return qmakeRc && qmakeRc->proFilePath() == n; } } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h index 39531a9e415..228e3564772 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.h @@ -143,8 +143,7 @@ public: QList availableBuildTargets(ProjectExplorer::Target *parent, CreationMode mode) const override; - QList runConfigurationsForNode(ProjectExplorer::Target *t, - const ProjectExplorer::Node *n) override; + bool hasRunConfigForProFile(ProjectExplorer::RunConfiguration *rc, const Utils::FileName &n) const override; }; } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 5efacbf4c47..ce504e9eb8f 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -38,6 +38,25 @@ using namespace Utils; namespace QmakeProjectManager { +static QList qmakeRunConfigurationsForNode(Target *t, const Node *node) +{ + QList result; + QTC_ASSERT(t, return result); + + const FileName file = node->filePath(); + for (auto factory : IRunConfigurationFactory::allRunConfigurationFactories()) { + if (auto qmakeFactory = qobject_cast(factory)) { + if (qmakeFactory->canHandle(t)) { + result.append(Utils::filtered(t->runConfigurations(), [qmakeFactory, file](RunConfiguration *rc) { + return qmakeFactory->hasRunConfigForProFile(rc, file); + })); + } + } + } + + return result; +} + /*! \class QmakePriFileNode Implements abstract ProjectNode class @@ -68,10 +87,7 @@ bool QmakePriFileNode::deploysFolder(const QString &folder) const QList QmakePriFileNode::runConfigurations() const { - QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(m_project->activeTarget()); - if (factory) - return factory->runConfigurationsForNode(m_project->activeTarget(), this); - return QList(); + return qmakeRunConfigurationsForNode(m_project->activeTarget(), this); } QmakeProFileNode *QmakePriFileNode::proFileNode() const @@ -140,9 +156,7 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, const Node *node) co } if (action == HasSubProjectRunConfigurations) { - Target *target = m_project->activeTarget(); - QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(target); - return factory && !factory->runConfigurationsForNode(target, node).isEmpty(); + return !qmakeRunConfigurationsForNode(m_project->activeTarget(), node).isEmpty(); } return false; diff --git a/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp b/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp index 12b3e9a13bb..212fbaa788b 100644 --- a/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp +++ b/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.cpp @@ -33,17 +33,4 @@ QmakeRunConfigurationFactory::QmakeRunConfigurationFactory(QObject *parent) : ProjectExplorer::IRunConfigurationFactory(parent) { } -QmakeRunConfigurationFactory *QmakeRunConfigurationFactory::find(ProjectExplorer::Target *t) -{ - if (t) { - for (auto factory : IRunConfigurationFactory::allRunConfigurationFactories()) { - if (auto qmakeFactory = qobject_cast(factory)) { - if (qmakeFactory->canHandle(t)) - return qmakeFactory; - } - } - } - return nullptr; -} - } // namespace QmakeProjectManager diff --git a/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.h b/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.h index 4835707801a..872d3857478 100644 --- a/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.h +++ b/src/plugins/qmakeprojectmanager/qmakerunconfigurationfactory.h @@ -29,7 +29,7 @@ #include -namespace ProjectExplorer { class Node; } +namespace Utils { class FileName; } namespace QmakeProjectManager { @@ -40,10 +40,7 @@ class QMAKEPROJECTMANAGER_EXPORT QmakeRunConfigurationFactory : public ProjectEx public: explicit QmakeRunConfigurationFactory(QObject *parent = 0); - virtual QList runConfigurationsForNode(ProjectExplorer::Target *t, - const ProjectExplorer::Node *n) = 0; - - static QmakeRunConfigurationFactory *find(ProjectExplorer::Target *t); + virtual bool hasRunConfigForProFile(ProjectExplorer::RunConfiguration *rc, const Utils::FileName &n) const = 0; }; } // namespace QmakeProjectManager