diff options
Diffstat (limited to 'src/main')
3 files changed, 77 insertions, 1 deletions
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(); } } |