diff options
Diffstat (limited to 'src/main/java')
3 files changed, 135 insertions, 5 deletions
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index cb2d179..c1fdf12 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -1,10 +1,10 @@ package ch.fhnw.thga.gradleplugins; import org.gradle.api.Plugin; -import org.gradle.api.plugins.BasePlugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.logging.LogLevel; +import org.gradle.api.plugins.BasePlugin; import org.gradle.api.tasks.TaskProvider; public class FregePlugin implements Plugin<Project> @@ -13,7 +13,7 @@ public class FregePlugin implements Plugin<Project> 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 INIT_FREGE_TASK_NAME = "initFrege"; 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"; @@ -32,6 +32,16 @@ public class FregePlugin implements Plugin<Project> project.getPlugins().apply(BasePlugin.class); + project.getTasks().register( + INIT_FREGE_TASK_NAME, + InitFregeTask.class, + task -> + { + task.getFregeMainSourceDir().set(extension.getMainSourceDir()); + task.getFregeModuleName().set("examples.HelloFrege"); + } + ); + TaskProvider<SetupFregeTask> setupFregeCompilerTask = project.getTasks().register( SETUP_FREGE_TASK_NAME, diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java new file mode 100644 index 0000000..c2926aa --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java @@ -0,0 +1,94 @@ +package ch.fhnw.thga.gradleplugins; + +import static ch.fhnw.thga.gradleplugins.SharedTaskLogic.NEW_LINE; + +import java.io.IOException; +import java.nio.file.Paths; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFile; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.options.Option; + +public abstract class InitFregeTask extends DefaultTask +{ + private static final String EMPTY_LINE = ""; + private static final String HELLO_FREGE_CODE_WITHOUT_MODULE = String.join(NEW_LINE, + "import Test.QuickCheck", + EMPTY_LINE, + "--- compute digit sum", + "digitSum :: Integer -> Integer", + "digitSum 0 = 0", + "digitSum n = (n `rem` 10) + digitSum (n `div` 10)", + EMPTY_LINE, + "--- compute the reduced digit sum", + "reducedDigitSum :: Integer -> Integer", + "reducedDigitSum n = if n < 10 then n else reducedDigitSum $ digitSum n", + EMPTY_LINE, + "main = do", + " let answer = digitSum 6666666", + " println $", + " \"The answer to life, the universe and everything is \"", + " ++ show answer", + " ++ \".\"", + EMPTY_LINE, + "{--", + " The property 'p_reduced_digit_sum_of_multiple_of_9_is_always_9' checks", + " the famous claim that every multiple of 9 number has also the reduced", + " digit sum of 9, e.g. 9, 27, 36, ...", + "-}", + "p_reduced_digit_sum_of_multiple_of_9_is_always_9 = ", + " property $ \\(n :: Integer) -> (n > 0) ==> (reducedDigitSum $ 9 * n) == 9" + ); + + @Input + @Option(option = "moduleName", + description = "The module name of the default frege file" + ) + public abstract Property<String> getFregeModuleName(); + + @Internal + final Provider<String> getHelloFregeCode() + { + return getFregeModuleName() + .map(moduleName -> String.format("module %s where", moduleName)) + .map(firstLine -> String.join( + NEW_LINE, + firstLine, HELLO_FREGE_CODE_WITHOUT_MODULE + )); + } + + @Internal + final Provider<String> getFregeFilePath() + { + return getFregeModuleName() + .map(moduleName -> moduleName.replace(".", "/")) + .map(filePath -> Paths.get(filePath).normalize()) + .map(filePath -> String.format("%s.fr", filePath.toString())); + } + + @OutputDirectory + public abstract DirectoryProperty getFregeMainSourceDir(); + + @OutputFile + final Provider<RegularFile> getHelloFregeFile() + { + return getFregeMainSourceDir().file(getFregeFilePath()); + } + + @TaskAction + public void writeHelloFregeFile() throws IOException + { + SharedTaskLogic.writeToFile( + getHelloFregeFile().get().getAsFile(), + getHelloFregeCode().get() + ); + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java index e6191a3..ad4a252 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java @@ -1,5 +1,10 @@ package ch.fhnw.thga.gradleplugins; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + import org.gradle.api.Project; import org.gradle.api.file.FileCollection; import org.gradle.api.provider.Provider; @@ -9,6 +14,8 @@ public final class SharedTaskLogic { private SharedTaskLogic() {}; + public static final String NEW_LINE = System.lineSeparator(); + public static final Provider<FileCollection> setupClasspath( Project project, Property<String> dependencies, @@ -21,8 +28,27 @@ public final class SharedTaskLogic }); } - public static final String extractClassNameFromFregeModuleName(String moduleName) - { + public static final String extractClassNameFromFregeModuleName(String moduleName) + { return moduleName.substring(moduleName.lastIndexOf(".") + 1); - } + } + + private static void writeFile( + File destination, + String content, + boolean append) + throws IOException + { + try (BufferedWriter output = new BufferedWriter(new FileWriter(destination, append))) + { + output.write(content); + } + + } + + static File writeToFile(File destination, String content) throws IOException + { + writeFile(destination, content, false); + return destination; + } } |