aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authortricktron <tgagnaux@gmail.com>2022-02-23 20:32:37 +0100
committerGitHub <noreply@github.com>2022-02-23 20:32:37 +0100
commit5dda097196baa60fc45bb4f300439d791ccb1130 (patch)
tree64398be1c6faa992427c2e976a1347cf8f9d3de3 /src/main
parentddf176c4d9ad16648ea8e2459694d34d6c68e5d7 (diff)
parente45ba9993b9465a088e0ec08a099e65caa993f9e (diff)
downloadfrege-gradle-plugin-5dda097196baa60fc45bb4f300439d791ccb1130.tar.gz
frege-gradle-plugin-5dda097196baa60fc45bb4f300439d791ccb1130.tar.bz2
frege-gradle-plugin-5dda097196baa60fc45bb4f300439d791ccb1130.zip
Merge pull request #23 from tricktron/f-minimal-frege-repl
New Simpler Repl Task
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java71
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java18
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java34
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java84
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java54
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java8
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java41
7 files changed, 177 insertions, 133 deletions
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
index bc3c8f7..a39a07b 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
@@ -3,17 +3,15 @@ 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.logging.LogLevel;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
@@ -28,28 +26,12 @@ import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.PathSensitive;
import org.gradle.api.tasks.PathSensitivity;
import org.gradle.api.tasks.TaskAction;
+import org.gradle.api.tasks.options.Option;
@CacheableTask
public abstract class CompileFregeTask extends DefaultTask {
- private final JavaExec javaExec;
- private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr";
- 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)
- );
- }
- );
- };
+ private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr";
+ private JavaExec javaExec;
@InputFile
@PathSensitive(PathSensitivity.RELATIVE)
@@ -66,7 +48,10 @@ public abstract class CompileFregeTask extends DefaultTask {
public abstract Property<String> getFregeDependencies();
@Input
- public abstract Property<String> getReplSource();
+ @Option(option = "compileItem",
+ description = "The absolute path to the frege file or the module name"
+ )
+ public abstract Property<String> getFregeCompileItem();
@OutputDirectory
public abstract DirectoryProperty getFregeOutputDir();
@@ -82,15 +67,19 @@ public abstract class CompileFregeTask extends DefaultTask {
}
@Internal
- public final Provider<FileTree> getSourceFileTree() {
- return getReplSource().zip(
- getFregeMainSourceDir(),
- excludeReplSourceFile);
+ public final Provider<List<String>> getCompileItems() {
+ return getFregeCompileItem()
+ .map(name ->
+ {
+ return name.isEmpty() ? getFregeSourceFiles().get()
+ : List.of(name);
+ });
}
@Internal
- public final Provider<List<String>> getSourceFiles() {
- return getSourceFileTree()
+ public final Provider<List<String>> getFregeSourceFiles() {
+ return getFregeMainSourceDir()
+ .map(srcDir -> srcDir.getAsFileTree())
.map(tree -> tree.matching(pattern -> pattern.include(FREGE_FILES_GLOB_PATTERN)))
.map(tree -> tree.getFiles().stream()
.map(file -> file.getAbsolutePath())
@@ -111,26 +100,32 @@ public abstract class CompileFregeTask extends DefaultTask {
javaExec = objectFactory.newInstance(JavaExec.class);
}
- private List<String> buildCompilerArgsFromProperties(List<String> directoryArg)
+ private List<String> buildCompilerArgsFromProperties(List<String> targetDirectoryArg)
{
return Stream.of(
getDependencyArg().get(),
getFregeCompilerFlags().get(),
- directoryArg,
+ targetDirectoryArg,
getSourcePathArg().get(),
- getSourceFiles().get())
+ getCompileItems().get())
.filter(lists -> !lists.isEmpty())
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
@TaskAction
- public void compileFrege() {
- List<String> directoryArg = List.of(
+ public void compileFrege()
+ {
+ this.getLogging().captureStandardOutput(LogLevel.LIFECYCLE);
+ List<String> targetDirectoryArg = List.of(
"-d",
- getFregeOutputDir().getAsFile().get().getAbsolutePath());
-
- javaExec.setClasspath(getProject().files(getFregeCompilerJar()))
- .setArgs(buildCompilerArgsFromProperties(directoryArg)).exec();
+ getFregeOutputDir().getAsFile().get().getAbsolutePath()
+ );
+ javaExec.setClasspath(
+ getProject()
+ .files(getFregeCompilerJar()))
+ .setErrorOutput(System.out)
+ .setArgs(buildCompilerArgsFromProperties(targetDirectoryArg))
+ .exec();
}
} \ No newline at end of file
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
index 5bcbf3d..18a9500 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
@@ -9,11 +9,12 @@ import org.gradle.api.file.ProjectLayout;
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 List<String> DEFAULT_COMPILER_FLAGS = List.of("-O", "-make");
+public abstract class FregeExtension
+{
+ public static final String DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR = "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,12 +30,13 @@ public abstract class FregeExtension {
public abstract ListProperty<String> getCompilerFlags();
- public abstract Property<String> getReplSource();
+ public abstract Property<String> getReplModule();
@Inject
- public FregeExtension(ProjectLayout projectLayout) {
+ public FregeExtension(ProjectLayout projectLayout)
+ {
getCompilerDownloadDir()
- .convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY));
+ .convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_COMPILER_DOWNLOAD_DIR));
getMainSourceDir()
.convention(projectLayout.getProjectDirectory().dir(DEFAULT_RELATIVE_SOURCE_DIR));
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
index a318b81..e1f410a 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
@@ -5,8 +5,6 @@ import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.tasks.TaskProvider;
-import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask;
-
public class FregePlugin implements Plugin<Project>
{
public static final String SETUP_FREGE_TASK_NAME = "setupFrege";
@@ -54,7 +52,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("");
+ task.getFregeCompileItem().set("");
}
);
@@ -63,28 +61,15 @@ public class FregePlugin implements Plugin<Project>
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.map(
compileTask ->
{
- compileTask.getReplSource().set(task.getReplSource());
+ compileTask.getFregeCompileItem().set(task.getMainModule());
return compileTask;
- })
- .get());
- task.dependsOn(compileFregeTask);
+ }
+ ));
task.getFregeCompilerJar().set(
setupFregeCompilerTask.get().getFregeCompilerOutputPath());
task.getFregeOutputDir().set(extension.getOutputDir());
@@ -97,18 +82,19 @@ public class FregePlugin implements Plugin<Project>
ReplFregeTask.class,
task ->
{
- task.getReplSource().set(extension.getReplSource());
+ task.getReplModule().set(extension.getReplModule());
task.dependsOn(compileFregeTask.map(
compileTask ->
{
- compileTask.getReplSource().set(task.getReplSource());
+ compileTask.getFregeCompileItem().set(task.getReplModule());
return compileTask;
- })
- .get());
+ }
+ ));
task.getFregeCompilerJar().set(
setupFregeCompilerTask.get().getFregeCompilerOutputPath());
task.getFregeOutputDir().set(extension.getOutputDir());
task.getFregeDependencies().set(implementation.getAsPath());
+ task.getFregeMainSourceDir().set(extension.getMainSourceDir());
}
);
}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
index dd18270..1a47f8f 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java
@@ -1,16 +1,23 @@
package ch.fhnw.thga.gradleplugins;
+import static ch.fhnw.thga.gradleplugins.SharedTaskLogic.extractClassNameFromFregeModuleName;
import org.gradle.api.DefaultTask;
import org.gradle.api.file.DirectoryProperty;
+import org.gradle.api.file.FileTree;
import org.gradle.api.file.RegularFileProperty;
+import org.gradle.api.logging.Logger;
+import org.gradle.api.logging.Logging;
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.TaskAction;
import org.gradle.api.tasks.options.Option;
public abstract class ReplFregeTask extends DefaultTask {
+ private static final Logger LOGGER = Logging.getLogger(ReplFregeTask.class);
public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl";
@InputFile
@@ -22,22 +29,83 @@ public abstract class ReplFregeTask extends DefaultTask {
@InputDirectory
public abstract DirectoryProperty getFregeOutputDir();
+ @InputDirectory
+ public abstract DirectoryProperty getFregeMainSourceDir();
+
@Input
- @Option(option = "replSource",
- description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'")
- public abstract Property<String> getReplSource();
+ @Option(option = "replModule",
+ description = "The full name of the module which you want to load into the repl, e.g. 'my.mod.Name'")
+ public abstract Property<String> getReplModule();
+
+ @Internal
+ public final Provider<String> getReplClassName()
+ {
+ return getReplModule()
+ .map(replSource -> extractClassNameFromFregeModuleName(replSource));
+ }
+
+ @Internal
+ public final Provider<FileTree> getReplClassFiles()
+ {
+ return getFregeOutputDir()
+ .map(outDir -> outDir.getAsFileTree())
+ .map(tree -> tree.matching(
+ pattern -> pattern.include(
+ String.format(
+ "**/%s.class",
+ getReplClassName().get()
+ )
+ )
+ ));
+ }
+
+ @Internal
+ public final Provider<FileTree> getReplJavaFiles()
+ {
+ return getFregeOutputDir()
+ .map(outDir -> outDir.getAsFileTree())
+ .map(tree -> tree.matching(
+ pattern -> pattern.include(
+ String.format(
+ "**/%s.java",
+ getReplClassName().get()
+ )
+ ))
+ );
+ }
+
+ @Internal
+ public final Provider<FileTree> getReplFregeFile()
+ {
+ return getFregeMainSourceDir()
+ .map(outDir -> outDir.getAsFileTree())
+ .map(tree -> tree.matching(
+ pattern -> pattern.include(
+ String.format(
+ "**/%s.fr",
+ getReplClassName().get()
+ )
+ ))
+ );
+ }
@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",
+ public void printStartFregeReplCommand()
+ {
+ getProject().delete(getReplJavaFiles());
+ getProject().delete(getReplClassFiles());
+ LOGGER.lifecycle(
+ "Execute the following command to start the Frege Repl and load the Frege module:");
+ LOGGER.quiet(String.format(
+ "(echo :l %s && cat) | java -cp %s %s",
+ getReplFregeFile().get().getAsPath(),
SharedTaskLogic.setupClasspath(
getProject(),
getFregeDependencies(),
getFregeCompilerJar(),
getFregeOutputDir())
.get().getAsPath(),
- REPL_MAIN_CLASS));
+ REPL_MAIN_CLASS)
+ );
}
}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
index 6bfe72d..c4e17d3 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
@@ -6,6 +6,7 @@ import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
+import java.nio.file.Paths;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
@@ -36,32 +37,59 @@ public abstract class SetupFregeTask extends DefaultTask {
public abstract DirectoryProperty getDownloadDir();
@Internal
- public Provider<String> getFregeVersionJarName() {
+ public Provider<String> getFregeVersionJarName()
+ {
return getVersion().map(version -> "frege" + version + ".jar");
}
@Internal
- final public Provider<String> getDownloadUrl() {
+ final public Provider<String> getDownloadUrl()
+ {
return getFregeVersionJarName()
- .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name));
+ .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name));
}
@OutputFile
- public Provider<RegularFile> getFregeCompilerOutputPath() {
+ public Provider<RegularFile> getFregeCompilerOutputPath()
+ {
return getDownloadDir().file(getFregeVersionJarName());
}
@TaskAction
public void downloadFregeCompiler() {
- String fregeCompilerOutputPath = getFregeCompilerOutputPath().get().getAsFile().getAbsolutePath();
- try (ReadableByteChannel readChannel = Channels.newChannel(new URL(getDownloadUrl().get()).openStream());
- FileOutputStream fregeCompilerOutputStream = new FileOutputStream(fregeCompilerOutputPath);) {
- FileChannel writeChannel = fregeCompilerOutputStream.getChannel();
- writeChannel.transferFrom(readChannel, 0, Long.MAX_VALUE);
- LOGGER.lifecycle(String.format("Successfully downloaded %s to: %s", getFregeVersionJarName().get(),
- fregeCompilerOutputPath));
- } catch (IOException e) {
+ String fregeCompilerOutputPath = getFregeCompilerOutputPath()
+ .get()
+ .getAsFile()
+ .getAbsolutePath();
+ if (Paths
+ .get(fregeCompilerOutputPath)
+ .toFile()
+ .exists()
+ )
+ return;
+
+ try (ReadableByteChannel readChannel = Channels
+ .newChannel(new URL(getDownloadUrl().get())
+ .openStream()
+ );
+ FileOutputStream fregeCompilerOutputStream = new FileOutputStream(
+ fregeCompilerOutputPath))
+ {
+ FileChannel writeChannel = fregeCompilerOutputStream.getChannel();
+ writeChannel.transferFrom(
+ readChannel,
+ 0,
+ Long.MAX_VALUE);
+ LOGGER.lifecycle(
+ String.format(
+ "Successfully downloaded %s to: %s",
+ getFregeVersionJarName().get(),
+ fregeCompilerOutputPath
+ )
+ );
+ } catch (IOException e)
+ {
throw new GradleException(e.getMessage());
}
}
-}
+} \ No newline at end of file
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java
index 57af617..e6191a3 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java
@@ -5,7 +5,8 @@ import org.gradle.api.file.FileCollection;
import org.gradle.api.provider.Provider;
import org.gradle.api.provider.Property;
-public final class SharedTaskLogic {
+public final class SharedTaskLogic
+{
private SharedTaskLogic() {};
public static final Provider<FileCollection> setupClasspath(
@@ -19,4 +20,9 @@ public final class SharedTaskLogic {
: project.files(depsClasspath, paths);
});
}
+
+ public static final String extractClassNameFromFregeModuleName(String moduleName)
+ {
+ return moduleName.substring(moduleName.lastIndexOf(".") + 1);
+ }
}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java
deleted file mode 100644
index 87f4d2b..0000000
--- a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package ch.fhnw.thga.gradleplugins.internal;
-
-import org.gradle.api.DefaultTask;
-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 org.gradle.api.tasks.options.Option;
-
-import ch.fhnw.thga.gradleplugins.SharedTaskLogic;
-
-public abstract class DependencyFregeTask extends DefaultTask {
- @InputFile
- public abstract RegularFileProperty getFregeCompilerJar();
-
- @Input
- public abstract Property<String> getFregeDependencies();
-
- @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() {
- System.out.println(
- SharedTaskLogic.setupClasspath(
- getProject(),
- getFregeDependencies(),
- getFregeCompilerJar(),
- getFregeOutputDir())
- .get().getAsPath());
- }
-}