Commit 2c24bee0 authored by Tobias Hunger's avatar Tobias Hunger
Browse files

Delete parsers after parsing is done.

This way we have a chance to flush out any state the parsers
might have.
parent 081e31fc
......@@ -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)),
......
......@@ -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)
......
......@@ -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);
......
......@@ -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);
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment