From 6f32538c5da7cfa1a6804336dcb4db0e4f205c28 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 15 Apr 2020 14:59:51 +0200 Subject: [PATCH] ProjectExplorer: Split up the IOutputParser class For symmetry with Utils::OutputFormatter. Task-number: QTCREATORBUG-22665 Change-Id: I148fed69dba042ad3ef26e080829c31cd3f357fd Reviewed-by: hjk --- src/plugins/android/javaparser.cpp | 2 +- src/plugins/android/javaparser.h | 4 +- src/plugins/baremetal/iarewparser.cpp | 12 +- src/plugins/baremetal/iarewparser.h | 6 +- src/plugins/baremetal/iarewtoolchain.cpp | 2 +- src/plugins/baremetal/iarewtoolchain.h | 2 +- src/plugins/baremetal/keilparser.cpp | 10 +- src/plugins/baremetal/keilparser.h | 6 +- src/plugins/baremetal/keiltoolchain.cpp | 2 +- src/plugins/baremetal/keiltoolchain.h | 2 +- src/plugins/baremetal/sdccparser.cpp | 8 +- src/plugins/baremetal/sdccparser.h | 6 +- src/plugins/baremetal/sdcctoolchain.cpp | 2 +- src/plugins/baremetal/sdcctoolchain.h | 2 +- .../cmakeprojectmanager/cmakeparser.cpp | 12 +- src/plugins/cmakeprojectmanager/cmakeparser.h | 6 +- .../cmakeprojectmanager/cmakeprocess.cpp | 14 +- .../cmakeprojectmanager/cmakeprocess.h | 2 +- .../cmakeprojectmanager/servermodereader.cpp | 7 +- .../cmakeprojectmanager/servermodereader.h | 3 +- src/plugins/nim/project/nimblebuildstep.cpp | 4 +- .../nim/project/nimcompilerbuildstep.cpp | 4 +- src/plugins/nim/project/nimtoolchain.cpp | 2 +- src/plugins/nim/project/nimtoolchain.h | 2 +- .../projectexplorer/abstractprocessstep.cpp | 8 +- .../projectexplorer/abstractprocessstep.h | 7 +- src/plugins/projectexplorer/clangparser.cpp | 6 +- src/plugins/projectexplorer/clangparser.h | 4 +- src/plugins/projectexplorer/customparser.cpp | 2 +- src/plugins/projectexplorer/customparser.h | 4 +- .../projectexplorer/customtoolchain.cpp | 2 +- src/plugins/projectexplorer/customtoolchain.h | 2 +- src/plugins/projectexplorer/gccparser.cpp | 12 +- src/plugins/projectexplorer/gccparser.h | 8 +- src/plugins/projectexplorer/gcctoolchain.cpp | 6 +- src/plugins/projectexplorer/gcctoolchain.h | 6 +- src/plugins/projectexplorer/gnumakeparser.cpp | 10 +- src/plugins/projectexplorer/gnumakeparser.h | 4 +- src/plugins/projectexplorer/ioutputparser.cpp | 224 +++++++++--------- src/plugins/projectexplorer/ioutputparser.h | 72 ++++-- src/plugins/projectexplorer/kit.cpp | 4 +- src/plugins/projectexplorer/kit.h | 4 +- .../projectexplorer/kitinformation.cpp | 4 +- src/plugins/projectexplorer/kitinformation.h | 3 +- src/plugins/projectexplorer/kitmanager.cpp | 2 +- src/plugins/projectexplorer/kitmanager.h | 4 +- src/plugins/projectexplorer/ldparser.cpp | 6 +- src/plugins/projectexplorer/ldparser.h | 6 +- .../projectexplorer/linuxiccparser.cpp | 6 +- src/plugins/projectexplorer/linuxiccparser.h | 8 +- src/plugins/projectexplorer/lldparser.cpp | 2 +- src/plugins/projectexplorer/lldparser.h | 4 +- src/plugins/projectexplorer/msvcparser.cpp | 24 +- src/plugins/projectexplorer/msvcparser.h | 12 +- src/plugins/projectexplorer/msvctoolchain.cpp | 4 +- src/plugins/projectexplorer/msvctoolchain.h | 4 +- src/plugins/projectexplorer/osparser.cpp | 2 +- src/plugins/projectexplorer/osparser.h | 4 +- .../projectexplorer/outputparser_test.cpp | 2 +- .../projectexplorer/outputparser_test.h | 4 +- .../projectexplorer/parseissuesdialog.cpp | 2 +- src/plugins/projectexplorer/toolchain.h | 4 +- .../toolchainsettingsaccessor.cpp | 2 +- .../projectexplorer/xcodebuildparser.cpp | 2 +- .../projectexplorer/xcodebuildparser.h | 4 +- src/plugins/qbsprojectmanager/qbscleanstep.h | 1 - .../qbsprojectmanager/qbsinstallstep.h | 1 - .../qmakeprojectmanager/qmakemakestep.cpp | 8 +- .../qmakeprojectmanager/qmakeparser.cpp | 2 +- src/plugins/qmakeprojectmanager/qmakeparser.h | 4 +- src/plugins/qtsupport/qtkitinformation.cpp | 2 +- src/plugins/qtsupport/qtkitinformation.h | 2 +- src/plugins/qtsupport/qtparser.cpp | 2 +- src/plugins/qtsupport/qtparser.h | 4 +- src/plugins/qtsupport/qttestparser.cpp | 2 +- src/plugins/qtsupport/qttestparser.h | 6 +- 76 files changed, 345 insertions(+), 311 deletions(-) diff --git a/src/plugins/android/javaparser.cpp b/src/plugins/android/javaparser.cpp index 8be5f08b82e..9cf34789532 100644 --- a/src/plugins/android/javaparser.cpp +++ b/src/plugins/android/javaparser.cpp @@ -51,7 +51,7 @@ void JavaParser::setSourceDirectory(const Utils::FilePath &sourceDirectory) m_sourceDirectory = sourceDirectory; } -IOutputParser::Status JavaParser::doHandleLine(const QString &line, Utils::OutputFormat type) +OutputTaskParser::Status JavaParser::handleLine(const QString &line, Utils::OutputFormat type) { Q_UNUSED(type); if (m_javaRegExp.indexIn(line) == -1) diff --git a/src/plugins/android/javaparser.h b/src/plugins/android/javaparser.h index 160006636cc..31cccbe98c4 100644 --- a/src/plugins/android/javaparser.h +++ b/src/plugins/android/javaparser.h @@ -33,7 +33,7 @@ namespace Android { namespace Internal { -class JavaParser : public ProjectExplorer::IOutputParser +class JavaParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -45,7 +45,7 @@ public: void setSourceDirectory(const Utils::FilePath &sourceDirectory); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; QRegExp m_javaRegExp; QStringList m_fileList; diff --git a/src/plugins/baremetal/iarewparser.cpp b/src/plugins/baremetal/iarewparser.cpp index f3e357544de..b30bb82f2bb 100644 --- a/src/plugins/baremetal/iarewparser.cpp +++ b/src/plugins/baremetal/iarewparser.cpp @@ -64,7 +64,7 @@ Core::Id IarParser::id() void IarParser::newTask(const Task &task) { - doFlush(); + flush(); m_lastTask = task; m_lines = 1; } @@ -190,7 +190,7 @@ bool IarParser::parseErrorMessage1(const QString &lne) return true; } -IOutputParser::Status IarParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status IarParser::handleLine(const QString &line, OutputFormat type) { const QString lne = rightTrimmed(line); if (type == StdOutFormat) { @@ -198,7 +198,7 @@ IOutputParser::Status IarParser::doHandleLine(const QString &line, OutputFormat const bool leastOneParsed = parseErrorInCommandLineMessage(lne) || parseErrorMessage1(lne); if (!leastOneParsed) { - doFlush(); + flush(); return Status::NotHandled; } return Status::InProgress; @@ -215,7 +215,7 @@ IOutputParser::Status IarParser::doHandleLine(const QString &line, OutputFormat if (lne.endsWith(']')) { const QString lastPart = lne.left(lne.size() - 1); m_filePathParts.push_back(lastPart); - doFlush(); + flush(); return Status::Done; } else { m_filePathParts.push_back(lne); @@ -235,14 +235,14 @@ IOutputParser::Status IarParser::doHandleLine(const QString &line, OutputFormat } if (!m_lastTask.isNull()) { - doFlush(); + flush(); return Status::Done; } return Status::NotHandled; } -void IarParser::doFlush() +void IarParser::flush() { if (m_lastTask.isNull()) return; diff --git a/src/plugins/baremetal/iarewparser.h b/src/plugins/baremetal/iarewparser.h index 546bb400fcd..02ad25062dc 100644 --- a/src/plugins/baremetal/iarewparser.h +++ b/src/plugins/baremetal/iarewparser.h @@ -33,7 +33,7 @@ namespace Internal { // IarParser -class IarParser final : public ProjectExplorer::IOutputParser +class IarParser final : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -52,8 +52,8 @@ private: bool parseErrorInCommandLineMessage(const QString &lne); bool parseErrorMessage1(const QString &lne); - Status doHandleLine(const QString &line, Utils::OutputFormat type) final; - void doFlush() final; + Status handleLine(const QString &line, Utils::OutputFormat type) final; + void flush() final; ProjectExplorer::Task m_lastTask; int m_lines = 0; diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp index 566d2589a50..b65ebf0d9c6 100644 --- a/src/plugins/baremetal/iarewtoolchain.cpp +++ b/src/plugins/baremetal/iarewtoolchain.cpp @@ -354,7 +354,7 @@ void IarToolChain::addToEnvironment(Environment &env) const } } -QList IarToolChain::outputParsers() const +QList IarToolChain::createOutputParsers() const { return {new IarParser()}; } diff --git a/src/plugins/baremetal/iarewtoolchain.h b/src/plugins/baremetal/iarewtoolchain.h index 932e8555a7f..b1706ab2ac8 100644 --- a/src/plugins/baremetal/iarewtoolchain.h +++ b/src/plugins/baremetal/iarewtoolchain.h @@ -68,7 +68,7 @@ public: const Utils::FilePath &, const Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final; - QList outputParsers() const final; + QList createOutputParsers() const final; QVariantMap toMap() const final; bool fromMap(const QVariantMap &data) final; diff --git a/src/plugins/baremetal/keilparser.cpp b/src/plugins/baremetal/keilparser.cpp index f02ff16bdec..094e59ab0fc 100644 --- a/src/plugins/baremetal/keilparser.cpp +++ b/src/plugins/baremetal/keilparser.cpp @@ -66,7 +66,7 @@ Core::Id KeilParser::id() void KeilParser::newTask(const Task &task) { - doFlush(); + flush(); m_lastTask = task; m_lines = 1; } @@ -206,7 +206,7 @@ static bool hasDetailsPointer(const QString &trimmedLine) return trimmedLine.contains('_'); } -IOutputParser::Status KeilParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status KeilParser::handleLine(const QString &line, OutputFormat type) { QString lne = rightTrimmed(line); if (type == StdOutFormat) { @@ -242,7 +242,7 @@ IOutputParser::Status KeilParser::doHandleLine(const QString &line, OutputFormat return Status::InProgress; } } - doFlush(); + flush(); return Status::NotHandled; } @@ -257,11 +257,11 @@ IOutputParser::Status KeilParser::doHandleLine(const QString &line, OutputFormat return Status::InProgress; } - doFlush(); + flush(); return Status::NotHandled; } -void KeilParser::doFlush() +void KeilParser::flush() { if (m_lastTask.isNull()) return; diff --git a/src/plugins/baremetal/keilparser.h b/src/plugins/baremetal/keilparser.h index 3fff04bb091..d717e744535 100644 --- a/src/plugins/baremetal/keilparser.h +++ b/src/plugins/baremetal/keilparser.h @@ -33,7 +33,7 @@ namespace Internal { // KeilParser -class KeilParser final : public ProjectExplorer::IOutputParser +class KeilParser final : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -55,8 +55,8 @@ private: bool parseMcs51WarningOrFatalErrorMessage(const QString &lne); bool parseMcs51FatalErrorMessage2(const QString &lne); - Status doHandleLine(const QString &line, Utils::OutputFormat type) final; - void doFlush() final; + Status handleLine(const QString &line, Utils::OutputFormat type) final; + void flush() final; ProjectExplorer::Task m_lastTask; int m_lines = 0; diff --git a/src/plugins/baremetal/keiltoolchain.cpp b/src/plugins/baremetal/keiltoolchain.cpp index 1b67e161b52..922d38a4011 100644 --- a/src/plugins/baremetal/keiltoolchain.cpp +++ b/src/plugins/baremetal/keiltoolchain.cpp @@ -506,7 +506,7 @@ void KeilToolChain::addToEnvironment(Environment &env) const } } -QList KeilToolChain::outputParsers() const +QList KeilToolChain::createOutputParsers() const { return {new KeilParser}; } diff --git a/src/plugins/baremetal/keiltoolchain.h b/src/plugins/baremetal/keiltoolchain.h index 73269730373..561db08bd11 100644 --- a/src/plugins/baremetal/keiltoolchain.h +++ b/src/plugins/baremetal/keiltoolchain.h @@ -69,7 +69,7 @@ public: const Utils::FilePath &, const Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final; - QList outputParsers() const final; + QList createOutputParsers() const final; QVariantMap toMap() const final; bool fromMap(const QVariantMap &data) final; diff --git a/src/plugins/baremetal/sdccparser.cpp b/src/plugins/baremetal/sdccparser.cpp index fdf46c3349d..7cfd363d744 100644 --- a/src/plugins/baremetal/sdccparser.cpp +++ b/src/plugins/baremetal/sdccparser.cpp @@ -66,7 +66,7 @@ Core::Id SdccParser::id() void SdccParser::newTask(const Task &task) { - doFlush(); + flush(); m_lastTask = task; m_lines = 1; } @@ -87,7 +87,7 @@ void SdccParser::amendDescription(const QString &desc) ++m_lines; } -IOutputParser::Status SdccParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status SdccParser::handleLine(const QString &line, OutputFormat type) { if (type == StdOutFormat) return Status::NotHandled; @@ -150,11 +150,11 @@ IOutputParser::Status SdccParser::doHandleLine(const QString &line, OutputFormat return Status::InProgress; } - doFlush(); + flush(); return Status::NotHandled; } -void SdccParser::doFlush() +void SdccParser::flush() { if (m_lastTask.isNull()) return; diff --git a/src/plugins/baremetal/sdccparser.h b/src/plugins/baremetal/sdccparser.h index f96b00a3b59..a8b6f2c0fd8 100644 --- a/src/plugins/baremetal/sdccparser.h +++ b/src/plugins/baremetal/sdccparser.h @@ -33,7 +33,7 @@ namespace Internal { // SdccParser -class SdccParser final : public ProjectExplorer::IOutputParser +class SdccParser final : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -45,8 +45,8 @@ private: void newTask(const ProjectExplorer::Task &task); void amendDescription(const QString &desc); - Status doHandleLine(const QString &line, Utils::OutputFormat type) final; - void doFlush() final; + Status handleLine(const QString &line, Utils::OutputFormat type) final; + void flush() final; ProjectExplorer::Task m_lastTask; int m_lines = 0; diff --git a/src/plugins/baremetal/sdcctoolchain.cpp b/src/plugins/baremetal/sdcctoolchain.cpp index 321f1917001..0039b32f213 100644 --- a/src/plugins/baremetal/sdcctoolchain.cpp +++ b/src/plugins/baremetal/sdcctoolchain.cpp @@ -307,7 +307,7 @@ void SdccToolChain::addToEnvironment(Environment &env) const } } -QList SdccToolChain::outputParsers() const +QList SdccToolChain::createOutputParsers() const { return {new SdccParser}; } diff --git a/src/plugins/baremetal/sdcctoolchain.h b/src/plugins/baremetal/sdcctoolchain.h index 01e3abbe54f..0ac575c9823 100644 --- a/src/plugins/baremetal/sdcctoolchain.h +++ b/src/plugins/baremetal/sdcctoolchain.h @@ -69,7 +69,7 @@ public: const Utils::FilePath &, const Utils::Environment &env) const final; void addToEnvironment(Utils::Environment &env) const final; - QList outputParsers() const final; + QList createOutputParsers() const final; QVariantMap toMap() const final; bool fromMap(const QVariantMap &data) final; diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.cpp b/src/plugins/cmakeprojectmanager/cmakeparser.cpp index cf8ece3f665..a2dba99b1c5 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeparser.cpp @@ -57,7 +57,7 @@ void CMakeParser::setSourceDirectory(const QString &sourceDir) m_sourceDirectory = QDir(sourceDir); } -IOutputParser::Status CMakeParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status CMakeParser::handleLine(const QString &line, OutputFormat type) { if (type != StdErrFormat) return Status::NotHandled; @@ -67,7 +67,7 @@ IOutputParser::Status CMakeParser::doHandleLine(const QString &line, OutputForma case NONE: if (trimmedLine.isEmpty() && !m_lastTask.isNull()) { if (m_skippedFirstEmptyLine) { - doFlush(); + flush(); return Status::InProgress; } m_skippedFirstEmptyLine = true; @@ -100,7 +100,7 @@ IOutputParser::Status CMakeParser::doHandleLine(const QString &line, OutputForma return Status::InProgress; } else if (trimmedLine.endsWith(QLatin1String("in cmake code at"))) { m_expectTripleLineErrorData = LINE_LOCATION; - doFlush(); + flush(); const Task::TaskType type = trimmedLine.contains(QLatin1String("Error")) ? Task::Error : Task::Warning; m_lastTask = BuildSystemTask(type, QString()); @@ -129,7 +129,7 @@ IOutputParser::Status CMakeParser::doHandleLine(const QString &line, OutputForma m_expectTripleLineErrorData = LINE_DESCRIPTION2; else { m_expectTripleLineErrorData = NONE; - doFlush(); + flush(); return Status::Done; } return Status::InProgress; @@ -137,13 +137,13 @@ IOutputParser::Status CMakeParser::doHandleLine(const QString &line, OutputForma m_lastTask.description.append(QLatin1Char('\n')); m_lastTask.description.append(trimmedLine); m_expectTripleLineErrorData = NONE; - doFlush(); + flush(); return Status::Done; } return Status::NotHandled; } -void CMakeParser::doFlush() +void CMakeParser::flush() { if (m_lastTask.isNull()) return; diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.h b/src/plugins/cmakeprojectmanager/cmakeparser.h index 4b17b5a62f8..b4667924c46 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.h +++ b/src/plugins/cmakeprojectmanager/cmakeparser.h @@ -36,7 +36,7 @@ namespace CMakeProjectManager { -class CMAKE_EXPORT CMakeParser : public ProjectExplorer::IOutputParser +class CMAKE_EXPORT CMakeParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -45,8 +45,8 @@ public: void setSourceDirectory(const QString &sourceDir); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; - void doFlush() override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; + void flush() override; enum TripleLineError { NONE, LINE_LOCATION, LINE_DESCRIPTION, LINE_DESCRIPTION2 }; diff --git a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp index 3d272cc0c3b..c3fadbfe4ec 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp @@ -76,9 +76,7 @@ CMakeProcess::~CMakeProcess() Core::Reaper::reap(m_process.release()); } - // Delete issue parser: - if (m_parser) - m_parser->flush(); + m_parser.flush(); if (m_future) { reportCanceled(); @@ -88,7 +86,7 @@ CMakeProcess::~CMakeProcess() void CMakeProcess::run(const BuildDirParameters ¶meters, const QStringList &arguments) { - QTC_ASSERT(!m_process && !m_parser && !m_future, return); + QTC_ASSERT(!m_process && !m_future, return); CMakeTool *cmake = parameters.cmakeTool(); QTC_ASSERT(parameters.isValid() && cmake, return); @@ -98,10 +96,11 @@ void CMakeProcess::run(const BuildDirParameters ¶meters, const QStringList & const QString srcDir = parameters.sourceDirectory.toString(); - auto parser = std::make_unique(); + const auto parser = new CMakeParser; parser->setSourceDirectory(srcDir); + m_parser.addLineParser(parser); QDir source = QDir(srcDir); - connect(parser.get(), &IOutputParser::addTask, parser.get(), + connect(&m_parser, &IOutputParser::addTask, this, [source](const Task &task) { if (task.file.isEmpty() || task.file.toFileInfo().isAbsolute()) { TaskHub::addTask(task); @@ -155,7 +154,6 @@ void CMakeProcess::run(const BuildDirParameters ¶meters, const QStringList & process->start(); m_process = std::move(process); - m_parser = std::move(parser); m_future = std::move(future); } @@ -201,7 +199,7 @@ void CMakeProcess::processStandardError() static QString rest; rest = lineSplit(rest, m_process->readAllStandardError(), [this](const QString &s) { - m_parser->handleStderr(s); + m_parser.handleStderr(s); Core::MessageManager::write(s); }); } diff --git a/src/plugins/cmakeprojectmanager/cmakeprocess.h b/src/plugins/cmakeprojectmanager/cmakeprocess.h index d71a56629f5..3c2bf70ee03 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprocess.h +++ b/src/plugins/cmakeprojectmanager/cmakeprocess.h @@ -70,7 +70,7 @@ private: void checkForCancelled(); std::unique_ptr m_process; - std::unique_ptr m_parser; + ProjectExplorer::IOutputParser m_parser; std::unique_ptr> m_future; bool m_processWasCanceled = false; QTimer m_cancelTimer; diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 2270b7b3edb..1f61257a893 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -73,7 +73,9 @@ const int MAX_PROGRESS = 1400; ServerModeReader::ServerModeReader() { - connect(&m_parser, &CMakeParser::addTask, this, [this](const Task &t) { + m_cmakeParser = new CMakeParser; + m_parser.addLineParser(m_cmakeParser); + connect(&m_parser, &IOutputParser::addTask, this, [this](const Task &t) { Task editable(t); if (!editable.file.isEmpty()) { QDir srcDir(m_parameters.sourceDirectory.toString()); @@ -94,8 +96,7 @@ void ServerModeReader::setParameters(const BuildDirParameters &p) QTC_ASSERT(cmake, return); m_parameters = p; - - m_parser.setSourceDirectory(m_parameters.sourceDirectory.toString()); + m_cmakeParser->setSourceDirectory(m_parameters.sourceDirectory.toString()); createNewServer(); } diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 3910df1778f..8fe8a0a7145 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -180,7 +180,8 @@ private: QList m_targets; QList m_fileGroups; - CMakeParser m_parser; + CMakeParser *m_cmakeParser = nullptr; + ProjectExplorer::IOutputParser m_parser; #if defined(WITH_TESTS) friend class CMakeProjectPlugin; diff --git a/src/plugins/nim/project/nimblebuildstep.cpp b/src/plugins/nim/project/nimblebuildstep.cpp index 36efa463136..7beebc7ae93 100644 --- a/src/plugins/nim/project/nimblebuildstep.cpp +++ b/src/plugins/nim/project/nimblebuildstep.cpp @@ -43,9 +43,9 @@ using namespace Utils; namespace { -class NimParser : public IOutputParser +class NimParser : public OutputTaskParser { - Status doHandleLine(const QString &lne, Utils::OutputFormat) override + Status handleLine(const QString &lne, Utils::OutputFormat) override { const QString line = lne.trimmed(); static QRegularExpression regex("(.+.nim)\\((\\d+), (\\d+)\\) (.+)", diff --git a/src/plugins/nim/project/nimcompilerbuildstep.cpp b/src/plugins/nim/project/nimcompilerbuildstep.cpp index 8bdf39d5766..4950f20fbbf 100644 --- a/src/plugins/nim/project/nimcompilerbuildstep.cpp +++ b/src/plugins/nim/project/nimcompilerbuildstep.cpp @@ -45,9 +45,9 @@ using namespace Utils; namespace Nim { -class NimParser : public ProjectExplorer::IOutputParser +class NimParser : public ProjectExplorer::OutputTaskParser { - Status doHandleLine(const QString &lne, Utils::OutputFormat) override + Status handleLine(const QString &lne, Utils::OutputFormat) override { const QString line = lne.trimmed(); static QRegularExpression regex("(.+.nim)\\((\\d+), (\\d+)\\) (.+)", diff --git a/src/plugins/nim/project/nimtoolchain.cpp b/src/plugins/nim/project/nimtoolchain.cpp index 7aed9dacf66..337e697e4fb 100644 --- a/src/plugins/nim/project/nimtoolchain.cpp +++ b/src/plugins/nim/project/nimtoolchain.cpp @@ -120,7 +120,7 @@ void NimToolChain::setCompilerCommand(const FilePath &compilerCommand) parseVersion(compilerCommand, m_version); } -QList NimToolChain::outputParsers() const +QList NimToolChain::createOutputParsers() const { return {}; } diff --git a/src/plugins/nim/project/nimtoolchain.h b/src/plugins/nim/project/nimtoolchain.h index df21587776f..7ef119af1e1 100644 --- a/src/plugins/nim/project/nimtoolchain.h +++ b/src/plugins/nim/project/nimtoolchain.h @@ -56,7 +56,7 @@ public: Utils::FilePath compilerCommand() const final; QString compilerVersion() const; void setCompilerCommand(const Utils::FilePath &compilerCommand); - QList outputParsers() const final; + QList createOutputParsers() const final; std::unique_ptr createConfigurationWidget() final; QVariantMap toMap() const final; diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 3a2ed067bf4..f45ecec4903 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -132,7 +132,7 @@ AbstractProcessStep::~AbstractProcessStep() Deletes all existing output parsers and starts a new chain with the given parser. */ -void AbstractProcessStep::setOutputParser(IOutputParser *parser) +void AbstractProcessStep::setOutputParser(OutputTaskParser *parser) { d->m_outputParser.setLineParsers({parser}); } @@ -140,16 +140,16 @@ void AbstractProcessStep::setOutputParser(IOutputParser *parser) /*! Appends the given output parser to the existing chain of parsers. */ -void AbstractProcessStep::appendOutputParser(IOutputParser *parser) +void AbstractProcessStep::appendOutputParser(OutputTaskParser *parser) { if (!parser) return; d->m_outputParser.addLineParser(parser); } -void AbstractProcessStep::appendOutputParsers(const QList &parsers) +void AbstractProcessStep::appendOutputParsers(const QList &parsers) { - for (IOutputParser * const p : parsers) + for (OutputTaskParser * const p : parsers) appendOutputParser(p); } diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h index 2ad1c1609ff..b575a780f5f 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.h +++ b/src/plugins/projectexplorer/abstractprocessstep.h @@ -33,6 +33,7 @@ namespace Utils { class FilePath; } namespace ProjectExplorer { class IOutputParser; +class OutputTaskParser; class ProcessParameters; // Documentation inside. @@ -46,9 +47,9 @@ public: bool ignoreReturnValue(); void setIgnoreReturnValue(bool b); - void setOutputParser(IOutputParser *parser); - void appendOutputParser(IOutputParser *parser); - void appendOutputParsers(const QList &parsers); + void setOutputParser(OutputTaskParser *parser); + void appendOutputParser(OutputTaskParser *parser); + void appendOutputParsers(const QList &parsers); IOutputParser *outputParser() const; void emitFaultyConfigurationMessage(); diff --git a/src/plugins/projectexplorer/clangparser.cpp b/src/plugins/projectexplorer/clangparser.cpp index c2deba71ae2..5b6739e5448 100644 --- a/src/plugins/projectexplorer/clangparser.cpp +++ b/src/plugins/projectexplorer/clangparser.cpp @@ -55,19 +55,19 @@ ClangParser::ClangParser() : setObjectName(QLatin1String("ClangParser")); } -QList ClangParser::clangParserSuite() +QList ClangParser::clangParserSuite() { return {new ClangParser, new Internal::LldParser, new LdParser}; } -IOutputParser::Status ClangParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status ClangParser::handleLine(const QString &line, OutputFormat type) { if (type != StdErrFormat) return Status::NotHandled; const QString lne = rightTrimmed(line); QRegularExpressionMatch match = m_summaryRegExp.match(lne); if (match.hasMatch()) { - doFlush(); + flush(); m_expectSnippet = false; return Status::Done; } diff --git a/src/plugins/projectexplorer/clangparser.h b/src/plugins/projectexplorer/clangparser.h index b6ef7eb2a09..13b2d9ece65 100644 --- a/src/plugins/projectexplorer/clangparser.h +++ b/src/plugins/projectexplorer/clangparser.h @@ -39,12 +39,12 @@ class PROJECTEXPLORER_EXPORT ClangParser : public ProjectExplorer::GccParser public: ClangParser(); - static QList clangParserSuite(); + static QList clangParserSuite(); static Core::Id id(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; QRegularExpression m_commandRegExp; QRegularExpression m_inLineRegExp; diff --git a/src/plugins/projectexplorer/customparser.cpp b/src/plugins/projectexplorer/customparser.cpp index 514a6bd12a6..cff4893f760 100644 --- a/src/plugins/projectexplorer/customparser.cpp +++ b/src/plugins/projectexplorer/customparser.cpp @@ -129,7 +129,7 @@ Core::Id CustomParser::id() return Core::Id("ProjectExplorer.OutputParser.Custom"); } -IOutputParser::Status CustomParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status CustomParser::handleLine(const QString &line, OutputFormat type) { const CustomParserExpression::CustomParserChannel channel = type == StdErrFormat ? CustomParserExpression::ParseStdErrChannel diff --git a/src/plugins/projectexplorer/customparser.h b/src/plugins/projectexplorer/customparser.h index db1f0b4c8e0..a7e7d15d7f6 100644 --- a/src/plugins/projectexplorer/customparser.h +++ b/src/plugins/projectexplorer/customparser.h @@ -81,7 +81,7 @@ public: CustomParserExpression warning; }; -class CustomParser : public ProjectExplorer::IOutputParser +class CustomParser : public ProjectExplorer::OutputTaskParser { public: CustomParser(const CustomParserSettings &settings = CustomParserSettings()); @@ -91,7 +91,7 @@ public: static Core::Id id(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; bool hasMatch(const QString &line, CustomParserExpression::CustomParserChannel channel, const CustomParserExpression &expression, Task::TaskType taskType); diff --git a/src/plugins/projectexplorer/customtoolchain.cpp b/src/plugins/projectexplorer/customtoolchain.cpp index a1afadbfaaa..8c95e58921a 100644 --- a/src/plugins/projectexplorer/customtoolchain.cpp +++ b/src/plugins/projectexplorer/customtoolchain.cpp @@ -196,7 +196,7 @@ QStringList CustomToolChain::suggestedMkspecList() const return m_mkspecs; } -QList CustomToolChain::outputParsers() const +QList CustomToolChain::createOutputParsers() const { if (m_outputParserId == GccParser::id()) return GccParser::gccParserSuite(); diff --git a/src/plugins/projectexplorer/customtoolchain.h b/src/plugins/projectexplorer/customtoolchain.h index d554d44f4f2..8274241695c 100644 --- a/src/plugins/projectexplorer/customtoolchain.h +++ b/src/plugins/projectexplorer/customtoolchain.h @@ -84,7 +84,7 @@ public: const Utils::Environment &env) const override; void addToEnvironment(Utils::Environment &env) const override; QStringList suggestedMkspecList() const override; - QList outputParsers() const override; + QList createOutputParsers() const override; QStringList headerPathsList() const; void setHeaderPaths(const QStringList &list); diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp index 22fc040ed05..a0bcf92fd6f 100644 --- a/src/plugins/projectexplorer/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -66,19 +66,19 @@ Core::Id GccParser::id() return Core::Id("ProjectExplorer.OutputParser.Gcc"); } -QList GccParser::gccParserSuite() +QList GccParser::gccParserSuite() { return {new GccParser, new Internal::LldParser, new LdParser}; } void GccParser::newTask(const Task &task) { - doFlush(); + flush(); m_currentTask = task; m_lines = 1; } -void GccParser::doFlush() +void GccParser::flush() { if (m_currentTask.isNull()) return; @@ -107,12 +107,12 @@ void GccParser::amendDescription(const QString &desc, bool monospaced) return; } -IOutputParser::Status GccParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status GccParser::handleLine(const QString &line, OutputFormat type) { if (type == StdOutFormat) { // TODO: The "flush on channel switch" logic could possibly also done centrally. // But see MSVC with the stdout/stderr switches because of jom - doFlush(); + flush(); return Status::NotHandled; } @@ -177,7 +177,7 @@ IOutputParser::Status GccParser::doHandleLine(const QString &line, OutputFormat return Status::InProgress; } - doFlush(); + flush(); return Status::NotHandled; } diff --git a/src/plugins/projectexplorer/gccparser.h b/src/plugins/projectexplorer/gccparser.h index e2010a7cf39..46b4de42d1c 100644 --- a/src/plugins/projectexplorer/gccparser.h +++ b/src/plugins/projectexplorer/gccparser.h @@ -33,7 +33,7 @@ namespace ProjectExplorer { -class PROJECTEXPLORER_EXPORT GccParser : public ProjectExplorer::IOutputParser +class PROJECTEXPLORER_EXPORT GccParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -42,16 +42,16 @@ public: static Core::Id id(); - static QList gccParserSuite(); + static QList gccParserSuite(); protected: void newTask(const Task &task); - void doFlush() override; + void flush() override; void amendDescription(const QString &desc, bool monospaced); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; QRegularExpression m_regExp; QRegularExpression m_regExpIncluded; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 092cc6102d5..22054d6828a 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -731,7 +731,7 @@ FilePath GccToolChain::makeCommand(const Environment &environment) const return tmp.isEmpty() ? FilePath::fromString("make") : tmp; } -QList GccToolChain::outputParsers() const +QList GccToolChain::createOutputParsers() const { return GccParser::gccParserSuite(); } @@ -1628,7 +1628,7 @@ LanguageExtensions ClangToolChain::defaultLanguageExtensions() const return LanguageExtension::Gnu; } -QList ClangToolChain::outputParsers() const +QList ClangToolChain::createOutputParsers() const { return ClangParser::clangParserSuite(); } @@ -1898,7 +1898,7 @@ LanguageExtensions LinuxIccToolChain::languageExtensions(const QStringList &cxxf return extensions; } -QList LinuxIccToolChain::outputParsers() const +QList LinuxIccToolChain::createOutputParsers() const { return LinuxIccParser::iccParserSuite(); } diff --git a/src/plugins/projectexplorer/gcctoolchain.h b/src/plugins/projectexplorer/gcctoolchain.h index 60d68d66a2b..4e22ba05efd 100644 --- a/src/plugins/projectexplorer/gcctoolchain.h +++ b/src/plugins/projectexplorer/gcctoolchain.h @@ -94,7 +94,7 @@ public: void addToEnvironment(Utils::Environment &env) const override; Utils::FilePath makeCommand(const Utils::Environment &environment) const override; QStringList suggestedMkspecList() const override; - QList outputParsers() const override; + QList createOutputParsers() const override; QVariantMap toMap() const override; bool fromMap(const QVariantMap &data) override; @@ -226,7 +226,7 @@ public: Utils::LanguageExtensions languageExtensions(const QStringList &cxxflags) const override; Utils::WarningFlags warningFlags(const QStringList &cflags) const override; - QList outputParsers() const override; + QList createOutputParsers() const override; QStringList suggestedMkspecList() const override; void addToEnvironment(Utils::Environment &env) const override; @@ -286,7 +286,7 @@ class PROJECTEXPLORER_EXPORT LinuxIccToolChain : public GccToolChain public: Utils::LanguageExtensions languageExtensions(const QStringList &cxxflags) const override; - QList outputParsers() const override; + QList createOutputParsers() const override; QStringList suggestedMkspecList() const override; diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index f9d681348da..53d0db07a8a 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -103,16 +103,16 @@ void GnuMakeParser::emitTask(const ProjectExplorer::Task &task) emit addTask(task, 1, 0); } -IOutputParser::Status GnuMakeParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status GnuMakeParser::handleLine(const QString &line, OutputFormat type) { const QString lne = rightTrimmed(line); if (type == StdOutFormat) { QRegularExpressionMatch match = m_makeDir.match(lne); if (match.hasMatch()) { if (match.captured(6) == QLatin1String("Leaving")) - emit searchDirOut(FilePath::fromString(match.captured(7))); + emit searchDirExpired(FilePath::fromString(match.captured(7))); else - emit searchDirIn(FilePath::fromString(match.captured(7))); + emit newSearchDir(FilePath::fromString(match.captured(7))); return Status::Done; } return Status::NotHandled; @@ -144,7 +144,7 @@ IOutputParser::Status GnuMakeParser::doHandleLine(const QString &line, OutputFor bool GnuMakeParser::hasFatalErrors() const { - return (m_fatalErrorCount > 0) || IOutputParser::hasFatalErrors(); + return m_fatalErrorCount > 0; } } // ProjectExplorer @@ -365,7 +365,7 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing() QFETCH(QString, outputLines); QFETCH(QStringList, additionalSearchDirs); - FilePaths searchDirs = testbench.searchDirectories(); + FilePaths searchDirs = childParser->searchDirectories(); // add extra directories: foreach (const QString &dir, extraSearchDirs) diff --git a/src/plugins/projectexplorer/gnumakeparser.h b/src/plugins/projectexplorer/gnumakeparser.h index c514f865b65..5a2f247a4fd 100644 --- a/src/plugins/projectexplorer/gnumakeparser.h +++ b/src/plugins/projectexplorer/gnumakeparser.h @@ -32,7 +32,7 @@ namespace ProjectExplorer { -class PROJECTEXPLORER_EXPORT GnuMakeParser : public ProjectExplorer::IOutputParser +class PROJECTEXPLORER_EXPORT GnuMakeParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -40,7 +40,7 @@ public: explicit GnuMakeParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; bool hasFatalErrors() const override; void emitTask(const ProjectExplorer::Task &task); diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 72cb25b8116..8acd8c57c14 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -33,48 +33,127 @@ #include #include -/*! - \class ProjectExplorer::IOutputParser - \brief The IOutputParser class provides an interface for an output parser +/*! + \class ProjectExplorer::OutputTaskParser + + \brief The OutputTaskParser class provides an interface for an output parser that emits issues (tasks). \sa ProjectExplorer::Task */ /*! - \fn ProjectExplorer::IOutputParser::Status ProjectExplorer::IOutputParser::doHandleLine(const QString &line, Utils::OutputFormat type) + \fn ProjectExplorer::OutputTaskParser::Status ProjectExplorer::OutputTaskParser::handleLine(const QString &line, Utils::OutputFormat type) Called once for each line of standard output or standard error to parse. */ /*! - \fn bool ProjectExplorer::IOutputParser::hasFatalErrors() const + \fn bool ProjectExplorer::OutputTaskParser::hasFatalErrors() const This is mainly a Symbian specific quirk. */ /*! - \fn void ProjectExplorer::IOutputParser::addTask(const ProjectExplorer::Task &task) + \fn void ProjectExplorer::OutputTaskParser::addTask(const ProjectExplorer::Task &task) Should be emitted for each task seen in the output. */ /*! - \fn void ProjectExplorer::IOutputParser::doFlush() + \fn void ProjectExplorer::OutputTaskParser::flush() Instructs a parser to flush its state. Parsers may have state (for example, because they need to aggregate several lines into one task). This function is called when this state needs to be flushed out to be visible. - - doFlush() is called by flush(). flush() is called on child parsers - whenever a new task is added. - It is also called once when all input has been parsed. */ namespace ProjectExplorer { +class OutputTaskParser::Private +{ +public: + Utils::FilePaths searchDirs; + QPointer redirectionDetector; + bool skipFileExistsCheck = false; +}; + +OutputTaskParser::OutputTaskParser() : d(new Private) +{ +} + +OutputTaskParser::~OutputTaskParser() { delete d; } + +void OutputTaskParser::addSearchDir(const Utils::FilePath &dir) +{ + d->searchDirs << dir; +} + +void OutputTaskParser::dropSearchDir(const Utils::FilePath &dir) +{ + const int idx = d->searchDirs.lastIndexOf(dir); + + // TODO: This apparently triggers. Find out why and either remove the assertion (if it's legit) + // or fix the culprit. + QTC_ASSERT(idx != -1, return); + + d->searchDirs.removeAt(idx); +} + +const Utils::FilePaths OutputTaskParser::searchDirectories() const +{ + return d->searchDirs; +} + +// The redirection mechanism is needed for broken build tools (e.g. xcodebuild) that get invoked +// indirectly as part of the build process and redirect their child processes' stderr output +// to stdout. A parser might be able to detect this condition and inform interested +// other parsers that they need to interpret stdout data as stderr. +void OutputTaskParser::setRedirectionDetector(const OutputTaskParser *detector) +{ + d->redirectionDetector = detector; +} + +bool OutputTaskParser::needsRedirection() const +{ + return d->redirectionDetector && (d->redirectionDetector->hasDetectedRedirection() + || d->redirectionDetector->needsRedirection()); +} + +Utils::FilePath OutputTaskParser::absoluteFilePath(const Utils::FilePath &filePath) +{ + if (filePath.isEmpty() || filePath.toFileInfo().isAbsolute()) + return filePath; + Utils::FilePaths candidates; + for (const Utils::FilePath &dir : searchDirectories()) { + const Utils::FilePath candidate = dir.pathAppended(filePath.toString()); + if (candidate.exists() || d->skipFileExistsCheck) + candidates << candidate; + } + if (candidates.count() == 1) + return Utils::FilePath::fromString(QDir::cleanPath(candidates.first().toString())); + return filePath; +} + +QString OutputTaskParser::rightTrimmed(const QString &in) +{ + int pos = in.length(); + for (; pos > 0; --pos) { + if (!in.at(pos - 1).isSpace()) + break; + } + return in.mid(0, pos); +} + +#ifdef WITH_TESTS +void OutputTaskParser::skipFileExistsCheck() +{ + d->skipFileExistsCheck = true; +} +#endif + class IOutputParser::OutputChannelState { public: @@ -118,14 +197,11 @@ public: stderrState(parser, Utils::StdErrFormat) {} - QList lineParsers; - IOutputParser *nextParser = nullptr; + QList lineParsers; + OutputTaskParser *nextParser = nullptr; QList filters; - Utils::FilePaths searchDirs; OutputChannelState stdoutState; OutputChannelState stderrState; - QPointer redirectionDetector; - bool skipFileExistsCheck = false; }; IOutputParser::IOutputParser() : d(new IOutputParserPrivate(this)) @@ -148,39 +224,30 @@ void IOutputParser::handleStderr(const QString &data) d->stderrState.handleData(data); } -IOutputParser::Status IOutputParser::doHandleLine(const QString &line, Utils::OutputFormat type) -{ - Q_UNUSED(line); - Q_UNUSED(type); - return Status::NotHandled; -} - -void IOutputParser::doFlush() { } - void IOutputParser::handleLine(const QString &line, Utils::OutputFormat type) { const QString cleanLine = filteredLine(line); if (d->nextParser) { - switch (d->nextParser->doHandleLine(cleanLine, outputTypeForParser(d->nextParser, type))) { - case Status::Done: + switch (d->nextParser->handleLine(cleanLine, outputTypeForParser(d->nextParser, type))) { + case OutputTaskParser::Status::Done: d->nextParser = nullptr; return; - case Status::InProgress: + case OutputTaskParser::Status::InProgress: return; - case Status::NotHandled: + case OutputTaskParser::Status::NotHandled: d->nextParser = nullptr; break; } } QTC_CHECK(!d->nextParser); - for (IOutputParser * const lineParser : d->lineParsers) { - switch (lineParser->doHandleLine(cleanLine, outputTypeForParser(lineParser, type))) { - case Status::Done: + for (OutputTaskParser * const lineParser : d->lineParsers) { + switch (lineParser->handleLine(cleanLine, outputTypeForParser(lineParser, type))) { + case OutputTaskParser::Status::Done: return; - case Status::InProgress: + case OutputTaskParser::Status::InProgress: d->nextParser = lineParser; return; - case Status::NotHandled: + case OutputTaskParser::Status::NotHandled: break; } } @@ -194,52 +261,51 @@ QString IOutputParser::filteredLine(const QString &line) const return l; } -void IOutputParser::connectLineParser(IOutputParser *parser) +void IOutputParser::connectLineParser(OutputTaskParser *parser) { - connect(parser, &IOutputParser::addTask, this, &IOutputParser::addTask); - connect(parser, &IOutputParser::searchDirIn, this, &IOutputParser::addSearchDir); - connect(parser, &IOutputParser::searchDirOut, this, &IOutputParser::dropSearchDir); + connect(parser, &OutputTaskParser::addTask, this, &IOutputParser::addTask); + connect(parser, &OutputTaskParser::newSearchDir, this, &IOutputParser::addSearchDir); + connect(parser, &OutputTaskParser::searchDirExpired, this, &IOutputParser::dropSearchDir); } bool IOutputParser::hasFatalErrors() const { - return Utils::anyOf(d->lineParsers, [](const IOutputParser *p) { return p->hasFatalErrors(); }); + return Utils::anyOf(d->lineParsers, [](const OutputTaskParser *p) { + return p->hasFatalErrors(); + }); } void IOutputParser::flush() { d->stdoutState.flush(); d->stderrState.flush(); - doFlush(); - for (IOutputParser * const p : qAsConst(d->lineParsers)) - p->doFlush(); + for (OutputTaskParser * const p : qAsConst(d->lineParsers)) + p->flush(); } void IOutputParser::clear() { d->nextParser = nullptr; - d->redirectionDetector.clear(); d->filters.clear(); - d->searchDirs.clear(); qDeleteAll(d->lineParsers); d->lineParsers.clear(); d->stdoutState.pendingData.clear(); d->stderrState.pendingData.clear(); } -void IOutputParser::addLineParser(IOutputParser *parser) +void IOutputParser::addLineParser(OutputTaskParser *parser) { connectLineParser(parser); d->lineParsers << parser; } -void IOutputParser::addLineParsers(const QList &parsers) +void IOutputParser::addLineParsers(const QList &parsers) { - for (IOutputParser * const p : qAsConst(parsers)) + for (OutputTaskParser * const p : qAsConst(parsers)) addLineParser(p); } -void IOutputParser::setLineParsers(const QList &parsers) +void IOutputParser::setLineParsers(const QList &parsers) { qDeleteAll(d->lineParsers); d->lineParsers.clear(); @@ -247,27 +313,12 @@ void IOutputParser::setLineParsers(const QList &parsers) } #ifdef WITH_TESTS -QList IOutputParser::lineParsers() const +QList IOutputParser::lineParsers() const { return d->lineParsers; } - -void IOutputParser::skipFileExistsCheck() -{ - d->skipFileExistsCheck = true; -} #endif // WITH_TESTS -QString IOutputParser::rightTrimmed(const QString &in) -{ - int pos = in.length(); - for (; pos > 0; --pos) { - if (!in.at(pos - 1).isSpace()) - break; - } - return in.mid(0, pos); -} - void IOutputParser::addFilter(const Filter &filter) { d->filters << filter; @@ -275,56 +326,17 @@ void IOutputParser::addFilter(const Filter &filter) void IOutputParser::addSearchDir(const Utils::FilePath &dir) { - d->searchDirs << dir; - for (IOutputParser * const p : qAsConst(d->lineParsers)) + for (OutputTaskParser * const p : qAsConst(d->lineParsers)) p->addSearchDir(dir); } void IOutputParser::dropSearchDir(const Utils::FilePath &dir) { - const int idx = d->searchDirs.lastIndexOf(dir); - QTC_ASSERT(idx != -1, return); - d->searchDirs.removeAt(idx); - for (IOutputParser * const p : qAsConst(d->lineParsers)) + for (OutputTaskParser * const p : qAsConst(d->lineParsers)) p->dropSearchDir(dir); } -const Utils::FilePaths IOutputParser::searchDirectories() const -{ - return d->searchDirs; -} - -Utils::FilePath IOutputParser::absoluteFilePath(const Utils::FilePath &filePath) -{ - if (filePath.isEmpty() || filePath.toFileInfo().isAbsolute()) - return filePath; - Utils::FilePaths candidates; - for (const Utils::FilePath &dir : searchDirectories()) { - const Utils::FilePath candidate = dir.pathAppended(filePath.toString()); - if (candidate.exists() || d->skipFileExistsCheck) - candidates << candidate; - } - if (candidates.count() == 1) - return Utils::FilePath::fromString(QDir::cleanPath(candidates.first().toString())); - return filePath; -} - -// The redirection mechanism is needed for broken build tools (e.g. xcodebuild) that get invoked -// indirectly as part of the build process and redirect their child processes' stderr output -// to stdout. A parser might be able to detect this condition and inform interested -// other parsers that they need to interpret stdout data as stderr. -void IOutputParser::setRedirectionDetector(const IOutputParser *detector) -{ - d->redirectionDetector = detector; -} - -bool IOutputParser::needsRedirection() const -{ - return d->redirectionDetector && (d->redirectionDetector->hasDetectedRedirection() - || d->redirectionDetector->needsRedirection()); -} - -Utils::OutputFormat IOutputParser::outputTypeForParser(const IOutputParser *parser, +Utils::OutputFormat IOutputParser::outputTypeForParser(const OutputTaskParser *parser, Utils::OutputFormat type) const { if (type == Utils::StdOutFormat && parser->needsRedirection()) diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index 3018b587963..21e153b305c 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -36,6 +36,45 @@ namespace ProjectExplorer { class Task; +class PROJECTEXPLORER_EXPORT OutputTaskParser : public QObject +{ + Q_OBJECT +public: + OutputTaskParser(); + ~OutputTaskParser() override; + + void addSearchDir(const Utils::FilePath &dir); + void dropSearchDir(const Utils::FilePath &dir); + const Utils::FilePaths searchDirectories() const; + + enum class Status { Done, InProgress, NotHandled }; + virtual Status handleLine(const QString &line, Utils::OutputFormat type) = 0; + + virtual bool hasFatalErrors() const { return false; } + virtual void flush() {} + + void setRedirectionDetector(const OutputTaskParser *detector); + bool needsRedirection() const; + virtual bool hasDetectedRedirection() const { return false; } + +#ifdef WITH_TESTS + void skipFileExistsCheck(); +#endif + +signals: + void newSearchDir(const Utils::FilePath &dir); + void searchDirExpired(const Utils::FilePath &dir); + void addTask(const ProjectExplorer::Task &task, int linkedOutputLines = 0, int skipLines = 0); + +protected: + static QString rightTrimmed(const QString &in); + Utils::FilePath absoluteFilePath(const Utils::FilePath &filePath); + +private: + class Private; + Private * const d; +}; + // Documentation inside. class PROJECTEXPLORER_EXPORT IOutputParser : public QObject { @@ -47,51 +86,34 @@ public: void handleStdout(const QString &data); void handleStderr(const QString &data); - virtual bool hasFatalErrors() const; + bool hasFatalErrors() const; using Filter = std::function; void addFilter(const Filter &filter); + // Forwards to line parsers. Add those before. void addSearchDir(const Utils::FilePath &dir); void dropSearchDir(const Utils::FilePath &dir); - const Utils::FilePaths searchDirectories() const; void flush(); void clear(); - void addLineParser(IOutputParser *parser); - void addLineParsers(const QList &parsers); - void setLineParsers(const QList &parsers); + void addLineParser(OutputTaskParser *parser); + void addLineParsers(const QList &parsers); + void setLineParsers(const QList &parsers); #ifdef WITH_TESTS - QList lineParsers() const; - void skipFileExistsCheck(); + QList lineParsers() const; #endif - void setRedirectionDetector(const IOutputParser *detector); - - static QString rightTrimmed(const QString &in); - signals: - void searchDirIn(const Utils::FilePath &dir); - void searchDirOut(const Utils::FilePath &dir); void addTask(const ProjectExplorer::Task &task, int linkedOutputLines = 0, int skipLines = 0); -protected: - enum class Status { Done, InProgress, NotHandled }; - - Utils::FilePath absoluteFilePath(const Utils::FilePath &filePath); - private: - virtual Status doHandleLine(const QString &line, Utils::OutputFormat type); - virtual void doFlush(); - virtual bool hasDetectedRedirection() const { return false; } - void handleLine(const QString &line, Utils::OutputFormat type); QString filteredLine(const QString &line) const; - void connectLineParser(IOutputParser *parser); - bool needsRedirection() const; - Utils::OutputFormat outputTypeForParser(const IOutputParser *parser, + void connectLineParser(OutputTaskParser *parser); + Utils::OutputFormat outputTypeForParser(const OutputTaskParser *parser, Utils::OutputFormat type) const; class OutputChannelState; diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 52b13dc38dd..0cd845e5d39 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -559,9 +559,9 @@ void Kit::addToEnvironment(Environment &env) const aspect->addToEnvironment(this, env); } -QList Kit::createOutputParsers() const +QList Kit::createOutputParsers() const { - QList parsers{new OsParser}; + QList parsers{new OsParser}; for (KitAspect *aspect : KitManager::kitAspects()) parsers << aspect->createOutputParsers(this); return parsers; diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 831a4508278..8408eab788a 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -41,7 +41,7 @@ class MacroExpander; } // namespace Utils namespace ProjectExplorer { -class IOutputParser; +class OutputTaskParser; namespace Internal { class KitManagerPrivate; @@ -116,7 +116,7 @@ public: bool isEqual(const Kit *other) const; void addToEnvironment(Utils::Environment &env) const; - QList createOutputParsers() const; + QList createOutputParsers() const; QString toHtml(const Tasks &additional = Tasks(), const QString &extraText = QString()) const; Kit *clone(bool keepName = false) const; diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index a99c56c17aa..590a777b143 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -557,11 +557,11 @@ void ToolChainKitAspect::addToMacroExpander(Kit *kit, Utils::MacroExpander *expa }); } -QList ToolChainKitAspect::createOutputParsers(const Kit *k) const +QList ToolChainKitAspect::createOutputParsers(const Kit *k) const { for (const Core::Id langId : {Constants::CXX_LANGUAGE_ID, Constants::C_LANGUAGE_ID}) { if (const ToolChain * const tc = toolChain(k, langId)) - return tc->outputParsers(); + return tc->createOutputParsers(); } return {}; } diff --git a/src/plugins/projectexplorer/kitinformation.h b/src/plugins/projectexplorer/kitinformation.h index 4eb34171953..6b5c77dc979 100644 --- a/src/plugins/projectexplorer/kitinformation.h +++ b/src/plugins/projectexplorer/kitinformation.h @@ -35,6 +35,7 @@ #include namespace ProjectExplorer { +class OutputTaskParser; class ToolChain; class KitAspectWidget; @@ -84,7 +85,7 @@ public: void addToEnvironment(const Kit *k, Utils::Environment &env) const override; void addToMacroExpander(Kit *kit, Utils::MacroExpander *expander) const override; - QList createOutputParsers(const Kit *k) const override; + QList createOutputParsers(const Kit *k) const override; QSet availableFeatures(const Kit *k) const override; static Core::Id id(); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 72b727847b4..5d82fe6e284 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -677,7 +677,7 @@ void KitAspect::addToEnvironment(const Kit *k, Environment &env) const Q_UNUSED(env) } -QList KitAspect::createOutputParsers(const Kit *k) const +QList KitAspect::createOutputParsers(const Kit *k) const { Q_UNUSED(k) return {}; diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index d70c2f42b5c..31565eec5c5 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -46,7 +46,7 @@ class MacroExpander; namespace ProjectExplorer { class Task; -class IOutputParser; +class OutputTaskParser; class KitAspectWidget; class KitManager; @@ -91,7 +91,7 @@ public: virtual KitAspectWidget *createConfigWidget(Kit *) const = 0; virtual void addToEnvironment(const Kit *k, Utils::Environment &env) const; - virtual QList createOutputParsers(const Kit *k) const; + virtual QList createOutputParsers(const Kit *k) const; virtual QString displayNamePostfix(const Kit *k) const; diff --git a/src/plugins/projectexplorer/ldparser.cpp b/src/plugins/projectexplorer/ldparser.cpp index f99a02d3547..55ef296bf82 100644 --- a/src/plugins/projectexplorer/ldparser.cpp +++ b/src/plugins/projectexplorer/ldparser.cpp @@ -54,14 +54,14 @@ LdParser::LdParser() QTC_CHECK(m_regExpGccNames.isValid()); } -IOutputParser::Status LdParser::doHandleLine(const QString &line, Utils::OutputFormat type) +OutputTaskParser::Status LdParser::handleLine(const QString &line, Utils::OutputFormat type) { if (type != Utils::StdErrFormat) return Status::NotHandled; QString lne = rightTrimmed(line); if (!lne.isEmpty() && !lne.at(0).isSpace() && !m_incompleteTask.isNull()) { - doFlush(); + flush(); return Status::NotHandled; } @@ -144,7 +144,7 @@ IOutputParser::Status LdParser::doHandleLine(const QString &line, Utils::OutputF return Status::NotHandled; } -void LdParser::doFlush() +void LdParser::flush() { if (m_incompleteTask.isNull()) return; diff --git a/src/plugins/projectexplorer/ldparser.h b/src/plugins/projectexplorer/ldparser.h index e07931636a6..fc3d9590759 100644 --- a/src/plugins/projectexplorer/ldparser.h +++ b/src/plugins/projectexplorer/ldparser.h @@ -32,15 +32,15 @@ namespace ProjectExplorer { -class LdParser : public ProjectExplorer::IOutputParser +class LdParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT public: LdParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; - void doFlush() override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; + void flush() override; QRegularExpression m_ranlib; QRegularExpression m_regExpLinker; diff --git a/src/plugins/projectexplorer/linuxiccparser.cpp b/src/plugins/projectexplorer/linuxiccparser.cpp index a8ba996ea5e..812f10961ff 100644 --- a/src/plugins/projectexplorer/linuxiccparser.cpp +++ b/src/plugins/projectexplorer/linuxiccparser.cpp @@ -65,7 +65,7 @@ LinuxIccParser::LinuxIccParser() : QTC_CHECK(m_pchInfoLine.isValid()); } -IOutputParser::Status LinuxIccParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status LinuxIccParser::handleLine(const QString &line, OutputFormat type) { if (type != Utils::StdErrFormat) return Status::NotHandled; @@ -129,12 +129,12 @@ Core::Id LinuxIccParser::id() return Core::Id("ProjectExplorer.OutputParser.Icc"); } -QList LinuxIccParser::iccParserSuite() +QList LinuxIccParser::iccParserSuite() { return {new LinuxIccParser, new Internal::LldParser, new LdParser}; } -void LinuxIccParser::doFlush() +void LinuxIccParser::flush() { if (m_temporary.isNull()) return; diff --git a/src/plugins/projectexplorer/linuxiccparser.h b/src/plugins/projectexplorer/linuxiccparser.h index 03dc8ad431d..f5a1dd0096f 100644 --- a/src/plugins/projectexplorer/linuxiccparser.h +++ b/src/plugins/projectexplorer/linuxiccparser.h @@ -32,7 +32,7 @@ namespace ProjectExplorer { -class LinuxIccParser : public ProjectExplorer::IOutputParser +class LinuxIccParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -41,11 +41,11 @@ public: static Core::Id id(); - static QList iccParserSuite(); + static QList iccParserSuite(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; - void doFlush() override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; + void flush() override; QRegExp m_firstLine; QRegExp m_continuationLines; diff --git a/src/plugins/projectexplorer/lldparser.cpp b/src/plugins/projectexplorer/lldparser.cpp index 87097c685aa..c9384614897 100644 --- a/src/plugins/projectexplorer/lldparser.cpp +++ b/src/plugins/projectexplorer/lldparser.cpp @@ -35,7 +35,7 @@ namespace ProjectExplorer { namespace Internal { -IOutputParser::Status LldParser::doHandleLine(const QString &line, Utils::OutputFormat type) +OutputTaskParser::Status LldParser::handleLine(const QString &line, Utils::OutputFormat type) { if (type != Utils::StdErrFormat) return Status::NotHandled; diff --git a/src/plugins/projectexplorer/lldparser.h b/src/plugins/projectexplorer/lldparser.h index 4f254d8a172..d071d0264c2 100644 --- a/src/plugins/projectexplorer/lldparser.h +++ b/src/plugins/projectexplorer/lldparser.h @@ -30,9 +30,9 @@ namespace ProjectExplorer { namespace Internal { -class LldParser : public IOutputParser +class LldParser : public OutputTaskParser { - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp index d368dcec0f2..151fb52faa2 100644 --- a/src/plugins/projectexplorer/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -105,7 +105,7 @@ Core::Id MsvcParser::id() return Core::Id("ProjectExplorer.OutputParser.Msvc"); } -IOutputParser::Status MsvcParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status MsvcParser::handleLine(const QString &line, OutputFormat type) { if (type == OutputFormat::StdOutFormat) { QRegularExpressionMatch match = m_additionalInfoRegExp.match(line); @@ -169,7 +169,7 @@ IOutputParser::Status MsvcParser::doHandleLine(const QString &line, OutputFormat bool MsvcParser::processCompileLine(const QString &line) { - doFlush(); + flush(); QRegularExpressionMatch match = m_compileRegExp.match(line); if (match.hasMatch()) { @@ -183,7 +183,7 @@ bool MsvcParser::processCompileLine(const QString &line) return false; } -void MsvcParser::doFlush() +void MsvcParser::flush() { if (m_lastTask.isNull()) return; @@ -220,39 +220,39 @@ static inline bool isClangCodeMarker(const QString &trimmedLine) [] (QChar c) { return c != ' ' && c != '^' && c != '~'; }); } -IOutputParser::Status ClangClParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status ClangClParser::handleLine(const QString &line, OutputFormat type) { if (type == StdOutFormat) { if (handleNmakeJomMessage(line, &m_lastTask)) { m_linkedLines = 1; - doFlush(); + flush(); return Status::Done; } return Status::NotHandled; } - const QString lne = IOutputParser::rightTrimmed(line); // Strip \n. + const QString lne = rightTrimmed(line); // Strip \n. if (handleNmakeJomMessage(lne, &m_lastTask)) { m_linkedLines = 1; - doFlush(); + flush(); return Status::Done; } // Finish a sequence of warnings/errors: "2 warnings generated." if (!lne.isEmpty() && lne.at(0).isDigit() && lne.endsWith("generated.")) { - doFlush(); + flush(); return Status::Done; } // Start a new error message by a sequence of "In file included from " which is to be skipped. if (lne.startsWith("In file included from ")) { - doFlush(); + flush(); return Status::Done; } QRegularExpressionMatch match = m_compileRegExp.match(lne); if (match.hasMatch()) { - doFlush(); + flush(); const QPair position = parseFileName(match.captured(1)); m_lastTask = CompileTask(taskType(match.captured(2)), match.captured(3).trimmed(), absoluteFilePath(position.first), position.second); @@ -263,7 +263,7 @@ IOutputParser::Status ClangClParser::doHandleLine(const QString &line, OutputFor if (!m_lastTask.isNull()) { const QString trimmed = lne.trimmed(); if (isClangCodeMarker(trimmed)) { - doFlush(); + flush(); return Status::Done; } m_lastTask.description.append('\n'); @@ -275,7 +275,7 @@ IOutputParser::Status ClangClParser::doHandleLine(const QString &line, OutputFor return Status::NotHandled; } -void ClangClParser::doFlush() +void ClangClParser::flush() { if (!m_lastTask.isNull()) { emit addTask(m_lastTask, m_linkedLines, 1); diff --git a/src/plugins/projectexplorer/msvcparser.h b/src/plugins/projectexplorer/msvcparser.h index fbeb6f1ae6b..3f71263ee89 100644 --- a/src/plugins/projectexplorer/msvcparser.h +++ b/src/plugins/projectexplorer/msvcparser.h @@ -33,7 +33,7 @@ namespace ProjectExplorer { -class PROJECTEXPLORER_EXPORT MsvcParser : public ProjectExplorer::IOutputParser +class PROJECTEXPLORER_EXPORT MsvcParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -43,8 +43,8 @@ public: static Core::Id id(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; - void doFlush() override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; + void flush() override; bool processCompileLine(const QString &line); @@ -55,7 +55,7 @@ private: int m_lines = 0; }; -class PROJECTEXPLORER_EXPORT ClangClParser : public ProjectExplorer::IOutputParser +class PROJECTEXPLORER_EXPORT ClangClParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -63,8 +63,8 @@ public: ClangClParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; - void doFlush() override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; + void flush() override; const QRegularExpression m_compileRegExp; Task m_lastTask; diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 248af1bce0d..f486a52202f 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -1169,7 +1169,7 @@ void MsvcToolChain::rescanForCompiler() }); } -QList MsvcToolChain::outputParsers() const +QList MsvcToolChain::createOutputParsers() const { return {new MsvcParser}; } @@ -1656,7 +1656,7 @@ QStringList ClangClToolChain::suggestedMkspecList() const return {mkspec, "win32-clang-msvc"}; } -QList ClangClToolChain::outputParsers() const +QList ClangClToolChain::createOutputParsers() const { return {new ClangClParser}; } diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index e6be1608a1d..4d40c0a25d8 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -89,7 +89,7 @@ public: Utils::FilePath makeCommand(const Utils::Environment &environment) const override; Utils::FilePath compilerCommand() const override; - QList outputParsers() const override; + QList createOutputParsers() const override; QString varsBatArg() const { return m_varsBatArg; } QString varsBat() const { return m_vcvarsBat; } @@ -174,7 +174,7 @@ public: QStringList suggestedMkspecList() const override; void addToEnvironment(Utils::Environment &env) const override; Utils::FilePath compilerCommand() const override; - QList outputParsers() const override; + QList createOutputParsers() const override; QVariantMap toMap() const override; bool fromMap(const QVariantMap &data) override; std::unique_ptr createConfigurationWidget() override; diff --git a/src/plugins/projectexplorer/osparser.cpp b/src/plugins/projectexplorer/osparser.cpp index 3c1a0974462..3ea1dcc1199 100644 --- a/src/plugins/projectexplorer/osparser.cpp +++ b/src/plugins/projectexplorer/osparser.cpp @@ -36,7 +36,7 @@ OsParser::OsParser() setObjectName(QLatin1String("OsParser")); } -IOutputParser::Status OsParser::doHandleLine(const QString &line, Utils::OutputFormat type) +OutputTaskParser::Status OsParser::handleLine(const QString &line, Utils::OutputFormat type) { if (type == Utils::StdOutFormat) { if (Utils::HostOsInfo::isWindowsHost()) { diff --git a/src/plugins/projectexplorer/osparser.h b/src/plugins/projectexplorer/osparser.h index fd0e9dea204..f33551648ab 100644 --- a/src/plugins/projectexplorer/osparser.h +++ b/src/plugins/projectexplorer/osparser.h @@ -33,7 +33,7 @@ namespace ProjectExplorer { -class PROJECTEXPLORER_EXPORT OsParser : public ProjectExplorer::IOutputParser +class PROJECTEXPLORER_EXPORT OsParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -41,7 +41,7 @@ public: OsParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; bool hasFatalErrors() const override { return m_hasFatalError; } bool m_hasFatalError = false; diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index 5ae0c46aed5..8caec11242e 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -102,7 +102,7 @@ TestTerminator::TestTerminator(OutputParserTester *t) : m_tester(t) { } -IOutputParser::Status TestTerminator::doHandleLine(const QString &line, Utils::OutputFormat type) +OutputTaskParser::Status TestTerminator::handleLine(const QString &line, Utils::OutputFormat type) { QTC_CHECK(line.endsWith('\n')); if (type == Utils::StdOutFormat) diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 1a1fff1e659..86dd0481343 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -73,7 +73,7 @@ private: friend class TestTerminator; }; -class TestTerminator : public IOutputParser +class TestTerminator : public OutputTaskParser { Q_OBJECT @@ -81,7 +81,7 @@ public: TestTerminator(OutputParserTester *t); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; OutputParserTester *m_tester = nullptr; }; diff --git a/src/plugins/projectexplorer/parseissuesdialog.cpp b/src/plugins/projectexplorer/parseissuesdialog.cpp index 7696950ddbc..b1a38607e35 100644 --- a/src/plugins/projectexplorer/parseissuesdialog.cpp +++ b/src/plugins/projectexplorer/parseissuesdialog.cpp @@ -151,7 +151,7 @@ static void parse(QFutureInterface &future, const QString &output, void ParseIssuesDialog::accept() { - const QList lineParsers = d->kitChooser.currentKit()->createOutputParsers(); + const QList lineParsers = d->kitChooser.currentKit()->createOutputParsers(); if (lineParsers.isEmpty()) { QMessageBox::critical(this, tr("Cannot Parse"), tr("Cannot parse: The chosen kit does " "not provide an output parser.")); diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 9e8b6c087ca..cc98793bded 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -64,7 +64,7 @@ QString languageId(Language l); } // namespace Deprecated class Abi; -class IOutputParser; +class OutputTaskParser; class ToolChainConfigWidget; class ToolChainFactory; class Kit; @@ -150,7 +150,7 @@ public: Core::Id language() const; virtual Utils::FilePath compilerCommand() const = 0; - virtual QList outputParsers() const = 0; + virtual QList createOutputParsers() const = 0; virtual bool operator ==(const ToolChain &) const; diff --git a/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp b/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp index 6e15b141915..43c9655d836 100644 --- a/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp +++ b/src/plugins/projectexplorer/toolchainsettingsaccessor.cpp @@ -324,7 +324,7 @@ public: void addToEnvironment(Environment &env) const override { Q_UNUSED(env) } FilePath makeCommand(const Environment &) const override { return FilePath::fromString("make"); } FilePath compilerCommand() const override { return Utils::FilePath::fromString("/tmp/test/gcc"); } - QList outputParsers() const override { return {}; } + QList createOutputParsers() const override { return {}; } std::unique_ptr createConfigurationWidget() override { return nullptr; } bool operator ==(const ToolChain &other) const override { if (!ToolChain::operator==(other)) diff --git a/src/plugins/projectexplorer/xcodebuildparser.cpp b/src/plugins/projectexplorer/xcodebuildparser.cpp index 12dcac6f5a2..4b5d9e4c7ef 100644 --- a/src/plugins/projectexplorer/xcodebuildparser.cpp +++ b/src/plugins/projectexplorer/xcodebuildparser.cpp @@ -52,7 +52,7 @@ XcodebuildParser::XcodebuildParser() QTC_CHECK(m_buildRe.isValid()); } -IOutputParser::Status XcodebuildParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status XcodebuildParser::handleLine(const QString &line, OutputFormat type) { const QString lne = rightTrimmed(line); if (type == StdOutFormat) { diff --git a/src/plugins/projectexplorer/xcodebuildparser.h b/src/plugins/projectexplorer/xcodebuildparser.h index c2fce0e4a73..5c91315d74a 100644 --- a/src/plugins/projectexplorer/xcodebuildparser.h +++ b/src/plugins/projectexplorer/xcodebuildparser.h @@ -34,7 +34,7 @@ namespace ProjectExplorer { -class PROJECTEXPLORER_EXPORT XcodebuildParser : public IOutputParser +class PROJECTEXPLORER_EXPORT XcodebuildParser : public OutputTaskParser { Q_OBJECT public: @@ -47,7 +47,7 @@ public: XcodebuildParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; bool hasDetectedRedirection() const override; bool hasFatalErrors() const override { return m_fatalErrorCount > 0; } diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.h b/src/plugins/qbsprojectmanager/qbscleanstep.h index 7af3d61fc72..24aac0008e6 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.h +++ b/src/plugins/qbsprojectmanager/qbscleanstep.h @@ -66,7 +66,6 @@ private: QString m_description; int m_maxProgress; bool m_showCompilerOutput = true; - ProjectExplorer::IOutputParser *m_parser = nullptr; }; class QbsCleanStepFactory : public ProjectExplorer::BuildStepFactory diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.h b/src/plugins/qbsprojectmanager/qbsinstallstep.h index 9df1afaa7ee..1a0a418fc37 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.h +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.h @@ -80,7 +80,6 @@ private: QbsSession *m_session = nullptr; QString m_description; int m_maxProgress; - ProjectExplorer::IOutputParser *m_parser = nullptr; friend class QbsInstallStepConfigWidget; }; diff --git a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp index d5540b7060c..6ff538f70ad 100644 --- a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp @@ -166,18 +166,18 @@ bool QmakeMakeStep::init() setOutputParser(new ProjectExplorer::GnuMakeParser()); ToolChain *tc = ToolChainKitAspect::cxxToolChain(target()->kit()); - IOutputParser *xcodeBuildParser = nullptr; + OutputTaskParser *xcodeBuildParser = nullptr; if (tc && tc->targetAbi().os() == Abi::DarwinOS) { xcodeBuildParser = new XcodebuildParser; appendOutputParser(xcodeBuildParser); } - QList additionalParsers = target()->kit()->createOutputParsers(); + QList additionalParsers = target()->kit()->createOutputParsers(); - // make may cause qmake to be run, add last to make sure // it has a low priority. + // make may cause qmake to be run, add last to make sure it has a low priority. additionalParsers << new QMakeParser; if (xcodeBuildParser) { - for (IOutputParser * const p : qAsConst(additionalParsers)) + for (OutputTaskParser * const p : qAsConst(additionalParsers)) p->setRedirectionDetector(xcodeBuildParser); } appendOutputParsers(additionalParsers); diff --git a/src/plugins/qmakeprojectmanager/qmakeparser.cpp b/src/plugins/qmakeprojectmanager/qmakeparser.cpp index 86a0ffc67b3..20633f397df 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparser.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparser.cpp @@ -40,7 +40,7 @@ QMakeParser::QMakeParser() : m_error(QLatin1String("^(.+):(\\d+):\\s(.+)$")) m_error.setMinimal(true); } -IOutputParser::Status QMakeParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status QMakeParser::handleLine(const QString &line, OutputFormat type) { if (type != Utils::StdErrFormat) return Status::NotHandled; diff --git a/src/plugins/qmakeprojectmanager/qmakeparser.h b/src/plugins/qmakeprojectmanager/qmakeparser.h index 822700efd0b..14c5b20d88f 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparser.h +++ b/src/plugins/qmakeprojectmanager/qmakeparser.h @@ -33,7 +33,7 @@ namespace QmakeProjectManager { -class QMAKEPROJECTMANAGER_EXPORT QMakeParser : public ProjectExplorer::IOutputParser +class QMAKEPROJECTMANAGER_EXPORT QMakeParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -41,7 +41,7 @@ public: QMakeParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; QRegExp m_error; }; diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 5243699afd7..61f554b99d8 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -288,7 +288,7 @@ void QtKitAspect::addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environ version->addToEnvironment(k, env); } -QList QtKitAspect::createOutputParsers(const Kit *k) const +QList QtKitAspect::createOutputParsers(const Kit *k) const { if (qtVersion(k)) return {new Internal::QtTestParser, new QtParser}; diff --git a/src/plugins/qtsupport/qtkitinformation.h b/src/plugins/qtsupport/qtkitinformation.h index e63c75c61e6..dacd3e6f51e 100644 --- a/src/plugins/qtsupport/qtkitinformation.h +++ b/src/plugins/qtsupport/qtkitinformation.h @@ -54,7 +54,7 @@ public: ItemList toUserOutput(const ProjectExplorer::Kit *k) const override; void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const override; - QList createOutputParsers(const ProjectExplorer::Kit *k) const override; + QList createOutputParsers(const ProjectExplorer::Kit *k) const override; void addToMacroExpander(ProjectExplorer::Kit *kit, Utils::MacroExpander *expander) const override; static Core::Id id(); diff --git a/src/plugins/qtsupport/qtparser.cpp b/src/plugins/qtsupport/qtparser.cpp index c3fb0d57107..1c53feb247d 100644 --- a/src/plugins/qtsupport/qtparser.cpp +++ b/src/plugins/qtsupport/qtparser.cpp @@ -43,7 +43,7 @@ QtParser::QtParser() : m_translationRegExp.setMinimal(true); } -IOutputParser::Status QtParser::doHandleLine(const QString &line, Utils::OutputFormat type) +OutputTaskParser::Status QtParser::handleLine(const QString &line, Utils::OutputFormat type) { if (type != Utils::StdErrFormat) return Status::NotHandled; diff --git a/src/plugins/qtsupport/qtparser.h b/src/plugins/qtsupport/qtparser.h index 8fda649bbcf..5f891a2cf31 100644 --- a/src/plugins/qtsupport/qtparser.h +++ b/src/plugins/qtsupport/qtparser.h @@ -34,7 +34,7 @@ namespace QtSupport { // Parser for Qt-specific utilities like moc, uic, etc. -class QTSUPPORT_EXPORT QtParser : public ProjectExplorer::IOutputParser +class QTSUPPORT_EXPORT QtParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT @@ -42,7 +42,7 @@ public: QtParser(); private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; + Status handleLine(const QString &line, Utils::OutputFormat type) override; QRegExp m_mocRegExp; QRegExp m_translationRegExp; diff --git a/src/plugins/qtsupport/qttestparser.cpp b/src/plugins/qtsupport/qttestparser.cpp index be3c2920e04..cf75303658c 100644 --- a/src/plugins/qtsupport/qttestparser.cpp +++ b/src/plugins/qtsupport/qttestparser.cpp @@ -47,7 +47,7 @@ using namespace Utils; namespace QtSupport { namespace Internal { -IOutputParser::Status QtTestParser::doHandleLine(const QString &line, OutputFormat type) +OutputTaskParser::Status QtTestParser::handleLine(const QString &line, OutputFormat type) { if (type != StdOutFormat) return Status::NotHandled; diff --git a/src/plugins/qtsupport/qttestparser.h b/src/plugins/qtsupport/qttestparser.h index d32d7a40f4d..2ed4e78bf9a 100644 --- a/src/plugins/qtsupport/qttestparser.h +++ b/src/plugins/qtsupport/qttestparser.h @@ -31,12 +31,12 @@ namespace QtSupport { namespace Internal { -class QtTestParser : public ProjectExplorer::IOutputParser +class QtTestParser : public ProjectExplorer::OutputTaskParser { Q_OBJECT private: - Status doHandleLine(const QString &line, Utils::OutputFormat type) override; - void doFlush() override { emitCurrentTask(); } + Status handleLine(const QString &line, Utils::OutputFormat type) override; + void flush() override { emitCurrentTask(); } void emitCurrentTask();