aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/haskell/haskellproject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/haskell/haskellproject.cpp')
-rw-r--r--plugins/haskell/haskellproject.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/plugins/haskell/haskellproject.cpp b/plugins/haskell/haskellproject.cpp
new file mode 100644
index 0000000..96855ee
--- /dev/null
+++ b/plugins/haskell/haskellproject.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://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 "haskellproject.h"
+
+#include "haskellconstants.h"
+
+#include <coreplugin/iversioncontrol.h>
+#include <coreplugin/vcsmanager.h>
+#include <utils/algorithm.h>
+#include <utils/fileutils.h>
+#include <utils/runextensions.h>
+
+#include <QFile>
+#include <QTextStream>
+
+using namespace ProjectExplorer;
+using namespace Utils;
+
+const char C_HASKELL_PROJECT_ID[] = "Haskell.Project";
+
+namespace Haskell {
+namespace Internal {
+
+static QVector<QString> parseExecutableNames(const FileName &projectFilePath)
+{
+ static const QString EXECUTABLE = "executable";
+ static const int EXECUTABLE_LEN = EXECUTABLE.length();
+ QVector<QString> result;
+ QFile file(projectFilePath.toString());
+ if (file.open(QFile::ReadOnly)) {
+ QTextStream stream(&file);
+ while (!stream.atEnd()) {
+ const QString line = stream.readLine().trimmed();
+ if (line.length() > EXECUTABLE_LEN && line.startsWith(EXECUTABLE)
+ && line.at(EXECUTABLE_LEN).isSpace())
+ result.append(line.mid(EXECUTABLE_LEN + 1).trimmed());
+ }
+ }
+ return result;
+}
+
+HaskellProjectNode::HaskellProjectNode(const FileName &projectFilePath, Core::Id id)
+ : ProjectNode(projectFilePath, id.toString().toLatin1())
+{}
+
+HaskellProject::HaskellProject(const Utils::FileName &fileName)
+ : Project(Constants::C_HASKELL_PROJECT_MIMETYPE, fileName)
+{
+ setId(C_HASKELL_PROJECT_ID);
+ setDisplayName(fileName.toFileInfo().completeBaseName());
+ updateFiles();
+}
+
+bool HaskellProject::isHaskellProject(Project *project)
+{
+ return project && project->id() == C_HASKELL_PROJECT_ID;
+}
+
+HaskellProject *HaskellProject::toHaskellProject(Project *project)
+{
+ if (project && project->id() == C_HASKELL_PROJECT_ID)
+ return static_cast<HaskellProject *>(project);
+ return nullptr;
+}
+
+QList<Core::Id> HaskellProject::availableRunConfigurationIds() const
+{
+ return Utils::transform<QList>(parseExecutableNames(projectFilePath()), [](const QString &exe) {
+ return Core::Id(Constants::C_HASKELL_RUNCONFIG_ID_PREFIX).withSuffix(exe);
+ });
+}
+
+void HaskellProject::updateFiles()
+{
+ emitParsingStarted();
+ FileName projectDir = projectDirectory();
+ const QList<Core::IVersionControl *> versionControls = Core::VcsManager::versionControls();
+ QFuture<QList<FileNode *>> future = Utils::runAsync([this, projectDir, versionControls] {
+ return FileNode::scanForFilesWithVersionControls(
+ projectDir,
+ [this](const FileName &fn) -> FileNode * {
+ if (fn != FileName::fromString(projectFilePath().toString() + ".user"))
+ return new FileNode(fn, FileType::Source, false);
+ else
+ return nullptr;
+ },
+ versionControls);
+ });
+ Utils::onResultReady(future, this, [this](const QList<FileNode *> &nodes) {
+ auto root = new HaskellProjectNode(projectDirectory(), id());
+ root->setDisplayName(displayName());
+ root->addNestedNodes(nodes);
+ setRootProjectNode(root);
+ emitParsingFinished(true);
+ });
+}
+
+} // namespace Internal
+} // namespace Haskell