From 1f13c769f57d4670cee462b6cf741efb5f5a8cd6 Mon Sep 17 00:00:00 2001
From: Thibault Gagnaux <tgagnaux@gmail.com>
Date: Wed, 24 Nov 2021 10:27:00 +0100
Subject: feat: adds `replFrege` task

---
 .../ch/fhnw/thga/gradleplugins/FregePlugin.java    |  8 ++++
 .../ch/fhnw/thga/gradleplugins/ReplFregeTask.java  | 54 ++++++++++++++++++++++
 .../ch/fhnw/thga/gradleplugins/RunFregeTask.java   | 16 ++++++-
 3 files changed, 77 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java

(limited to 'src/main/java/ch')

diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
index ac6ba94..5fc89b2 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
@@ -9,6 +9,7 @@ public class FregePlugin implements Plugin<Project> {
     public static final String SETUP_FREGE_TASK_NAME = "setupFrege";
     public static final String COMPILE_FREGE_TASK_NAME = "compileFrege";
     public static final String RUN_FREGE_TASK_NAME = "runFrege";
+    public static final String REPL_FREGE_TASK_NAME = "replFrege";
     public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege";
     public static final String FREGE_EXTENSION_NAME = "frege";
     public static final String FREGE_IMPLEMENTATION_SCOPE = "implementation";
@@ -38,6 +39,13 @@ public class FregePlugin implements Plugin<Project> {
             task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath());
             task.getFregeOutputDir().set(extension.getOutputDir());
             task.getMainModule().set(extension.getMainModule());
+            task.getFregeDependencies().set(implementation.getAsPath());
+        });
+        project.getTasks().register(REPL_FREGE_TASK_NAME, ReplFregeTask.class, task -> {
+            task.dependsOn(compileFregeTask);
+            task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath());
+            task.getFregeOutputDir().set(extension.getOutputDir());
+            task.getFregeDependencies().set(implementation.getAsPath());
         });
     }
 }
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
new file mode 100644
index 0000000..9ee14df
--- /dev/null
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
@@ -0,0 +1,54 @@
+package ch.fhnw.thga.gradleplugins;
+
+import javax.inject.Inject;
+
+import org.gradle.api.DefaultTask;
+import org.gradle.api.file.DirectoryProperty;
+import org.gradle.api.file.FileCollection;
+import org.gradle.api.file.RegularFileProperty;
+import org.gradle.api.logging.Logger;
+import org.gradle.api.logging.Logging;
+import org.gradle.api.model.ObjectFactory;
+import org.gradle.api.provider.Property;
+import org.gradle.api.provider.Provider;
+import org.gradle.api.tasks.Input;
+import org.gradle.api.tasks.InputDirectory;
+import org.gradle.api.tasks.InputFile;
+import org.gradle.api.tasks.Internal;
+import org.gradle.api.tasks.JavaExec;
+import org.gradle.api.tasks.TaskAction;
+
+public abstract class ReplFregeTask extends DefaultTask {
+    public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class);
+    public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl";
+
+    private final JavaExec javaExec;
+
+    @InputFile
+    public abstract RegularFileProperty getFregeCompilerJar();
+
+    @InputDirectory
+    public abstract DirectoryProperty getFregeOutputDir();
+
+    @Input
+    public abstract Property<String> getFregeDependencies();
+
+    @Internal
+    public final Provider<FileCollection> getClasspath() {
+        return getFregeDependencies().map(depsClasspath -> {
+            return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar(), getFregeOutputDir())
+                    : getProject().files(getFregeCompilerJar(), getFregeOutputDir(), depsClasspath);
+        });
+    }
+
+    @Inject
+    public ReplFregeTask(ObjectFactory objectFactory) {
+        javaExec = objectFactory.newInstance(JavaExec.class);
+    }
+
+    @TaskAction
+    public void startFregeRepl() {
+        javaExec.getMainClass().set(REPL_MAIN_CLASS);
+        javaExec.setClasspath(getClasspath().get()).exec();
+    }
+}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java
index d27816c..41ac2a3 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java
@@ -4,14 +4,17 @@ import javax.inject.Inject;
 
 import org.gradle.api.DefaultTask;
 import org.gradle.api.file.DirectoryProperty;
+import org.gradle.api.file.FileCollection;
 import org.gradle.api.file.RegularFileProperty;
 import org.gradle.api.logging.Logger;
 import org.gradle.api.logging.Logging;
 import org.gradle.api.model.ObjectFactory;
 import org.gradle.api.provider.Property;
+import org.gradle.api.provider.Provider;
 import org.gradle.api.tasks.Input;
 import org.gradle.api.tasks.InputDirectory;
 import org.gradle.api.tasks.InputFile;
+import org.gradle.api.tasks.Internal;
 import org.gradle.api.tasks.JavaExec;
 import org.gradle.api.tasks.TaskAction;
 import org.gradle.api.tasks.options.Option;
@@ -30,6 +33,17 @@ public abstract class RunFregeTask extends DefaultTask {
     @Option(option = "mainModule", description = "The full name of the Frege module with a main function, e.g. 'my.mod.Name'")
     public abstract Property<String> getMainModule();
 
+    @Input
+    public abstract Property<String> getFregeDependencies();
+
+    @Internal
+    public final Provider<FileCollection> getClasspath() {
+        return getFregeDependencies().map(depsClasspath -> {
+            return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar(), getFregeOutputDir())
+                    : getProject().files(getFregeCompilerJar(), getFregeOutputDir(), depsClasspath);
+        });
+    }
+
     @Inject
     public RunFregeTask(ObjectFactory objectFactory) {
         javaExec = objectFactory.newInstance(JavaExec.class);
@@ -38,6 +52,6 @@ public abstract class RunFregeTask extends DefaultTask {
     @TaskAction
     public void runFrege() {
         javaExec.getMainClass().set(getMainModule());
-        javaExec.setClasspath(getProject().files(getFregeCompilerJar(), getFregeOutputDir())).exec();
+        javaExec.setClasspath(getClasspath().get()).exec();
     }
 }
-- 
cgit