aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/outputformatter.cpp69
-rw-r--r--src/libs/utils/outputformatter.h76
-rw-r--r--src/plugins/coreplugin/outputwindow.cpp14
-rw-r--r--src/plugins/coreplugin/outputwindow.h4
-rw-r--r--src/plugins/projectexplorer/appoutputpane.cpp4
-rw-r--r--src/plugins/projectexplorer/runcontrol.cpp18
-rw-r--r--src/plugins/projectexplorer/runcontrol.h10
-rw-r--r--src/plugins/python/pythonrunconfiguration.cpp10
-rw-r--r--src/plugins/qtsupport/qtoutputformatter.cpp58
-rw-r--r--src/plugins/vcsbase/vcsoutputformatter.cpp10
-rw-r--r--src/plugins/vcsbase/vcsoutputformatter.h9
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.cpp30
12 files changed, 173 insertions, 139 deletions
diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp
index 452ec5ae06..dbc7e0a677 100644
--- a/src/libs/utils/outputformatter.cpp
+++ b/src/libs/utils/outputformatter.cpp
@@ -48,14 +48,18 @@ public:
AnsiEscapeCodeHandler escapeCodeHandler;
QPair<QString, OutputFormat> incompleteLine;
optional<QTextCharFormat> formatOverride;
- QList<OutputFormatter *> formatters;
- OutputFormatter *nextFormatter = nullptr;
+ QList<OutputLineParser *> lineParsers;
+ OutputLineParser *nextParser = nullptr;
bool boldFontEnabled = true;
bool prependCarriageReturn = false;
};
} // namespace Internal
+OutputLineParser::~OutputLineParser()
+{
+}
+
OutputFormatter::OutputFormatter()
: d(new Internal::OutputFormatterPrivate)
{
@@ -79,12 +83,10 @@ void OutputFormatter::setPlainTextEdit(QPlainTextEdit *plainText)
initFormats();
}
-void OutputFormatter::setFormatters(const QList<OutputFormatter *> &formatters)
+void OutputFormatter::setLineParsers(const QList<OutputLineParser *> &parsers)
{
- for (OutputFormatter * const f : formatters)
- f->setPlainTextEdit(plainTextEdit());
- d->formatters = formatters;
- d->nextFormatter = nullptr;
+ d->lineParsers = parsers;
+ d->nextParser = nullptr;
}
void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format)
@@ -93,7 +95,7 @@ void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format)
const QList<FormattedText> formattedText = parseAnsi(text, charFmt);
const QString cleanLine = std::accumulate(formattedText.begin(), formattedText.end(), QString(),
[](const FormattedText &t1, const FormattedText &t2) { return t1.text + t2.text; });
- const Result res = handleMessage(cleanLine, format);
+ const OutputLineParser::Result res = handleMessage(cleanLine, format);
if (res.newContent) {
append(res.newContent.value(), charFmt);
return;
@@ -102,36 +104,42 @@ void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format)
append(output.text, output.format);
}
-OutputFormatter::Result OutputFormatter::handleMessage(const QString &text, OutputFormat format)
+OutputLineParser::Result OutputFormatter::handleMessage(const QString &text, OutputFormat format)
{
- if (d->nextFormatter) {
- const Result res = d->nextFormatter->handleMessage(text, format);
+ if (d->nextParser) {
+ const OutputLineParser::Result res = d->nextParser->handleLine(text, format);
switch (res.status) {
- case Status::Done:
- d->nextFormatter = nullptr;
+ case OutputLineParser::Status::Done:
+ d->nextParser = nullptr;
return res;
- case Status::InProgress:
+ case OutputLineParser::Status::InProgress:
return res;
- case Status::NotHandled:
+ case OutputLineParser::Status::NotHandled:
QTC_CHECK(false); // TODO: This case will be legal after the merge
- d->nextFormatter = nullptr;
+ d->nextParser = nullptr;
return res;
}
}
- QTC_CHECK(!d->nextFormatter);
- for (OutputFormatter * const formatter : qAsConst(d->formatters)) {
- const Result res = formatter->handleMessage(text, format);
+ QTC_CHECK(!d->nextParser);
+ for (OutputLineParser * const parser : qAsConst(d->lineParsers)) {
+ const OutputLineParser::Result res = parser->handleLine(text, format);
switch (res.status) {
- case Status::Done:
+ case OutputLineParser::Status::Done:
return res;
- case Status::InProgress:
- d->nextFormatter = formatter;
+ case OutputLineParser::Status::InProgress:
+ d->nextParser = parser;
return res;
- case Status::NotHandled:
+ case OutputLineParser::Status::NotHandled:
break;
}
}
- return Status::NotHandled;
+ return OutputLineParser::Status::NotHandled;
+}
+
+void OutputFormatter::reset()
+{
+ for (OutputLineParser * const p : d->lineParsers)
+ p->reset();
}
QTextCharFormat OutputFormatter::charFormat(OutputFormat format) const
@@ -145,7 +153,7 @@ QList<FormattedText> OutputFormatter::parseAnsi(const QString &text, const QText
}
const QList<FormattedText> OutputFormatter::linkifiedText(
- const QList<FormattedText> &text, const OutputFormatter::LinkSpecs &linkSpecs)
+ const QList<FormattedText> &text, const OutputLineParser::LinkSpecs &linkSpecs)
{
if (linkSpecs.isEmpty())
return text;
@@ -171,7 +179,7 @@ const QList<FormattedText> OutputFormatter::linkifiedText(
break;
}
- const LinkSpec &linkSpec = linkSpecs.at(nextLinkSpecIndex);
+ const OutputLineParser::LinkSpec &linkSpec = linkSpecs.at(nextLinkSpecIndex);
const int localLinkStartPos = linkSpec.startPos - totalTextLengthSoFar;
++nextLinkSpecIndex;
@@ -221,10 +229,12 @@ QTextCharFormat OutputFormatter::linkFormat(const QTextCharFormat &inputFormat,
return result;
}
+#ifdef WITH_TESTS
void OutputFormatter::overrideTextCharFormat(const QTextCharFormat &fmt)
{
d->formatOverride = fmt;
}
+#endif // WITH_TESTS
void OutputFormatter::clearLastLine()
{
@@ -266,13 +276,12 @@ void OutputFormatter::dumpIncompleteLine(const QString &line, OutputFormat forma
d->incompleteLine.second = format;
}
-bool OutputFormatter::handleLink(const QString &href)
+void OutputFormatter::handleLink(const QString &href)
{
- for (OutputFormatter * const f : qAsConst(d->formatters)) {
+ for (OutputLineParser * const f : qAsConst(d->lineParsers)) {
if (f->handleLink(href))
- return true;
+ return;
}
- return false;
}
void OutputFormatter::clear()
diff --git a/src/libs/utils/outputformatter.h b/src/libs/utils/outputformatter.h
index d38d573d79..cdb757786e 100644
--- a/src/libs/utils/outputformatter.h
+++ b/src/libs/utils/outputformatter.h
@@ -41,33 +41,10 @@ namespace Utils {
class FormattedText;
-namespace Internal { class OutputFormatterPrivate; }
-
-class QTCREATOR_UTILS_EXPORT OutputFormatter : public QObject
+class QTCREATOR_UTILS_EXPORT OutputLineParser
{
public:
- OutputFormatter();
- ~OutputFormatter() override;
-
- QPlainTextEdit *plainTextEdit() const;
- void setPlainTextEdit(QPlainTextEdit *plainText);
-
- void setFormatters(const QList<OutputFormatter *> &formatters);
-
- void flush();
-
- void appendMessage(const QString &text, OutputFormat format);
-
- virtual bool handleLink(const QString &href);
- void clear();
- void setBoldFontEnabled(bool enabled);
-
- // For unit testing only
- void overrideTextCharFormat(const QTextCharFormat &fmt);
-
-protected:
- QTextCharFormat charFormat(OutputFormat format) const;
- static QTextCharFormat linkFormat(const QTextCharFormat &inputFormat, const QString &href);
+ virtual ~OutputLineParser();
enum class Status { Done, InProgress, NotHandled };
class LinkSpec {
@@ -88,13 +65,51 @@ protected:
optional<QString> newContent; // Hard content override. Only to be used in extreme cases.
};
+ // line contains at most one line feed character, and if it does occur, it's the last character.
+ // Either way, the input is to be considered "complete" for parsing purposes.
+ virtual Result handleLine(const QString &line, OutputFormat format) = 0;
+
+ virtual bool handleLink(const QString &href) { Q_UNUSED(href); return false; }
+ virtual void reset() {}
+};
+
+
+
+namespace Internal { class OutputFormatterPrivate; }
+
+class QTCREATOR_UTILS_EXPORT OutputFormatter : public QObject
+{
+public:
+ OutputFormatter();
+ ~OutputFormatter() override;
+
+ QPlainTextEdit *plainTextEdit() const;
+ void setPlainTextEdit(QPlainTextEdit *plainText);
+
+ void setLineParsers(const QList<OutputLineParser *> &parsers);
+
+ void appendMessage(const QString &text, OutputFormat format);
+ void flush();
+
+ void handleLink(const QString &href);
+ void clear();
+ void setBoldFontEnabled(bool enabled);
+
+#ifdef WITH_TESTS
+ void overrideTextCharFormat(const QTextCharFormat &fmt);
+#endif
+
+#ifndef WITH_TESTS
+private:
+#endif
+ QTextCharFormat charFormat(OutputFormat format) const;
+ static QTextCharFormat linkFormat(const QTextCharFormat &inputFormat, const QString &href);
+
private:
- // text contains at most one line feed character, and if it does occur, it's the last character.
- // Either way, the input is to be considered "complete" for formatting purposes.
void doAppendMessage(const QString &text, OutputFormat format);
- virtual Result handleMessage(const QString &text, OutputFormat format);
- virtual void reset() {}
+ OutputLineParser::Result handleMessage(const QString &text, OutputFormat format);
+ void reset();
void append(const QString &text, const QTextCharFormat &format);
void initFormats();
@@ -103,9 +118,10 @@ private:
void clearLastLine();
QList<FormattedText> parseAnsi(const QString &text, const QTextCharFormat &format);
const QList<Utils::FormattedText> linkifiedText(const QList<FormattedText> &text,
- const LinkSpecs &linkSpecs);
+ const OutputLineParser::LinkSpecs &linkSpecs);
Internal::OutputFormatterPrivate *d;
};
+
} // namespace Utils
diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp
index 2cf6643c71..089a37ea93 100644
--- a/src/plugins/coreplugin/outputwindow.cpp
+++ b/src/plugins/coreplugin/outputwindow.cpp
@@ -216,9 +216,9 @@ void OutputWindow::keyPressEvent(QKeyEvent *ev)
verticalScrollBar()->triggerAction(QAbstractSlider::SliderToMaximum);
}
-void OutputWindow::setFormatters(const QList<OutputFormatter *> &formatters)
+void OutputWindow::setLineParsers(const QList<OutputLineParser *> &parsers)
{
- d->formatter.setFormatters(formatters);
+ d->formatter.setLineParsers(parsers);
}
void OutputWindow::showEvent(QShowEvent *e)
@@ -503,10 +503,10 @@ void OutputWindow::setWordWrapEnabled(bool wrap)
// Handles all lines starting with "A" and the following ones up to and including the next
// one starting with "A".
-class TestFormatterA : public OutputFormatter
+class TestFormatterA : public OutputLineParser
{
private:
- Result handleMessage(const QString &text, OutputFormat) override
+ Result handleLine(const QString &text, OutputFormat) override
{
static const QString replacement = "handled by A\n";
if (m_handling) {
@@ -529,10 +529,10 @@ private:
};
// Handles all lines starting with "B". No continuation logic
-class TestFormatterB : public OutputFormatter
+class TestFormatterB : public OutputLineParser
{
private:
- Result handleMessage(const QString &text, OutputFormat) override
+ Result handleLine(const QString &text, OutputFormat) override
{
if (text.startsWith("B"))
return {Status::Done, {}, QString("handled by B\n")};
@@ -571,7 +571,7 @@ void Internal::CorePlugin::testOutputFormatter()
OutputFormatter formatter;
QPlainTextEdit textEdit;
formatter.setPlainTextEdit(&textEdit);
- formatter.setFormatters({&formatterB, &formatterA});
+ formatter.setLineParsers({&formatterB, &formatterA});
// Stress-test the implementation by providing the input in chunks, splitting at all possible
// offsets.
diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h
index 77703f0b9a..4e94d66af5 100644
--- a/src/plugins/coreplugin/outputwindow.h
+++ b/src/plugins/coreplugin/outputwindow.h
@@ -34,7 +34,7 @@
#include <QPlainTextEdit>
#include <QTimer>
-namespace Utils { class OutputFormatter; }
+namespace Utils { class OutputLineParser; }
namespace Core {
@@ -56,7 +56,7 @@ public:
OutputWindow(Context context, const QString &settingsKey, QWidget *parent = nullptr);
~OutputWindow() override;
- void setFormatters(const QList<Utils::OutputFormatter *> &formatters);
+ void setLineParsers(const QList<Utils::OutputLineParser *> &parsers);
void appendMessage(const QString &out, Utils::OutputFormat format);
diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp
index cb24b7c1c2..d16f6fb702 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->setFormatters(runControl->outputFormatters());
+ w->setLineParsers(runControl->outputParsers());
}
AppOutputPane::AppOutputPane() :
@@ -404,7 +404,7 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc)
if (tab.runControl)
tab.runControl->initiateFinish();
tab.runControl = rc;
- tab.window->setFormatters(rc->outputFormatters());
+ tab.window->setLineParsers(rc->outputParsers());
handleOldOutput(tab.window);
diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp
index 18cf5a3099..241dac4021 100644
--- a/src/plugins/projectexplorer/runcontrol.cpp
+++ b/src/plugins/projectexplorer/runcontrol.cpp
@@ -288,7 +288,7 @@ public:
q = nullptr;
qDeleteAll(m_workers);
m_workers.clear();
- qDeleteAll(outputFormatters);
+ qDeleteAll(outputParsers);
}
Q_ENUM(RunControlState)
@@ -333,7 +333,7 @@ public:
Kit *kit = nullptr; // Not owned.
QPointer<Target> target; // Not owned.
QPointer<Project> project; // Not owned.
- QList<Utils::OutputFormatter *> outputFormatters;
+ QList<Utils::OutputLineParser *> outputParsers;
std::function<bool(bool*)> promptToStop;
std::vector<RunWorkerFactory> m_factories;
@@ -384,8 +384,8 @@ void RunControl::setTarget(Target *target)
d->buildEnvironment = bc->environment();
}
- QTC_CHECK(d->outputFormatters.isEmpty());
- d->outputFormatters = OutputFormatterFactory::createFormatters(target);
+ QTC_CHECK(d->outputParsers.isEmpty());
+ d->outputParsers = OutputFormatterFactory::createFormatters(target);
setKit(target->kit());
d->project = target->project();
@@ -828,9 +828,9 @@ void RunControlPrivate::showError(const QString &msg)
q->appendMessage(msg + '\n', ErrorMessageFormat);
}
-QList<Utils::OutputFormatter *> RunControl::outputFormatters() const
+QList<Utils::OutputLineParser *> RunControl::outputParsers() const
{
- return d->outputFormatters;
+ return d->outputParsers;
}
Core::Id RunControl::runMode() const
@@ -1606,9 +1606,9 @@ OutputFormatterFactory::~OutputFormatterFactory()
g_outputFormatterFactories.removeOne(this);
}
-QList<OutputFormatter *> OutputFormatterFactory::createFormatters(Target *target)
+QList<OutputLineParser *> OutputFormatterFactory::createFormatters(Target *target)
{
- QList<OutputFormatter *> formatters;
+ QList<OutputLineParser *> formatters;
for (auto factory : qAsConst(g_outputFormatterFactories)) {
if (auto formatter = factory->m_creator(target))
formatters << formatter;
@@ -1617,7 +1617,7 @@ QList<OutputFormatter *> OutputFormatterFactory::createFormatters(Target *target
}
void OutputFormatterFactory::setFormatterCreator
- (const std::function<OutputFormatter *(Target *)> &creator)
+ (const std::function<OutputLineParser *(Target *)> &creator)
{
m_creator = creator;
}
diff --git a/src/plugins/projectexplorer/runcontrol.h b/src/plugins/projectexplorer/runcontrol.h
index 99c6a7636c..f68f6fee35 100644
--- a/src/plugins/projectexplorer/runcontrol.h
+++ b/src/plugins/projectexplorer/runcontrol.h
@@ -45,7 +45,7 @@
namespace Utils {
class MacroExpander;
-class OutputFormatter;
+class OutputLineParser;
} // Utils
namespace ProjectExplorer {
@@ -238,7 +238,7 @@ public:
Utils::FilePath targetFilePath() const;
Utils::FilePath projectFilePath() const;
- QList<Utils::OutputFormatter *> outputFormatters() const;
+ QList<Utils::OutputLineParser *> outputParsers() const;
Core::Id runMode() const;
const Runnable &runnable() const;
@@ -309,13 +309,13 @@ protected:
public:
virtual ~OutputFormatterFactory();
- static QList<Utils::OutputFormatter *> createFormatters(Target *target);
+ static QList<Utils::OutputLineParser *> createFormatters(Target *target);
protected:
- void setFormatterCreator(const std::function<Utils::OutputFormatter *(Target *)> &creator);
+ void setFormatterCreator(const std::function<Utils::OutputLineParser *(Target *)> &creator);
private:
- std::function<Utils::OutputFormatter *(Target *)> m_creator;
+ std::function<Utils::OutputLineParser *(Target *)> m_creator;
};
} // namespace ProjectExplorer
diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp
index 92e02c5206..c2c522bce3 100644
--- a/src/plugins/python/pythonrunconfiguration.cpp
+++ b/src/plugins/python/pythonrunconfiguration.cpp
@@ -60,10 +60,10 @@ using namespace Utils;
namespace Python {
namespace Internal {
-class PythonOutputFormatter : public OutputFormatter
+class PythonOutputLineParser : public OutputLineParser
{
public:
- PythonOutputFormatter()
+ PythonOutputLineParser()
// Note that moc dislikes raw string literals.
: filePattern("^(\\s*)(File \"([^\"]+)\", line (\\d+), .*$)")
{
@@ -71,7 +71,7 @@ public:
}
private:
- Result handleMessage(const QString &text, OutputFormat format) final
+ Result handleLine(const QString &text, OutputFormat format) final
{
if (!m_inTraceBack) {
m_inTraceBack = format == StdErrFormat
@@ -337,9 +337,9 @@ PythonRunConfigurationFactory::PythonRunConfigurationFactory()
PythonOutputFormatterFactory::PythonOutputFormatterFactory()
{
- setFormatterCreator([](Target *t) -> OutputFormatter * {
+ setFormatterCreator([](Target *t) -> OutputLineParser * {
if (t->project()->mimeType() == Constants::C_PY_MIMETYPE)
- return new PythonOutputFormatter;
+ return new PythonOutputLineParser;
return nullptr;
});
}
diff --git a/src/plugins/qtsupport/qtoutputformatter.cpp b/src/plugins/qtsupport/qtoutputformatter.cpp
index 13ceb23d78..f97851da0e 100644
--- a/src/plugins/qtsupport/qtoutputformatter.cpp
+++ b/src/plugins/qtsupport/qtoutputformatter.cpp
@@ -79,17 +79,17 @@ public:
FileInProjectFinder projectFinder;
};
-class QtOutputFormatter : public OutputFormatter
+class QtOutputLineParser : public QObject, public OutputLineParser
{
public:
- explicit QtOutputFormatter(Target *target);
- ~QtOutputFormatter() override;
+ explicit QtOutputLineParser(Target *target);
+ ~QtOutputLineParser() override;
protected:
virtual void openEditor(const QString &fileName, int line, int column = -1);
private:
- Result handleMessage(const QString &text, Utils::OutputFormat format) override;
+ Result handleLine(const QString &text, Utils::OutputFormat format) override;
bool handleLink(const QString &href) override;
void updateProjectFileList();
@@ -99,7 +99,7 @@ private:
friend class QtSupportPlugin; // for testing
};
-QtOutputFormatter::QtOutputFormatter(Target *target)
+QtOutputLineParser::QtOutputLineParser(Target *target)
: d(new QtOutputFormatterPrivate)
{
d->project = target ? target->project() : nullptr;
@@ -110,17 +110,17 @@ QtOutputFormatter::QtOutputFormatter(Target *target)
connect(d->project,
&Project::fileListChanged,
this,
- &QtOutputFormatter::updateProjectFileList,
+ &QtOutputLineParser::updateProjectFileList,
Qt::QueuedConnection);
}
}
-QtOutputFormatter::~QtOutputFormatter()
+QtOutputLineParser::~QtOutputLineParser()
{
delete d;
}
-OutputFormatter::LinkSpec QtOutputFormatter::matchLine(const QString &line) const
+OutputLineParser::LinkSpec QtOutputLineParser::matchLine(const QString &line) const
{
LinkSpec lr;
@@ -151,7 +151,7 @@ OutputFormatter::LinkSpec QtOutputFormatter::matchLine(const QString &line) cons
return lr;
}
-OutputFormatter::Result QtOutputFormatter::handleMessage(const QString &txt, OutputFormat format)
+OutputLineParser::Result QtOutputLineParser::handleLine(const QString &txt, OutputFormat format)
{
Q_UNUSED(format);
const LinkSpec lr = matchLine(txt);
@@ -160,7 +160,7 @@ OutputFormatter::Result QtOutputFormatter::handleMessage(const QString &txt, Out
return Status::NotHandled;
}
-bool QtOutputFormatter::handleLink(const QString &href)
+bool QtOutputLineParser::handleLink(const QString &href)
{
if (!href.isEmpty()) {
static const QRegularExpression qmlLineColumnLink("^(" QT_QML_URL_REGEXP ")" // url
@@ -227,12 +227,12 @@ bool QtOutputFormatter::handleLink(const QString &href)
return false;
}
-void QtOutputFormatter::openEditor(const QString &fileName, int line, int column)
+void QtOutputLineParser::openEditor(const QString &fileName, int line, int column)
{
Core::EditorManager::openEditorAt(fileName, line, column);
}
-void QtOutputFormatter::updateProjectFileList()
+void QtOutputLineParser::updateProjectFileList()
{
if (d->project)
d->projectFinder.setProjectFiles(d->project->files(Project::SourceFiles));
@@ -242,9 +242,9 @@ void QtOutputFormatter::updateProjectFileList()
QtOutputFormatterFactory::QtOutputFormatterFactory()
{
- setFormatterCreator([](Target *t) -> OutputFormatter * {
+ setFormatterCreator([](Target *t) -> OutputLineParser * {
BaseQtVersion *qt = QtKitAspect::qtVersion(t->kit());
- return qt ? new QtOutputFormatter(t) : nullptr;
+ return qt ? new QtOutputLineParser(t) : nullptr;
});
}
@@ -265,11 +265,11 @@ namespace QtSupport {
using namespace QtSupport::Internal;
-class TestQtOutputFormatter : public QtOutputFormatter
+class TestQtOutputLineParser : public QtOutputLineParser
{
public:
- TestQtOutputFormatter() :
- QtOutputFormatter(nullptr)
+ TestQtOutputLineParser() :
+ QtOutputLineParser(nullptr)
{
}
@@ -286,6 +286,20 @@ public:
int column = -1;
};
+class TestQtOutputFormatter : public OutputFormatter
+{
+public:
+ TestQtOutputFormatter() : m_parser(new TestQtOutputLineParser)
+ {
+ setLineParsers({m_parser});
+ }
+
+ ~TestQtOutputFormatter() { delete m_parser; }
+
+private:
+ OutputLineParser * const m_parser;
+};
+
void QtSupportPlugin::testQtOutputFormatter_data()
{
@@ -409,9 +423,9 @@ void QtSupportPlugin::testQtOutputFormatter()
QFETCH(int, line);
QFETCH(int, column);
- TestQtOutputFormatter formatter;
+ TestQtOutputLineParser formatter;
- QtOutputFormatter::LinkSpec result = formatter.matchLine(input);
+ QtOutputLineParser::LinkSpec result = formatter.matchLine(input);
formatter.handleLink(result.target);
QCOMPARE(result.startPos, linkStart);
@@ -453,7 +467,7 @@ void QtSupportPlugin::testQtOutputFormatter_appendMessage_data()
<< "Object::Test in test.cpp:123"
<< "Object::Test in test.cpp:123"
<< QTextCharFormat()
- << QtOutputFormatter::linkFormat(QTextCharFormat(), "test.cpp:123");
+ << OutputFormatter::linkFormat(QTextCharFormat(), "test.cpp:123");
QTest::newRow("colored")
<< "blue da ba dee"
<< "blue da ba dee"
@@ -491,6 +505,7 @@ void QtSupportPlugin::testQtOutputFormatter_appendMessage()
void QtSupportPlugin::testQtOutputFormatter_appendMixedAssertAndAnsi()
{
QPlainTextEdit edit;
+
TestQtOutputFormatter formatter;
formatter.setPlainTextEdit(&edit);
@@ -512,7 +527,8 @@ void QtSupportPlugin::testQtOutputFormatter_appendMixedAssertAndAnsi()
edit.moveCursor(QTextCursor::WordRight);
edit.moveCursor(QTextCursor::Right);
- QCOMPARE(edit.currentCharFormat(), QtOutputFormatter::linkFormat(QTextCharFormat(), "file://test.cpp:123"));
+ QCOMPARE(edit.currentCharFormat(),
+ OutputFormatter::linkFormat(QTextCharFormat(), "file://test.cpp:123"));
edit.moveCursor(QTextCursor::End);
QCOMPARE(edit.currentCharFormat(), blueFormat());
diff --git a/src/plugins/vcsbase/vcsoutputformatter.cpp b/src/plugins/vcsbase/vcsoutputformatter.cpp
index be6a065f6b..9fd116dda0 100644
--- a/src/plugins/vcsbase/vcsoutputformatter.cpp
+++ b/src/plugins/vcsbase/vcsoutputformatter.cpp
@@ -34,7 +34,7 @@
namespace VcsBase {
-VcsOutputFormatter::VcsOutputFormatter() :
+VcsOutputLineParser::VcsOutputLineParser() :
m_regexp(
"(https?://\\S*)" // https://codereview.org/c/1234
"|(v[0-9]+\\.[0-9]+\\.[0-9]+[\\-A-Za-z0-9]*)" // v0.1.2-beta3
@@ -43,8 +43,8 @@ VcsOutputFormatter::VcsOutputFormatter() :
{
}
-Utils::OutputFormatter::Result VcsOutputFormatter::handleMessage(const QString &text,
- Utils::OutputFormat format)
+Utils::OutputLineParser::Result VcsOutputLineParser::handleLine(const QString &text,
+ Utils::OutputFormat format)
{
Q_UNUSED(format);
QRegularExpressionMatchIterator it = m_regexp.globalMatch(text);
@@ -62,7 +62,7 @@ Utils::OutputFormatter::Result VcsOutputFormatter::handleMessage(const QString &
return {Status::Done, linkSpecs};
}
-bool VcsOutputFormatter::handleLink(const QString &href)
+bool VcsOutputLineParser::handleLink(const QString &href)
{
if (href.startsWith("http://") || href.startsWith("https://"))
QDesktopServices::openUrl(QUrl(href));
@@ -71,7 +71,7 @@ bool VcsOutputFormatter::handleLink(const QString &href)
return true;
}
-void VcsOutputFormatter::fillLinkContextMenu(
+void VcsOutputLineParser::fillLinkContextMenu(
QMenu *menu, const QString &workingDirectory, const QString &href)
{
if (href.isEmpty() || href.startsWith("http://") || href.startsWith("https://")) {
diff --git a/src/plugins/vcsbase/vcsoutputformatter.h b/src/plugins/vcsbase/vcsoutputformatter.h
index 32cc9de068..e4ebfc6fee 100644
--- a/src/plugins/vcsbase/vcsoutputformatter.h
+++ b/src/plugins/vcsbase/vcsoutputformatter.h
@@ -31,20 +31,19 @@ QT_FORWARD_DECLARE_CLASS(QMenu)
namespace VcsBase {
-class VcsOutputFormatter : public Utils::OutputFormatter
+class VcsOutputLineParser : public QObject, public Utils::OutputLineParser
{
Q_OBJECT
public:
- VcsOutputFormatter();
- ~VcsOutputFormatter() override = default;
- bool handleLink(const QString &href) override;
+ VcsOutputLineParser();
void fillLinkContextMenu(QMenu *menu, const QString &workingDirectory, const QString &href);
signals:
void referenceClicked(const QString &reference);
private:
- Result handleMessage(const QString &text, Utils::OutputFormat format) override;
+ Result handleLine(const QString &text, Utils::OutputFormat format) override;
+ bool handleLink(const QString &href) override;
const QRegularExpression m_regexp;
};
diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp
index f1ca4da868..d2b96e7948 100644
--- a/src/plugins/vcsbase/vcsoutputwindow.cpp
+++ b/src/plugins/vcsbase/vcsoutputwindow.cpp
@@ -97,12 +97,11 @@ class OutputWindowPlainTextEdit : public Core::OutputWindow
{
public:
explicit OutputWindowPlainTextEdit(QWidget *parent = nullptr);
- ~OutputWindowPlainTextEdit() override;
void appendLines(const QString &s, const QString &repository = QString());
void appendLinesWithStyle(const QString &s, VcsOutputWindow::MessageStyle style,
const QString &repository = QString());
- VcsOutputFormatter *formatter();
+ VcsOutputLineParser *parser();
protected:
void contextMenuEvent(QContextMenuEvent *event) override;
@@ -112,7 +111,8 @@ private:
QString identifierUnderCursor(const QPoint &pos, QString *repository = nullptr) const;
Utils::OutputFormat m_format;
- VcsOutputFormatter *m_formatter = nullptr;
+ Utils::OutputFormatter m_formatter;
+ VcsOutputLineParser m_parser;
};
OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) :
@@ -121,19 +121,13 @@ OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) :
setReadOnly(true);
setUndoRedoEnabled(false);
setFrameStyle(QFrame::NoFrame);
- m_formatter = new VcsOutputFormatter;
- m_formatter->setBoldFontEnabled(false);
- setFormatters({m_formatter});
+ m_formatter.setBoldFontEnabled(false);
+ setLineParsers({&m_parser});
auto agg = new Aggregation::Aggregate;
agg->add(this);
agg->add(new Core::BaseTextFind(this));
}
-OutputWindowPlainTextEdit::~OutputWindowPlainTextEdit()
-{
- delete m_formatter;
-}
-
// Search back for beginning of word
static inline int firstWordCharacter(const QString &s, int startPos)
{
@@ -181,9 +175,9 @@ void OutputWindowPlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
QString repository;
const QString token = identifierUnderCursor(event->pos(), &repository);
if (!repository.isEmpty()) {
- if (VcsOutputFormatter *f = formatter()) {
+ if (VcsOutputLineParser * const p = parser()) {
if (!href.isEmpty())
- f->fillLinkContextMenu(menu, repository, href);
+ p->fillLinkContextMenu(menu, repository, href);
}
}
QAction *openAction = nullptr;
@@ -228,7 +222,7 @@ void OutputWindowPlainTextEdit::appendLines(const QString &s, const QString &rep
const int previousLineCount = document()->lineCount();
- m_formatter->appendMessage(s, m_format);
+ m_formatter.appendMessage(s, m_format);
// Scroll down
moveCursor(QTextCursor::End);
@@ -255,14 +249,14 @@ void OutputWindowPlainTextEdit::appendLinesWithStyle(const QString &s,
}
}
-VcsOutputFormatter *OutputWindowPlainTextEdit::formatter()
+VcsOutputLineParser *OutputWindowPlainTextEdit::parser()
{
- return m_formatter;
+ return &m_parser;
}
void OutputWindowPlainTextEdit::setFormat(VcsOutputWindow::MessageStyle style)
{
- m_formatter->setBoldFontEnabled(style == VcsOutputWindow::Command);
+ m_formatter.setBoldFontEnabled(style == VcsOutputWindow::Command);
switch (style) {
case VcsOutputWindow::Warning:
@@ -318,7 +312,7 @@ VcsOutputWindow::VcsOutputWindow()
connect(this, &IOutputPane::resetZoom, &d->widget, &Core::OutputWindow::resetZoom);
connect(TextEditor::TextEditorSettings::instance(), &TextEditor::TextEditorSettings::behaviorSettingsChanged,
this, updateBehaviorSettings);
- connect(d->widget.formatter(), &VcsOutputFormatter::referenceClicked,
+ connect(d->widget.parser(), &VcsOutputLineParser::referenceClicked,
VcsOutputWindow::instance(), &VcsOutputWindow::referenceClicked);
}