aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ch/fhnw
diff options
context:
space:
mode:
authorThibault Gagnaux <tgagnaux@gmail.com>2021-12-20 20:48:17 +0100
committerThibault Gagnaux <tgagnaux@gmail.com>2021-12-21 11:22:55 +0100
commit992490f446720cd4cf4fb9aadff463b2328a8287 (patch)
treee3a19d9c3f79a6ba9620f05da2db8ba5421df9ff /src/main/java/ch/fhnw
parentf923b4f8733003d55891dd4da25d849c81c4933c (diff)
downloadfrege-gradle-plugin-992490f446720cd4cf4fb9aadff463b2328a8287.tar.gz
frege-gradle-plugin-992490f446720cd4cf4fb9aadff463b2328a8287.tar.bz2
frege-gradle-plugin-992490f446720cd4cf4fb9aadff463b2328a8287.zip
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.
Diffstat (limited to 'src/main/java/ch/fhnw')
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java62
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java20
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java28
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java6
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java5
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java6
6 files changed, 108 insertions, 19 deletions
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<String, Directory, FileTree> 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<String> getFregeDependencies();
+ @Input
+ public abstract Property<String> getReplSource();
+
@OutputDirectory
public abstract DirectoryProperty getFregeOutputDir();
@@ -58,9 +80,26 @@ public abstract class CompileFregeTask extends DefaultTask {
}
@Internal
+ public final Provider<FileTree> getSourceFileTree() {
+ return getReplSource().zip(
+ getFregeMainSourceDir(),
+ excludeReplSourceFile);
+ }
+
+ @Internal
+ public final Provider<List<String>> getSourceFiles() {
+ return getSourceFileTree()
+ .map(tree -> tree.getFiles().stream()
+ .map(file -> file.getAbsolutePath())
+ .collect(Collectors.toList())
+ );
+ }
+
+ @Internal
public final Provider<List<String>> 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<String> buildCompilerArgsFromProperties(List<String> 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<String> buildCompilerArgsFromProperties(List<String> 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<String> directoryArg = List.of("-d", getFregeOutputDir().getAsFile().get().getAbsolutePath());
+ List<String> 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<String> DEFAULT_COMPILER_FLAGS = List.of("-O", "-make");
public abstract Property<String> getVersion();
@@ -29,11 +29,19 @@ public abstract class FregeExtension {
public abstract ListProperty<String> getCompilerFlags();
+ public abstract Property<String> 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<Project>
@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<Project>
task.getDownloadDir().set(extension.getCompilerDownloadDir());
});
- TaskProvider<CompileFregeTask> compileFregeTask =
+ TaskProvider<CompileFregeTask> compileFregeTask =
project.getTasks().register(
COMPILE_FREGE_TASK_NAME,
CompileFregeTask.class,
@@ -49,6 +54,7 @@ public class FregePlugin implements Plugin<Project>
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<Project>
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<Project>
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<String> 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<String> 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<String> getReplSource();
+
@TaskAction
public void fregeDependencies() {