diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index fcde4a2a46387fb31037017aec81860fa6d51e89..2a42a58fd304ca947b78b89b9b5d48ceeb541807 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -204,6 +204,12 @@ void AbstractProcessStep::processStarted() void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status) { + // Clean up output parsers + if (m_outputParserChain) { + delete m_outputParserChain; + m_outputParserChain = 0; + } + if (status == QProcess::NormalExit && exitCode == 0) { emit addOutput(tr("The process \"%1\" exited normally.") .arg(QDir::toNativeSeparators(m_command)), diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 25020291709e688b8892f816c5f7d34e924ffdac..4bd15206071b0743a6bafa805386589ad2a55470 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -60,9 +60,9 @@ IOutputParser *IOutputParser::takeOutputParserChain() { IOutputParser *parser = m_parser; disconnect(parser, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat)), - this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat))); + this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat))); disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task)), - this, SLOT(taskAdded(ProjectExplorer::Task))); + this, SLOT(taskAdded(ProjectExplorer::Task))); m_parser = 0; return parser; } @@ -72,6 +72,13 @@ IOutputParser *IOutputParser::childParser() const return m_parser; } +void IOutputParser::setChildParser(IOutputParser *parser) +{ + if (m_parser != parser) + delete m_parser; + m_parser = parser; +} + void IOutputParser::stdOutput(const QString &line) { if (m_parser) diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index ba8dfbb47e5564da5c98039805b4d967fc5371f2..37da95b6ce6f54bcd6b6531e5abf03720c1da153 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -57,6 +57,7 @@ public: /// Return the head of this parsers output parser children /// IOutputParser keeps ownership! IOutputParser *childParser() const; + void setChildParser(IOutputParser *parser); /// Called once for each line if standard output to parse. virtual void stdOutput(const QString &line); diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index e1ea1a61f122c910d1c7cfd030048dc07b6438fd..ab3b714ec82afd728a0e05a77e7bca2689601921 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -64,6 +64,19 @@ void OutputParserTester::testParsing(const QString &lines, else childParser()->stdError(input); } + // first disconnect ourselves from the end of the parser chain again + IOutputParser * parser = this; + while (parser = parser->childParser()) { + if (parser->childParser() == this) { + childParser()->takeOutputParserChain(); + break; + } + } + parser = 0; + emit aboutToDeleteParser(); + + // then delete the parser(s) to test + setChildParser(0); QCOMPARE(m_receivedOutput, outputLines); QCOMPARE(m_receivedStdErrChildLine, childStdErrLines); diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 5d3a4d2d0b1b18fc32e0bbd3facba0dc46a3d63c..74fe5c87a638fbeda6ba5daf0bddfae624fb89cd 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -70,6 +70,9 @@ public: void appendOutputParser(IOutputParser *parser); +signals: + void aboutToDeleteParser(); + private slots: void outputAdded(const QString &line, const QTextCharFormat &textCharFormat); void taskAdded(const ProjectExplorer::Task &task);