diff options
| author | tricktron <tgagnaux@gmail.com> | 2022-02-23 20:32:37 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-23 20:32:37 +0100 |
| commit | 5dda097196baa60fc45bb4f300439d791ccb1130 (patch) | |
| tree | 64398be1c6faa992427c2e976a1347cf8f9d3de3 /src/main | |
| parent | ddf176c4d9ad16648ea8e2459694d34d6c68e5d7 (diff) | |
| parent | e45ba9993b9465a088e0ec08a099e65caa993f9e (diff) | |
| download | frege-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')
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()); - } -} |
