ProjectExplorer: Move re-runnable decision to RunWorkers

A RunControl is re-runnable if all its workers are,
a RunWorker is re-runnable if it's Stopped and unless it
says otherwise.

Also ensure SimpleTargetRunner only reportStop() once
per run and make process error message re-usable.

Change-Id: I73f5fb724d3026ceb81d5e32a3a71b4814b2bca9
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2017-07-05 15:17:38 +02:00
parent 34dad7e3a3
commit acc86aee5a
10 changed files with 142 additions and 73 deletions

View File

@@ -116,6 +116,7 @@ void DebuggerRunTool::start()
TaskHub::clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_DEBUGINFO);
TaskHub::clearTasks(Debugger::Constants::TASK_CATEGORY_DEBUGGER_RUNTIME);
setupEngine();
DebuggerEngine *engine = m_engine;
QTC_ASSERT(engine, return);
@@ -493,6 +494,16 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl)
m_isQmlDebugging(qmlDebugging(runControl))
{
setDisplayName("DebuggerRunTool");
runControl->setIcon(ProjectExplorer::Icons::DEBUG_START_SMALL_TOOLBAR);
runControl->setPromptToStop([](bool *optionalPrompt) {
return RunControl::showPromptToStopDialog(
DebuggerRunTool::tr("Close Debugging Session"),
DebuggerRunTool::tr("A debugging session is still in progress. "
"Terminating the session in the current"
" state can leave the target in an inconsistent state."
" Would you still like to terminate it?"),
QString(), QString(), optionalPrompt);
});
}
DebuggerRunTool::DebuggerRunTool(RunControl *runControl, const DebuggerStartParameters &sp, QString *errorMessage)
@@ -514,30 +525,22 @@ void DebuggerRunTool::setStartParameters(const DebuggerStartParameters &sp, QStr
void DebuggerRunTool::setRunParameters(const DebuggerRunParameters &rp, QString *errorMessage)
{
Q_UNUSED(errorMessage);
m_runParameters = rp;
}
void DebuggerRunTool::setupEngine()
{
// QML and/or mixed are not prepared for it.
setSupportsReRunning(!(m_runParameters.languages & QmlLanguage));
// FIXME: Disabled due to Android. Make Android device report available ports instead.
// int portsUsed = portsUsedByDebugger();
// if (portsUsed > device()->freePorts().count()) {
// if (errorMessage)
// *errorMessage = tr("Cannot debug: Not enough free ports available.");
// reportFailure(tr("Cannot debug: Not enough free ports available."));
// return;
// }
m_runParameters = rp;
// QML and/or mixed are not prepared for it.
runControl()->setSupportsReRunning(!(rp.languages & QmlLanguage));
runControl()->setIcon(ProjectExplorer::Icons::DEBUG_START_SMALL_TOOLBAR);
runControl()->setPromptToStop([](bool *optionalPrompt) {
return RunControl::showPromptToStopDialog(
DebuggerRunTool::tr("Close Debugging Session"),
DebuggerRunTool::tr("A debugging session is still in progress. "
"Terminating the session in the current"
" state can leave the target in an inconsistent state."
" Would you still like to terminate it?"),
QString(), QString(), optionalPrompt);
});
if (Internal::fixupParameters(m_runParameters, runControl(), m_errors)) {
m_engine = createEngine(m_runParameters.cppEngineType,
m_runParameters.masterEngineType,
@@ -545,9 +548,7 @@ void DebuggerRunTool::setRunParameters(const DebuggerRunParameters &rp, QString
m_runParameters.useTerminal,
&m_errors);
if (!m_engine) {
QString msg = m_errors.join('\n');
if (errorMessage)
*errorMessage = msg;
reportFailure(m_errors.join('\n'));
return;
}