summaryrefslogtreecommitdiff
path: root/src/plugins/nim/project/nimblebuildstep.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/nim/project/nimblebuildstep.cpp')
-rw-r--r--src/plugins/nim/project/nimblebuildstep.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/plugins/nim/project/nimblebuildstep.cpp b/src/plugins/nim/project/nimblebuildstep.cpp
new file mode 100644
index 0000000000..940c3e91eb
--- /dev/null
+++ b/src/plugins/nim/project/nimblebuildstep.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) Filippo Cucchetto <filippocucchetto@gmail.com>
+** Contact: http://www.qt.io/licensing
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "nimblebuildstep.h"
+#include "nimblebuildstepwidget.h"
+#include "nimbletaskstepwidget.h"
+#include "nimconstants.h"
+#include "nimbleproject.h"
+
+#include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/ioutputparser.h>
+#include <projectexplorer/processparameters.h>
+#include <projectexplorer/projectexplorerconstants.h>
+
+#include <QRegularExpression>
+#include <QStandardPaths>
+
+using namespace Nim;
+using namespace ProjectExplorer;
+using namespace Utils;
+
+namespace {
+
+class NimParser : public IOutputParser
+{
+public:
+ void stdOutput(const QString &line) final
+ {
+ parseLine(line.trimmed());
+ IOutputParser::stdOutput(line);
+ }
+
+ void stdError(const QString &line) final
+ {
+ parseLine(line.trimmed());
+ IOutputParser::stdError(line);
+ }
+
+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);
+ if (!match.hasMatch())
+ return;
+ 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;
+
+ Task::TaskType type = Task::Unknown;
+
+ if (warning.match(message).hasMatch())
+ type = Task::Warning;
+ else if (error.match(message).hasMatch())
+ type = Task::Error;
+ else
+ return;
+
+ Task task(type,
+ message,
+ Utils::FilePath::fromUserInput(filename),
+ lineNumber,
+ ProjectExplorer::Constants::TASK_CATEGORY_COMPILE);
+ emit addTask(task);
+ }
+};
+
+}
+
+NimbleBuildStep::NimbleBuildStep(BuildStepList *parentList)
+ : AbstractProcessStep(parentList, Constants::C_NIMBLEBUILDSTEP_ID)
+{
+ setDefaultDisplayName(tr(Constants::C_NIMBLEBUILDSTEP_DISPLAY));
+ setDisplayName(tr(Constants::C_NIMBLEBUILDSTEP_DISPLAY));
+ QTC_ASSERT(buildConfiguration(), return);
+ QObject::connect(buildConfiguration(), &BuildConfiguration::buildTypeChanged, this, &NimbleBuildStep::resetArguments);
+ QObject::connect(this, &NimbleBuildStep::argumentsChanged, this, &NimbleBuildStep::onArgumentsChanged);
+ resetArguments();
+}
+
+bool NimbleBuildStep::init()
+{
+ auto parser = new NimParser();
+ parser->setWorkingDirectory(project()->projectDirectory());
+ setOutputParser(parser);
+
+ ProcessParameters* params = processParameters();
+ params->setEnvironment(buildConfiguration()->environment());
+ params->setMacroExpander(buildConfiguration()->macroExpander());
+ params->setWorkingDirectory(project()->projectDirectory());
+ params->setCommandLine({QStandardPaths::findExecutable("nimble"), {"build", m_arguments}});
+ return AbstractProcessStep::init();
+}
+
+BuildStepConfigWidget *NimbleBuildStep::createConfigWidget()
+{
+ return new NimbleBuildStepWidget(this);
+}
+
+QString NimbleBuildStep::arguments() const
+{
+ return m_arguments;
+}
+
+void NimbleBuildStep::setArguments(const QString &args)
+{
+ if (m_arguments == args)
+ return;
+ m_arguments = args;
+ emit argumentsChanged(args);
+}
+
+void NimbleBuildStep::resetArguments()
+{
+ setArguments(defaultArguments());
+}
+
+bool NimbleBuildStep::fromMap(const QVariantMap &map)
+{
+ m_arguments = map.value(Constants::C_NIMBLEBUILDSTEP_ARGUMENTS, defaultArguments()).toString();
+ return AbstractProcessStep::fromMap(map);
+}
+
+QVariantMap NimbleBuildStep::toMap() const
+{
+ auto map = AbstractProcessStep::toMap();
+ map[Constants::C_NIMBLEBUILDSTEP_ARGUMENTS] = m_arguments;
+ return map;
+}
+
+QString NimbleBuildStep::defaultArguments() const
+{
+ QTC_ASSERT(buildConfiguration(), return {}; );
+ switch (buildConfiguration()->buildType()) {
+ case ProjectExplorer::BuildConfiguration::Debug:
+ return "--debugger:native";
+ case ProjectExplorer::BuildConfiguration::Unknown:
+ case ProjectExplorer::BuildConfiguration::Profile:
+ case ProjectExplorer::BuildConfiguration::Release:
+ default:
+ return "";
+ }
+}
+
+void NimbleBuildStep::onArgumentsChanged()
+{
+ ProcessParameters* params = processParameters();
+ params->setCommandLine({QStandardPaths::findExecutable("nimble"), {"build", m_arguments}});
+}
+
+NimbleBuildStepFactory::NimbleBuildStepFactory()
+{
+ registerStep<NimbleBuildStep>(Constants::C_NIMBLEBUILDSTEP_ID);
+ setDisplayName(NimbleBuildStep::tr("Nimble Build"));
+ setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+ setSupportedConfiguration(Constants::C_NIMBLEBUILDCONFIGURATION_ID);
+ setRepeatable(true);
+}