ProjectExplorer: Prepare RunWorkers for more flexible setups

A RunWorker can in theory (and will in practice) support several
run modes. Also, it has turned out to be beneficial to specify
restrictions on a fine grained level, so re-use the idea from
the RunConfigurationFactory etc. constraints setup here.

Creation of RunWorkerFactories can be made protected at some time.

Change-Id: I9e2a84abfd7377c5bf0bbe84e0c7940b1317dc10
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2018-05-11 13:57:54 +02:00
parent 8580e32e88
commit a5d987bb8a
2 changed files with 71 additions and 18 deletions

View File

@@ -685,8 +685,7 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const
static QList<RunWorkerFactory *> 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()

View File

@@ -453,12 +453,29 @@ public:
using WorkerCreator = std::function<RunWorker *(RunControl *)>;
using Constraint = std::function<bool(RunConfiguration *)>;
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 <class Worker>
void registerRunWorker()
{
m_producer = [](RunControl *rc) { return new Worker(rc); };
}
template <class RunConfig>
void setSupportedRunConfiguration()
{
m_constraints.append([](RunConfiguration *runConfig) {
return qobject_cast<RunConfig *>(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<Core::Id> m_supportedRunModes;
QList<Constraint> 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 <class Worker>
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<Worker>();
factory->addSupportedRunMode(runMode);
factory->addConstraint(constraint);
factory->setPriority(priority);
}
template <class Config, class Worker>
static void registerWorker(Core::Id runMode, int priority = 0)
{
auto constraint = [](RunConfiguration *runConfig) { return qobject_cast<Config *>(runConfig) != nullptr; };
auto producer = [](RunControl *rc) { return new Worker(rc); };
(void) new RunWorkerFactory(runMode, constraint, producer, priority);
auto factory = new RunWorkerFactory;
factory->registerRunWorker<Worker>();
factory->addSupportedRunMode(runMode);
factory->setSupportedRunConfiguration<Config>();
factory->setPriority(priority);
}
static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode);