aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/nim/project/nimcompilerbuildstep.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/nim/project/nimcompilerbuildstep.cpp')
-rw-r--r--src/plugins/nim/project/nimcompilerbuildstep.cpp78
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);