aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java14
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java94
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SharedTaskLogic.java32
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;
+ }
}