From 813ab013c4b15ed44615313b7c15d405bdeadb91 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Mon, 20 Dec 2021 10:55:27 +0100 Subject: feat: adds `outputDir` to classpath --- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 32 +++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) (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 18016f3..2f1f41a 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -5,19 +5,20 @@ import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.FileCollection; import org.gradle.api.file.RegularFile; +import org.gradle.api.file.SourceDirectorySet; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskProvider; import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask; public class FregePlugin implements Plugin { - 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 DEPS_FREGE_TASK_NAME = "depsFrege"; - public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; - public static final String FREGE_EXTENSION_NAME = "frege"; + 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 DEPS_FREGE_TASK_NAME = "depsFrege"; + 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"; private FileCollection setupClasspath(Project project, Configuration dependencies, @@ -32,7 +33,8 @@ public class FregePlugin implements Plugin { @Override public void apply(Project project) { Configuration implementation = project.getConfigurations().create(FREGE_IMPLEMENTATION_SCOPE); - FregeExtension extension = project.getExtensions().create(FREGE_EXTENSION_NAME, FregeExtension.class); + FregeExtension extension = project.getExtensions().create(FREGE_EXTENSION_NAME, FregeExtension.class); + TaskProvider setupFregeCompilerTask = project.getTasks().register(SETUP_FREGE_TASK_NAME, SetupFregeTask.class, task -> { task.getVersion().set(extension.getVersion()); @@ -49,6 +51,7 @@ public class FregePlugin implements Plugin { task.getFregeCompilerFlags().set(extension.getCompilerFlags()); task.getFregeDependencies().set(implementation.getAsPath()); }); + project.getTasks().register(RUN_FREGE_TASK_NAME, RunFregeTask.class, task -> { task.dependsOn(compileFregeTask); task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); @@ -56,16 +59,19 @@ public class FregePlugin implements Plugin { task.getMainModule().set(extension.getMainModule()); task.getFregeDependencies().set(implementation.getAsPath()); }); + project.getTasks().register(DEPS_FREGE_TASK_NAME, DependencyFregeTask.class, task -> { - task.dependsOn(setupFregeCompilerTask); + task.dependsOn(compileFregeTask); task.getClasspath().setFrom(setupClasspath(project, implementation, - setupFregeCompilerTask.get().getFregeCompilerOutputPath())); + setupFregeCompilerTask.get().getFregeCompilerOutputPath()), extension.getOutputDir().get()); }); + project.getTasks().register(REPL_FREGE_TASK_NAME, ReplFregeTask.class, task -> { - task.dependsOn(setupFregeCompilerTask); - task.getFregeClasspath().setFrom(setupClasspath(project, implementation, - setupFregeCompilerTask.get().getFregeCompilerOutputPath())); + task.dependsOn(compileFregeTask); + task.getFregeClasspath() + .setFrom(setupClasspath(project, implementation, setupFregeCompilerTask.get().getFregeCompilerOutputPath()) + , extension.getOutputDir().get()); }); } } -- cgit From f923b4f8733003d55891dd4da25d849c81c4933c Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Mon, 20 Dec 2021 12:54:53 +0100 Subject: refactor: extracts common `setupClasspath` logic to util class --- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 98 +++++++++++++--------- .../ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 28 +++++-- .../ch/fhnw/thga/gradleplugins/RunFregeTask.java | 22 ++--- .../fhnw/thga/gradleplugins/SharedTaskLogic.java | 22 +++++ .../internal/DependencyFregeTask.java | 29 +++++-- 5 files changed, 136 insertions(+), 63 deletions(-) create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.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 2f1f41a..e00b297 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -3,15 +3,12 @@ package ch.fhnw.thga.gradleplugins; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.file.FileCollection; -import org.gradle.api.file.RegularFile; -import org.gradle.api.file.SourceDirectorySet; -import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskProvider; import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask; -public class FregePlugin implements Plugin { +public class FregePlugin implements Plugin +{ 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"; @@ -21,57 +18,78 @@ public class FregePlugin implements Plugin { public static final String FREGE_EXTENSION_NAME = "frege"; public static final String FREGE_IMPLEMENTATION_SCOPE = "implementation"; - private FileCollection setupClasspath(Project project, Configuration dependencies, - Provider fregeCompilerJar) { - if (dependencies.isEmpty()) { - return project.files(fregeCompilerJar); - } else { - return project.files(fregeCompilerJar, dependencies.getAsPath()); - } - } - @Override public void apply(Project project) { Configuration implementation = project.getConfigurations().create(FREGE_IMPLEMENTATION_SCOPE); - FregeExtension extension = project.getExtensions().create(FREGE_EXTENSION_NAME, FregeExtension.class); + FregeExtension extension = project.getExtensions().create( + FREGE_EXTENSION_NAME, + FregeExtension.class); - TaskProvider setupFregeCompilerTask = project.getTasks().register(SETUP_FREGE_TASK_NAME, - SetupFregeTask.class, task -> { + TaskProvider setupFregeCompilerTask = + project.getTasks().register( + SETUP_FREGE_TASK_NAME, + SetupFregeTask.class, + task -> + { task.getVersion().set(extension.getVersion()); task.getRelease().set(extension.getRelease()); task.getDownloadDir().set(extension.getCompilerDownloadDir()); }); - TaskProvider compileFregeTask = project.getTasks().register(COMPILE_FREGE_TASK_NAME, - CompileFregeTask.class, task -> { + TaskProvider compileFregeTask = + project.getTasks().register( + COMPILE_FREGE_TASK_NAME, + CompileFregeTask.class, + task -> + { task.dependsOn(setupFregeCompilerTask); - task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); + task.getFregeCompilerJar().set( + setupFregeCompilerTask.get().getFregeCompilerOutputPath()); task.getFregeMainSourceDir().set(extension.getMainSourceDir()); task.getFregeOutputDir().set(extension.getOutputDir()); task.getFregeCompilerFlags().set(extension.getCompilerFlags()); task.getFregeDependencies().set(implementation.getAsPath()); - }); + } + ); - project.getTasks().register(RUN_FREGE_TASK_NAME, RunFregeTask.class, task -> { - task.dependsOn(compileFregeTask); - task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); - task.getFregeOutputDir().set(extension.getOutputDir()); - task.getMainModule().set(extension.getMainModule()); - task.getFregeDependencies().set(implementation.getAsPath()); - }); + project.getTasks().register( + RUN_FREGE_TASK_NAME, + RunFregeTask.class, + task -> + { + task.dependsOn(compileFregeTask); + task.getFregeCompilerJar().set( + setupFregeCompilerTask.get().getFregeCompilerOutputPath()); + task.getFregeOutputDir().set(extension.getOutputDir()); + task.getMainModule().set(extension.getMainModule()); + task.getFregeDependencies().set(implementation.getAsPath()); + } + ); - project.getTasks().register(DEPS_FREGE_TASK_NAME, - DependencyFregeTask.class, task -> { - task.dependsOn(compileFregeTask); - task.getClasspath().setFrom(setupClasspath(project, implementation, - setupFregeCompilerTask.get().getFregeCompilerOutputPath()), extension.getOutputDir().get()); - }); + project.getTasks().register( + DEPS_FREGE_TASK_NAME, + DependencyFregeTask.class, + task -> + { + task.dependsOn(compileFregeTask); + task.getFregeCompilerJar().set( + setupFregeCompilerTask.get().getFregeCompilerOutputPath()); + task.getFregeOutputDir().set(extension.getOutputDir()); + task.getFregeDependencies().set(implementation.getAsPath()); + } + ); - project.getTasks().register(REPL_FREGE_TASK_NAME, ReplFregeTask.class, task -> { - task.dependsOn(compileFregeTask); - task.getFregeClasspath() - .setFrom(setupClasspath(project, implementation, setupFregeCompilerTask.get().getFregeCompilerOutputPath()) - , extension.getOutputDir().get()); - }); + 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 index 81da1cd..475946b 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -1,19 +1,37 @@ package ch.fhnw.thga.gradleplugins; import org.gradle.api.DefaultTask; -import org.gradle.api.file.ConfigurableFileCollection; -import org.gradle.api.tasks.InputFiles; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; public abstract class ReplFregeTask extends DefaultTask { public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl"; - @InputFiles - public abstract ConfigurableFileCollection getFregeClasspath(); + @InputFile + public abstract RegularFileProperty getFregeCompilerJar(); + + @Input + public abstract Property getFregeDependencies(); + + @InputDirectory + public abstract DirectoryProperty getFregeOutputDir(); @TaskAction public void printStartFregeReplCommand() { System.out.println("Execute the following command to start the Frege Repl:"); - System.out.println(String.format("java -cp %s %s", getFregeClasspath().getAsPath(), REPL_MAIN_CLASS)); + System.out.println(String.format( + "java -cp %s %s", + SharedTaskLogic.setupClasspath( + getProject(), + getFregeDependencies(), + getFregeCompilerJar(), + getFregeOutputDir()) + .get().getAsPath(), + REPL_MAIN_CLASS)); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java index 41ac2a3..f993af4 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java @@ -4,17 +4,14 @@ 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,20 +27,13 @@ public abstract class RunFregeTask extends DefaultTask { public abstract DirectoryProperty getFregeOutputDir(); @Input - @Option(option = "mainModule", description = "The full name of the Frege module with a main function, e.g. 'my.mod.Name'") + @Option(option = "mainModule", + description = "The full name of the Frege module with a main function, e.g. 'my.mod.Name'") public abstract Property getMainModule(); @Input public abstract Property getFregeDependencies(); - @Internal - public final Provider 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); @@ -52,6 +42,12 @@ public abstract class RunFregeTask extends DefaultTask { @TaskAction public void runFrege() { javaExec.getMainClass().set(getMainModule()); - javaExec.setClasspath(getClasspath().get()).exec(); + javaExec.setClasspath( + SharedTaskLogic.setupClasspath( + getProject(), + getFregeDependencies(), + getFregeCompilerJar(), + getFregeOutputDir()) + .get()).exec(); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java new file mode 100644 index 0000000..57af617 --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java @@ -0,0 +1,22 @@ +package ch.fhnw.thga.gradleplugins; + +import org.gradle.api.Project; +import org.gradle.api.file.FileCollection; +import org.gradle.api.provider.Provider; +import org.gradle.api.provider.Property; + +public final class SharedTaskLogic { + private SharedTaskLogic() {}; + + public static final Provider setupClasspath( + Project project, + Property dependencies, + Object... paths) + { + return dependencies.map(depsClasspath -> + { + return depsClasspath.isEmpty() ? project.files(paths) + : project.files(depsClasspath, paths); + }); + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java index 34b33a2..4459bd4 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java @@ -1,16 +1,35 @@ package ch.fhnw.thga.gradleplugins.internal; import org.gradle.api.DefaultTask; -import org.gradle.api.file.ConfigurableFileCollection; -import org.gradle.api.tasks.InputFiles; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; +import ch.fhnw.thga.gradleplugins.SharedTaskLogic; + public abstract class DependencyFregeTask extends DefaultTask { - @InputFiles - public abstract ConfigurableFileCollection getClasspath(); + @InputFile + public abstract RegularFileProperty getFregeCompilerJar(); + + @Input + public abstract Property getFregeDependencies(); + + @InputDirectory + public abstract DirectoryProperty getFregeOutputDir(); + @TaskAction public void fregeDependencies() { - System.out.println(getClasspath().getAsPath()); + System.out.println( + SharedTaskLogic.setupClasspath( + getProject(), + getFregeDependencies(), + getFregeCompilerJar(), + getFregeOutputDir()) + .get().getAsPath()); } } -- cgit From 992490f446720cd4cf4fb9aadff463b2328a8287 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Mon, 20 Dec 2021 20:48:17 +0100 Subject: feat: adds `replSource` property and command-line option The `replSource` property specifies the frege source file that you want to load into the repl. It is excluded in the `fregeCompile` task so that we don't get two java class files (one from `compileFrege` and one from the fregeRepl `:l` command) that shadow each other on the classpath. As a result, we can make interactive changes to the `replSource` file and use the `:r` reload command to see them. --- .../fhnw/thga/gradleplugins/CompileFregeTask.java | 62 +++++++++++++++++++--- .../ch/fhnw/thga/gradleplugins/FregeExtension.java | 20 ++++--- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 28 ++++++++-- .../ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 6 +++ .../ch/fhnw/thga/gradleplugins/SetupFregeTask.java | 5 +- .../internal/DependencyFregeTask.java | 6 +++ 6 files changed, 108 insertions(+), 19 deletions(-) (limited to 'src/main/java/ch') diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java index e81fe76..32ce798 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java @@ -3,13 +3,16 @@ package ch.fhnw.thga.gradleplugins; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.function.BiFunction; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; import org.gradle.api.DefaultTask; +import org.gradle.api.file.Directory; import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.FileTree; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; @@ -29,6 +32,22 @@ import org.gradle.api.tasks.TaskAction; @CacheableTask public abstract class CompileFregeTask extends DefaultTask { private final JavaExec javaExec; + private static final BiFunction excludeReplSourceFile = + (String replSource, + Directory srcDir) -> + { + if (replSource.isEmpty()) return srcDir.getAsFileTree(); + return srcDir.getAsFileTree().matching( + pattern -> + { + pattern.exclude( + String.format( + "**/%s", + replSource) + ); + } + ); + }; @InputFile @PathSensitive(PathSensitivity.RELATIVE) @@ -44,6 +63,9 @@ public abstract class CompileFregeTask extends DefaultTask { @Input public abstract Property getFregeDependencies(); + @Input + public abstract Property getReplSource(); + @OutputDirectory public abstract DirectoryProperty getFregeOutputDir(); @@ -57,10 +79,27 @@ public abstract class CompileFregeTask extends DefaultTask { return getFregeMainSourcePath().map(srcPath -> List.of("-sp", srcPath)); } + @Internal + public final Provider getSourceFileTree() { + return getReplSource().zip( + getFregeMainSourceDir(), + excludeReplSourceFile); + } + + @Internal + public final Provider> getSourceFiles() { + return getSourceFileTree() + .map(tree -> tree.getFiles().stream() + .map(file -> file.getAbsolutePath()) + .collect(Collectors.toList()) + ); + } + @Internal public final Provider> getDependencyArg() { return getFregeDependencies().map(depsClasspath -> { - return depsClasspath.isEmpty() ? Collections.emptyList() : List.of("-fp", depsClasspath); + return depsClasspath.isEmpty() ? Collections.emptyList() + : List.of("-fp", depsClasspath); }); } @@ -69,16 +108,25 @@ public abstract class CompileFregeTask extends DefaultTask { javaExec = objectFactory.newInstance(JavaExec.class); } - private List buildCompilerArgsFromProperties(List directoryArg) { - return Stream - .of(getDependencyArg().get(), getFregeCompilerFlags().get(), directoryArg, getSourcePathArg().get(), - List.of(getFregeMainSourcePath().get())) - .filter(lists -> !lists.isEmpty()).flatMap(Collection::stream).collect(Collectors.toList()); + private List buildCompilerArgsFromProperties(List directoryArg) + { + return Stream.of( + getDependencyArg().get(), + getFregeCompilerFlags().get(), + directoryArg, + getSourcePathArg().get(), + getSourceFiles().get()) + .filter(lists -> !lists.isEmpty()) + .flatMap(Collection::stream) + .collect(Collectors.toList()); } @TaskAction public void compileFrege() { - List directoryArg = List.of("-d", getFregeOutputDir().getAsFile().get().getAbsolutePath()); + List directoryArg = List.of( + "-d", + getFregeOutputDir().getAsFile().get().getAbsolutePath()); + javaExec.setClasspath(getProject().files(getFregeCompilerJar())) .setArgs(buildCompilerArgsFromProperties(directoryArg)).exec(); } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java index ea02493..7b186a8 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -10,9 +10,9 @@ import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; public abstract class FregeExtension { - public static final String DEFAULT_DOWNLOAD_DIRECTORY = "lib"; - public static final String DEFAULT_RELATIVE_OUTPUT_DIR = "classes/main/frege"; - public static final String DEFAULT_RELATIVE_SOURCE_DIR = "src/main/frege"; + public static final String DEFAULT_DOWNLOAD_DIRECTORY = "lib"; + public static final String DEFAULT_RELATIVE_OUTPUT_DIR = "classes/main/frege"; + public static final String DEFAULT_RELATIVE_SOURCE_DIR = "src/main/frege"; public static final List DEFAULT_COMPILER_FLAGS = List.of("-O", "-make"); public abstract Property getVersion(); @@ -29,11 +29,19 @@ public abstract class FregeExtension { public abstract ListProperty getCompilerFlags(); + public abstract Property getReplModule(); + @Inject public FregeExtension(ProjectLayout projectLayout) { - getCompilerDownloadDir().convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY)); - getMainSourceDir().convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_SOURCE_DIR)); - getOutputDir().convention(projectLayout.getBuildDirectory().dir(DEFAULT_RELATIVE_OUTPUT_DIR)); + getCompilerDownloadDir() + .convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY)); + + getMainSourceDir() + .convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_SOURCE_DIR)); + + getOutputDir() + .convention(projectLayout.getBuildDirectory().dir(DEFAULT_RELATIVE_OUTPUT_DIR)); + getCompilerFlags().convention(DEFAULT_COMPILER_FLAGS); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index e00b297..26c52c8 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -20,8 +20,13 @@ public class FregePlugin implements Plugin @Override public void apply(Project project) { - Configuration implementation = project.getConfigurations().create(FREGE_IMPLEMENTATION_SCOPE); - FregeExtension extension = project.getExtensions().create( + Configuration implementation = project + .getConfigurations() + .create(FREGE_IMPLEMENTATION_SCOPE); + + FregeExtension extension = project + .getExtensions() + .create( FREGE_EXTENSION_NAME, FregeExtension.class); @@ -36,7 +41,7 @@ public class FregePlugin implements Plugin task.getDownloadDir().set(extension.getCompilerDownloadDir()); }); - TaskProvider compileFregeTask = + TaskProvider compileFregeTask = project.getTasks().register( COMPILE_FREGE_TASK_NAME, CompileFregeTask.class, @@ -49,6 +54,7 @@ public class FregePlugin implements Plugin task.getFregeOutputDir().set(extension.getOutputDir()); task.getFregeCompilerFlags().set(extension.getCompilerFlags()); task.getFregeDependencies().set(implementation.getAsPath()); + task.getReplSource().set(""); } ); @@ -71,6 +77,13 @@ public class FregePlugin implements Plugin DependencyFregeTask.class, task -> { + task.dependsOn(compileFregeTask.map( + compileTask -> + { + compileTask.getReplSource().set(task.getReplSource()); + return compileTask; + }) + .get()); task.dependsOn(compileFregeTask); task.getFregeCompilerJar().set( setupFregeCompilerTask.get().getFregeCompilerOutputPath()); @@ -84,7 +97,14 @@ public class FregePlugin implements Plugin ReplFregeTask.class, task -> { - task.dependsOn(compileFregeTask); + task.getReplSource().set(extension.getReplModule()); + task.dependsOn(compileFregeTask.map( + compileTask -> + { + compileTask.getReplSource().set(task.getReplSource()); + return compileTask; + }) + .get()); task.getFregeCompilerJar().set( setupFregeCompilerTask.get().getFregeCompilerOutputPath()); task.getFregeOutputDir().set(extension.getOutputDir()); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java index 475946b..dd18270 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -8,6 +8,7 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.options.Option; public abstract class ReplFregeTask extends DefaultTask { public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl"; @@ -21,6 +22,11 @@ public abstract class ReplFregeTask extends DefaultTask { @InputDirectory public abstract DirectoryProperty getFregeOutputDir(); + @Input + @Option(option = "replSource", + description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'") + public abstract Property getReplSource(); + @TaskAction public void printStartFregeReplCommand() { System.out.println("Execute the following command to start the Frege Repl:"); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java index 1b12f56..6bfe72d 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java @@ -21,9 +21,10 @@ import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; public abstract class SetupFregeTask extends DefaultTask { - public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); + public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); - private static final String FREGE_GITHUB_URL_PREFIX = "https://github.com/Frege/frege/releases/download"; + private static final String FREGE_GITHUB_URL_PREFIX = + "https://github.com/Frege/frege/releases/download"; @Input public abstract Property getVersion(); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java index 4459bd4..87f4d2b 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java @@ -8,6 +8,7 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.options.Option; import ch.fhnw.thga.gradleplugins.SharedTaskLogic; @@ -21,6 +22,11 @@ public abstract class DependencyFregeTask extends DefaultTask { @InputDirectory public abstract DirectoryProperty getFregeOutputDir(); + @Input + @Option(option = "replSource", + description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'") + public abstract Property getReplSource(); + @TaskAction public void fregeDependencies() { -- cgit From 4aa7c0a5e3935c730d82b091ab23ae7cd8a2db71 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Tue, 21 Dec 2021 13:51:57 +0100 Subject: chore: renames `replModule` -> `replSource` and updates readme --- src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java | 2 +- src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/ch') diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java index 7b186a8..5bcbf3d 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -29,7 +29,7 @@ public abstract class FregeExtension { public abstract ListProperty getCompilerFlags(); - public abstract Property getReplModule(); + public abstract Property getReplSource(); @Inject public FregeExtension(ProjectLayout projectLayout) { diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 26c52c8..a318b81 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -97,7 +97,7 @@ public class FregePlugin implements Plugin ReplFregeTask.class, task -> { - task.getReplSource().set(extension.getReplModule()); + task.getReplSource().set(extension.getReplSource()); task.dependsOn(compileFregeTask.map( compileTask -> { -- cgit From 6fe74444e80d68dffa61e2e57b78092e50a54772 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Tue, 21 Dec 2021 15:42:28 +0100 Subject: fix: only compile `*.fr` files --- src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/main/java/ch') diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java index 32ce798..bc3c8f7 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java @@ -32,7 +32,9 @@ import org.gradle.api.tasks.TaskAction; @CacheableTask public abstract class CompileFregeTask extends DefaultTask { private final JavaExec javaExec; - private static final BiFunction excludeReplSourceFile = + private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr"; + private static final BiFunction + excludeReplSourceFile = (String replSource, Directory srcDir) -> { @@ -89,6 +91,7 @@ public abstract class CompileFregeTask extends DefaultTask { @Internal public final Provider> getSourceFiles() { return getSourceFileTree() + .map(tree -> tree.matching(pattern -> pattern.include(FREGE_FILES_GLOB_PATTERN))) .map(tree -> tree.getFiles().stream() .map(file -> file.getAbsolutePath()) .collect(Collectors.toList()) -- cgit