From d42920d372dea4bec69f8d4da67e25bce5b7c6a6 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 15 Apr 2020 09:31:51 +0200 Subject: [PATCH] OutputFormatter: Take ownership of the line parsers For symmetry with IOutputParser. Task-number: QTCREATORBUG-22665 Change-Id: I92e93b32e87ff4f3fa163a2d2fe13768e56bfa24 Reviewed-by: hjk --- src/libs/utils/outputformatter.cpp | 3 +++ src/libs/utils/outputformatter.h | 2 +- src/plugins/coreplugin/outputwindow.cpp | 4 +--- src/plugins/projectexplorer/appoutputpane.cpp | 4 ++-- src/plugins/projectexplorer/runcontrol.cpp | 9 ++------- src/plugins/projectexplorer/runcontrol.h | 2 +- src/plugins/qtsupport/qtoutputformatter.cpp | 11 +---------- src/plugins/vcsbase/vcsoutputwindow.cpp | 7 ++++--- 8 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp index dbc7e0a677f..dd243bb9bc5 100644 --- a/src/libs/utils/outputformatter.cpp +++ b/src/libs/utils/outputformatter.cpp @@ -67,6 +67,7 @@ OutputFormatter::OutputFormatter() OutputFormatter::~OutputFormatter() { + qDeleteAll(d->lineParsers); delete d; } @@ -85,6 +86,8 @@ void OutputFormatter::setPlainTextEdit(QPlainTextEdit *plainText) void OutputFormatter::setLineParsers(const QList &parsers) { + flush(); + qDeleteAll(d->lineParsers); d->lineParsers = parsers; d->nextParser = nullptr; } diff --git a/src/libs/utils/outputformatter.h b/src/libs/utils/outputformatter.h index cdb757786e7..edee0ef0b63 100644 --- a/src/libs/utils/outputformatter.h +++ b/src/libs/utils/outputformatter.h @@ -86,7 +86,7 @@ public: QPlainTextEdit *plainTextEdit() const; void setPlainTextEdit(QPlainTextEdit *plainText); - void setLineParsers(const QList &parsers); + void setLineParsers(const QList &parsers); // Takes ownership void appendMessage(const QString &text, OutputFormat format); void flush(); diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 089a37ea93c..1128dad377e 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -566,12 +566,10 @@ void Internal::CorePlugin::testOutputFormatter() " A trick\n" " embedded carriage return\n" "handled by B\n"; - TestFormatterA formatterA; - TestFormatterB formatterB; OutputFormatter formatter; QPlainTextEdit textEdit; formatter.setPlainTextEdit(&textEdit); - formatter.setLineParsers({&formatterB, &formatterA}); + formatter.setLineParsers({new TestFormatterB, new TestFormatterA}); // Stress-test the implementation by providing the input in chunks, splitting at all possible // offsets. diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index d16f6fb702d..83877266d04 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -154,7 +154,7 @@ AppOutputPane::RunControlTab::RunControlTab(RunControl *runControl, Core::Output runControl(runControl), window(w) { if (runControl && w) - w->setLineParsers(runControl->outputParsers()); + w->setLineParsers(runControl->createOutputParsers()); } AppOutputPane::AppOutputPane() : @@ -404,7 +404,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) if (tab.runControl) tab.runControl->initiateFinish(); tab.runControl = rc; - tab.window->setLineParsers(rc->outputParsers()); + tab.window->setLineParsers(rc->createOutputParsers()); handleOldOutput(tab.window); diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 241dac4021f..39ec9a72591 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -288,7 +288,6 @@ public: q = nullptr; qDeleteAll(m_workers); m_workers.clear(); - qDeleteAll(outputParsers); } Q_ENUM(RunControlState) @@ -333,7 +332,6 @@ public: Kit *kit = nullptr; // Not owned. QPointer target; // Not owned. QPointer project; // Not owned. - QList outputParsers; std::function promptToStop; std::vector m_factories; @@ -384,9 +382,6 @@ void RunControl::setTarget(Target *target) d->buildEnvironment = bc->environment(); } - QTC_CHECK(d->outputParsers.isEmpty()); - d->outputParsers = OutputFormatterFactory::createFormatters(target); - setKit(target->kit()); d->project = target->project(); } @@ -828,9 +823,9 @@ void RunControlPrivate::showError(const QString &msg) q->appendMessage(msg + '\n', ErrorMessageFormat); } -QList RunControl::outputParsers() const +QList RunControl::createOutputParsers() const { - return d->outputParsers; + return OutputFormatterFactory::createFormatters(target()); } Core::Id RunControl::runMode() const diff --git a/src/plugins/projectexplorer/runcontrol.h b/src/plugins/projectexplorer/runcontrol.h index f68f6fee35f..cd537c34668 100644 --- a/src/plugins/projectexplorer/runcontrol.h +++ b/src/plugins/projectexplorer/runcontrol.h @@ -238,7 +238,7 @@ public: Utils::FilePath targetFilePath() const; Utils::FilePath projectFilePath() const; - QList outputParsers() const; + QList createOutputParsers() const; Core::Id runMode() const; const Runnable &runnable() const; diff --git a/src/plugins/qtsupport/qtoutputformatter.cpp b/src/plugins/qtsupport/qtoutputformatter.cpp index f97851da0e5..f7f485bda69 100644 --- a/src/plugins/qtsupport/qtoutputformatter.cpp +++ b/src/plugins/qtsupport/qtoutputformatter.cpp @@ -289,18 +289,9 @@ public: class TestQtOutputFormatter : public OutputFormatter { public: - TestQtOutputFormatter() : m_parser(new TestQtOutputLineParser) - { - setLineParsers({m_parser}); - } - - ~TestQtOutputFormatter() { delete m_parser; } - -private: - OutputLineParser * const m_parser; + TestQtOutputFormatter() { setLineParsers({new TestQtOutputLineParser}); } }; - void QtSupportPlugin::testQtOutputFormatter_data() { QTest::addColumn("input"); diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index d2b96e7948f..d600143d16a 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -112,7 +112,7 @@ private: Utils::OutputFormat m_format; Utils::OutputFormatter m_formatter; - VcsOutputLineParser m_parser; + VcsOutputLineParser *m_parser = nullptr; }; OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : @@ -122,7 +122,8 @@ OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : setUndoRedoEnabled(false); setFrameStyle(QFrame::NoFrame); m_formatter.setBoldFontEnabled(false); - setLineParsers({&m_parser}); + m_parser = new VcsOutputLineParser; + setLineParsers({m_parser}); auto agg = new Aggregation::Aggregate; agg->add(this); agg->add(new Core::BaseTextFind(this)); @@ -251,7 +252,7 @@ void OutputWindowPlainTextEdit::appendLinesWithStyle(const QString &s, VcsOutputLineParser *OutputWindowPlainTextEdit::parser() { - return &m_parser; + return m_parser; } void OutputWindowPlainTextEdit::setFormat(VcsOutputWindow::MessageStyle style)