forked from qt-creator/qt-creator
ProjectExplorer: Heed RunControlFactory priorities again
This fixes the regression introduced in 5a848aa188 and uses the
feature to resolve the conflict between ClangStaticAnalyzer and Boot2Qt.
Change-Id: I6cdec8261a457c399c11a4b2078a78088d4c56d1
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -143,7 +143,7 @@ bool ClangStaticAnalyzerPlugin::initialize(const QStringList &arguments, QString
|
||||
};
|
||||
|
||||
RunControl::registerWorker<ClangStaticAnalyzerToolRunner>
|
||||
(Constants::CLANGSTATICANALYZER_RUN_MODE, constraint);
|
||||
(Constants::CLANGSTATICANALYZER_RUN_MODE, constraint, /*priority*/ -1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -522,14 +522,24 @@ bool IRunControlFactory::canRun(RunConfiguration *runConfiguration, Core::Id run
|
||||
|
||||
RunControl *IRunControlFactory::create(RunConfiguration *runConfiguration, Core::Id runMode, QString *)
|
||||
{
|
||||
WorkerFactories candidates;
|
||||
for (const RunControl::WorkerFactory &factory : theWorkerFactories()) {
|
||||
if (factory.canRun(runConfiguration, runMode)) {
|
||||
auto runControl = new RunControl(runConfiguration, runMode);
|
||||
factory.producer(runControl);
|
||||
return runControl;
|
||||
if (factory.canRun(runConfiguration, runMode))
|
||||
candidates.push_back(factory);
|
||||
}
|
||||
};
|
||||
|
||||
if (candidates.empty())
|
||||
return nullptr;
|
||||
|
||||
RunControl::WorkerFactory bestFactory = *candidates.begin();
|
||||
for (const RunControl::WorkerFactory &factory : candidates) {
|
||||
if (factory.priority > bestFactory.priority)
|
||||
bestFactory = factory;
|
||||
}
|
||||
|
||||
auto runControl = new RunControl(runConfiguration, runMode);
|
||||
bestFactory.producer(runControl);
|
||||
return runControl;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -450,23 +450,24 @@ public:
|
||||
addWorkerFactory({runMode, constraint, producer});
|
||||
}
|
||||
template <class Worker>
|
||||
static void registerWorker(Core::Id runMode, const Constraint &constraint)
|
||||
static void registerWorker(Core::Id runMode, const Constraint &constraint, int priority = 0)
|
||||
{
|
||||
auto producer = [](RunControl *rc) { return new Worker(rc); };
|
||||
addWorkerFactory({runMode, constraint, producer});
|
||||
addWorkerFactory({runMode, constraint, producer, priority});
|
||||
}
|
||||
template <class Config, class Worker>
|
||||
static void registerWorker(Core::Id runMode)
|
||||
static void registerWorker(Core::Id runMode, int priority = 0)
|
||||
{
|
||||
auto constraint = [](RunConfiguration *runConfig) { return qobject_cast<Config *>(runConfig); };
|
||||
auto producer = [](RunControl *rc) { return new Worker(rc); };
|
||||
addWorkerFactory({runMode, constraint, producer});
|
||||
addWorkerFactory({runMode, constraint, producer, priority});
|
||||
}
|
||||
|
||||
struct WorkerFactory {
|
||||
Core::Id runMode;
|
||||
Constraint constraint;
|
||||
WorkerCreator producer;
|
||||
int priority = 0;
|
||||
|
||||
bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user