diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 292940f20ed..36656999135 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -685,8 +685,7 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const static QList g_runWorkerFactories; -RunWorkerFactory::RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, int prio) - : m_runMode(mode), m_constraint(constr), m_producer(prod), m_priority(prio) +RunWorkerFactory::RunWorkerFactory() { g_runWorkerFactories.append(this); } @@ -698,11 +697,40 @@ RunWorkerFactory::~RunWorkerFactory() bool RunWorkerFactory::canRun(RunConfiguration *runConfiguration, Core::Id runMode) const { - if (runMode != this->m_runMode) + if (!m_supportedRunModes.contains(runMode)) return false; - if (!m_constraint) - return true; - return m_constraint(runConfiguration); + + for (const Constraint &constraint : m_constraints) { + if (!constraint(runConfiguration)) + return false; + } + + return true; +} + +void RunWorkerFactory::setPriority(int priority) +{ + m_priority = priority; +} + +void RunWorkerFactory::setProducer(const WorkerCreator &producer) +{ + m_producer = producer; +} + +void RunWorkerFactory::addConstraint(const Constraint &constraint) +{ + // Default constructed Constraints are not worth keeping. + // FIXME: Make it a QTC_ASSERT once there is no code path + // using this "feature" anymore. + if (!constraint) + return; + m_constraints.append(constraint); +} + +void RunWorkerFactory::addSupportedRunMode(Core::Id runMode) +{ + m_supportedRunModes.append(runMode); } void RunWorkerFactory::destroyRemainingRunWorkerFactories() diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 81eba173b3c..c7cc2f070f4 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -453,12 +453,29 @@ public: using WorkerCreator = std::function; using Constraint = std::function; - RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, - int prio = 0); - + RunWorkerFactory(); virtual ~RunWorkerFactory(); - bool canRun(RunConfiguration *runConfiguration, Core::Id m_runMode) const; + template + void registerRunWorker() + { + m_producer = [](RunControl *rc) { return new Worker(rc); }; + } + + template + void setSupportedRunConfiguration() + { + m_constraints.append([](RunConfiguration *runConfig) { + return qobject_cast(runConfig) != nullptr; + }); + } + + bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const; + + void setPriority(int priority); + void setProducer(const WorkerCreator &producer); + void addConstraint(const Constraint &constraint); + void addSupportedRunMode(Core::Id runMode); int priority() const { return m_priority; } WorkerCreator producer() const { return m_producer; } @@ -469,8 +486,8 @@ private: friend class ProjectExplorerPlugin; static void destroyRemainingRunWorkerFactories(); - Core::Id m_runMode; - Constraint m_constraint; + QList m_supportedRunModes; + QList m_constraints; WorkerCreator m_producer; int m_priority = 0; }; @@ -546,20 +563,28 @@ public: static void registerWorker(Core::Id runMode, const WorkerCreator &producer, const Constraint &constraint = {}) { - (void) new RunWorkerFactory(runMode, constraint, producer); + auto factory = new RunWorkerFactory; + factory->setProducer(producer); + factory->addSupportedRunMode(runMode); + factory->addConstraint(constraint); } template static void registerWorker(Core::Id runMode, const Constraint &constraint, int priority = 0) { - auto producer = [](RunControl *rc) { return new Worker(rc); }; - (void) new RunWorkerFactory(runMode, constraint, producer, priority); + auto factory = new RunWorkerFactory; + factory->registerRunWorker(); + factory->addSupportedRunMode(runMode); + factory->addConstraint(constraint); + factory->setPriority(priority); } template static void registerWorker(Core::Id runMode, int priority = 0) { - auto constraint = [](RunConfiguration *runConfig) { return qobject_cast(runConfig) != nullptr; }; - auto producer = [](RunControl *rc) { return new Worker(rc); }; - (void) new RunWorkerFactory(runMode, constraint, producer, priority); + auto factory = new RunWorkerFactory; + factory->registerRunWorker(); + factory->addSupportedRunMode(runMode); + factory->setSupportedRunConfiguration(); + factory->setPriority(priority); } static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode);