diff options
Diffstat (limited to 'src/plugins/nim/project/nimcompilerbuildstep.cpp')
-rw-r--r-- | src/plugins/nim/project/nimcompilerbuildstep.cpp | 78 |
1 files changed, 30 insertions, 48 deletions
diff --git a/src/plugins/nim/project/nimcompilerbuildstep.cpp b/src/plugins/nim/project/nimcompilerbuildstep.cpp index 5159e45946..2e8a53ee3f 100644 --- a/src/plugins/nim/project/nimcompilerbuildstep.cpp +++ b/src/plugins/nim/project/nimcompilerbuildstep.cpp @@ -45,40 +45,24 @@ using namespace Utils; namespace Nim { -class NimParser : public ProjectExplorer::IOutputParser +class NimParser : public ProjectExplorer::OutputTaskParser { -public: - void stdOutput(const QString &line) final + Result handleLine(const QString &lne, Utils::OutputFormat) override { - parseLine(line.trimmed()); - IOutputParser::stdOutput(line); - } - - void stdError(const QString &line) final - { - parseLine(line.trimmed()); - IOutputParser::stdError(line); - } + const QString line = lne.trimmed(); + static const QRegularExpression regex("(.+.nim)\\((\\d+), (\\d+)\\) (.+)"); + static const QRegularExpression warning("(Warning):(.*)"); + static const QRegularExpression error("(Error):(.*)"); -private: - void parseLine(const QString &line) - { - static QRegularExpression regex("(.+.nim)\\((\\d+), (\\d+)\\) (.+)", - QRegularExpression::OptimizeOnFirstUsageOption); - static QRegularExpression warning("(Warning):(.*)", - QRegularExpression::OptimizeOnFirstUsageOption); - static QRegularExpression error("(Error):(.*)", - QRegularExpression::OptimizeOnFirstUsageOption); - - QRegularExpressionMatch match = regex.match(line); + const QRegularExpressionMatch match = regex.match(line); if (!match.hasMatch()) - return; + return Status::NotHandled; const QString filename = match.captured(1); bool lineOk = false; const int lineNumber = match.captured(2).toInt(&lineOk); const QString message = match.captured(4); if (!lineOk) - return; + return Status::NotHandled; Task::TaskType type = Task::Unknown; @@ -87,13 +71,18 @@ private: else if (error.match(message).hasMatch()) type = Task::Error; else - return; - - emit addTask(CompileTask(type, message, FilePath::fromUserInput(filename), lineNumber)); + return Status::NotHandled; + + const CompileTask t(type, message, absoluteFilePath(FilePath::fromUserInput(filename)), + lineNumber); + LinkSpecs linkSpecs; + addLinkSpecForAbsoluteFilePath(linkSpecs, t.file, t.line, match, 1); + scheduleTask(t, 1); + return {Status::Done, linkSpecs}; } }; -NimCompilerBuildStep::NimCompilerBuildStep(BuildStepList *parentList, Core::Id id) +NimCompilerBuildStep::NimCompilerBuildStep(BuildStepList *parentList, Utils::Id id) : AbstractProcessStep(parentList, id) { setDefaultDisplayName(tr(Constants::C_NIMCOMPILERBUILDSTEP_DISPLAY)); @@ -106,18 +95,17 @@ NimCompilerBuildStep::NimCompilerBuildStep(BuildStepList *parentList, Core::Id i this, &NimCompilerBuildStep::updateProcessParameters); connect(this, &NimCompilerBuildStep::outFilePathChanged, bc, &NimBuildConfiguration::outFilePathChanged); - connect(bc->target()->project(), &ProjectExplorer::Project::fileListChanged, + connect(project(), &ProjectExplorer::Project::fileListChanged, this, &NimCompilerBuildStep::updateTargetNimFile); updateProcessParameters(); } -bool NimCompilerBuildStep::init() +void NimCompilerBuildStep::setupOutputFormatter(OutputFormatter *formatter) { - setOutputParser(new NimParser()); - if (IOutputParser *parser = target()->kit()->createOutputParser()) - appendOutputParser(parser); - outputParser()->setWorkingDirectory(processParameters()->effectiveWorkingDirectory()); - return AbstractProcessStep::init(); + formatter->addLineParser(new NimParser); + formatter->addLineParsers(target()->kit()->createOutputParsers()); + formatter->addSearchDir(processParameters()->effectiveWorkingDirectory()); + AbstractProcessStep::setupOutputFormatter(formatter); } BuildStepConfigWidget *NimCompilerBuildStep::createConfigWidget() @@ -208,17 +196,13 @@ void NimCompilerBuildStep::updateProcessParameters() void NimCompilerBuildStep::updateOutFilePath() { - auto bc = qobject_cast<NimBuildConfiguration *>(buildConfiguration()); - QTC_ASSERT(bc, return); const QString targetName = Utils::HostOsInfo::withExecutableSuffix(m_targetNimFile.toFileInfo().baseName()); - setOutFilePath(bc->buildDirectory().pathAppended(targetName)); + setOutFilePath(buildDirectory().pathAppended(targetName)); } void NimCompilerBuildStep::updateWorkingDirectory() { - auto bc = qobject_cast<NimBuildConfiguration *>(buildConfiguration()); - QTC_ASSERT(bc, return); - processParameters()->setWorkingDirectory(bc->buildDirectory()); + processParameters()->setWorkingDirectory(buildDirectory()); } void NimCompilerBuildStep::updateCommand() @@ -257,9 +241,7 @@ void NimCompilerBuildStep::updateCommand() void NimCompilerBuildStep::updateEnvironment() { - auto bc = qobject_cast<NimBuildConfiguration *>(buildConfiguration()); - QTC_ASSERT(bc, return); - processParameters()->setEnvironment(bc->environment()); + processParameters()->setEnvironment(buildEnvironment()); } void NimCompilerBuildStep::updateTargetNimFile() @@ -321,7 +303,7 @@ void NimPlugin::testNimParser_data() QTest::newRow("Parse error string") << QString::fromLatin1("main.nim(23, 1) Error: undeclared identifier: 'x'") << OutputParserTester::STDERR - << QString("") << QString("main.nim(23, 1) Error: undeclared identifier: 'x'\n") + << QString() << QString() << Tasks({CompileTask(Task::Error, "Error: undeclared identifier: 'x'", FilePath::fromUserInput("main.nim"), 23)}) @@ -330,7 +312,7 @@ void NimPlugin::testNimParser_data() QTest::newRow("Parse warning string") << QString::fromLatin1("lib/pure/parseopt.nim(56, 34) Warning: quoteIfContainsWhite is deprecated [Deprecated]") << OutputParserTester::STDERR - << QString("") << QString("lib/pure/parseopt.nim(56, 34) Warning: quoteIfContainsWhite is deprecated [Deprecated]\n") + << QString() << QString() << Tasks({CompileTask(Task::Warning, "Warning: quoteIfContainsWhite is deprecated [Deprecated]", FilePath::fromUserInput("lib/pure/parseopt.nim"), 56)}) @@ -340,7 +322,7 @@ void NimPlugin::testNimParser_data() void NimPlugin::testNimParser() { OutputParserTester testbench; - testbench.appendOutputParser(new NimParser); + testbench.addLineParser(new NimParser); QFETCH(QString, input); QFETCH(OutputParserTester::Channel, inputChannel); QFETCH(Tasks, tasks); |