aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--gradle.properties2
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java43
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java30
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java7
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java1
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java2
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/Builder.java2
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java8
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java9
10 files changed, 83 insertions, 22 deletions
diff --git a/README.md b/README.md
index 76b42c5..db18bea 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@ Optional configuration parameters inside `build.gradle`:
- compilerDownloadDir: defaults to `<projectRoot>/lib`
- mainSourceDir: defaults to `<projectRoot>/src/main/frege`
- outputDir: defaults to `<projectRoot>/build/classes/main/frege`
+- compilerFlags: defaults to `['-O', '-make']`
diff --git a/gradle.properties b/gradle.properties
index 52f90fe..8d4b418 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,2 +1,2 @@
group = ch.fhnw.thga
-version = 1.1.0-alpha \ No newline at end of file
+version = 1.2.0-alpha \ No newline at end of file
diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
index aa3a7f4..b06c6c8 100644
--- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
+++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java
@@ -35,11 +35,9 @@ import org.junit.jupiter.api.io.TempDir;
@TestInstance(Lifecycle.PER_CLASS)
public class FregePluginFunctionalTest {
private static final String NEW_LINE = System.lineSeparator();
- private static final String SIMPLE_FREGE_CODE = String.join(NEW_LINE,
- "module ch.fhnw.thga.Completion where", NEW_LINE,
- NEW_LINE,
- " complete :: Int -> (Int, String)", NEW_LINE,
- " complete i = (i, \"Frege rocks\")", NEW_LINE);
+ private static final String SIMPLE_FREGE_CODE = String.join(NEW_LINE, "module ch.fhnw.thga.Completion where",
+ NEW_LINE, NEW_LINE, " complete :: Int -> (Int, String)", NEW_LINE, " complete i = (i, \"Frege rocks\")",
+ NEW_LINE);
private static FregeDTOBuilder fregeBuilder;
@@ -77,10 +75,10 @@ public class FregePluginFunctionalTest {
.buildAndFail();
}
- private void setupDefaultFregeProjectStructure(String fregeCode, String fregeFileName, String buildFileConfig) throws Exception {
+ private void setupDefaultFregeProjectStructure(String fregeCode, String fregeFileName, String buildFileConfig)
+ throws Exception {
Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege")));
- File fregeFile = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", fregeFileName))
- .toFile();
+ File fregeFile = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", fregeFileName)).toFile();
writeToFile(fregeFile, fregeCode);
appendToFile(buildFile, buildFileConfig);
}
@@ -164,6 +162,27 @@ public class FregePluginFunctionalTest {
}
@Test
+ void given_frege_code_and_many_compiler_flags() throws Exception {
+ String completionFr = "Completion.fr";
+ String buildConfigWithCompilerFlags = createFregeSection(
+ fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
+ .compilerFlags("['-v', '-make', '-O', '-hints']").build());
+ setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, buildConfigWithCompilerFlags);
+
+ BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME);
+
+ assertTrue(project.getTasks().getByName(COMPILE_FREGE_TASK_NAME) instanceof CompileFregeTask);
+ assertEquals(SUCCESS, result.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome());
+ assertTrue(new File(
+ testProjectDir.getAbsolutePath() + "/build/classes/main/frege/ch/fhnw/thga/Completion.java")
+ .exists());
+ assertTrue(new File(
+ testProjectDir.getAbsolutePath() + "/build/classes/main/frege/ch/fhnw/thga/Completion.class")
+ .exists());
+
+ }
+
+ @Test
void given_frege_code_in_custom_source_dir_and_custom_output_dir_and_minimal_build_file_config()
throws Exception {
Path customMainSourceDir = testProjectDir.toPath().resolve(Paths.get("src", "frege"));
@@ -196,8 +215,7 @@ public class FregePluginFunctionalTest {
" main = do", NEW_LINE, " println \"Frege rocks\"", NEW_LINE);
String mainFr = "Main.fr";
String buildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
- .mainModule("'ch.fhnw.thga.Main'").build());
+ fregeBuilder.version("'3.25.84'").release("'3.25alpha'").mainModule("'ch.fhnw.thga.Main'").build());
setupDefaultFregeProjectStructure(fregeCode, mainFr, buildFileConfig);
BuildResult result = runGradleTask(RUN_FREGE_TASK_NAME);
@@ -209,9 +227,8 @@ public class FregePluginFunctionalTest {
@Test
void given_frege_file_without_main_function() throws Exception {
String completionFr = "Completion.fr";
- String buildFileConfig = createFregeSection(
- fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
- .mainModule("'ch.fhnw.thga.Completion'").build());
+ String buildFileConfig = createFregeSection(fregeBuilder.version("'3.25.84'").release("'3.25alpha'")
+ .mainModule("'ch.fhnw.thga.Completion'").build());
setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, buildFileConfig);
BuildResult result = runAndFailGradleTask(RUN_FREGE_TASK_NAME);
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
index 6ba6212..020bc7c 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java
@@ -1,6 +1,9 @@
package ch.fhnw.thga.gradleplugins;
+import java.util.Collection;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.inject.Inject;
@@ -8,8 +11,12 @@ import org.gradle.api.DefaultTask;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.model.ObjectFactory;
+import org.gradle.api.provider.ListProperty;
+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.JavaExec;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;
@@ -23,9 +30,22 @@ public abstract class CompileFregeTask extends DefaultTask {
@InputDirectory
public abstract DirectoryProperty getFregeMainSourceDir();
+ @Input
+ public abstract ListProperty<String> getFregeCompilerFlags();
+
@OutputDirectory
public abstract DirectoryProperty getFregeOutputDir();
+ @Internal
+ public final Provider<String> getFregeMainSourcePath() {
+ return getFregeMainSourceDir().map(srcDir -> srcDir.getAsFile().getAbsolutePath());
+ }
+
+ @Internal
+ public final Provider<List<String>> getSourcePathArg() {
+ return getFregeMainSourcePath().map(srcPath -> List.of("-sp", srcPath));
+ }
+
@Inject
public CompileFregeTask(ObjectFactory objectFactory) {
javaExec = objectFactory.newInstance(JavaExec.class);
@@ -33,9 +53,11 @@ public abstract class CompileFregeTask extends DefaultTask {
@TaskAction
public void compileFrege() {
- String fregeMainSourceDir = getFregeMainSourceDir().getAsFile().get().getAbsolutePath();
- List<String> args = List.of("-v", "-d", getFregeOutputDir().get().getAsFile().getAbsolutePath(), "-sp",
- fregeMainSourceDir, fregeMainSourceDir);
- javaExec.setClasspath(getProject().files(getFregeCompilerJar())).setArgs(args).exec();
+ List<String> directoryArg = List.of("-d", getFregeOutputDir().getAsFile().get().getAbsolutePath());
+ List<String> compilerArgs = Stream
+ .of(getFregeCompilerFlags().get(), directoryArg, getSourcePathArg().get(),
+ List.of(getFregeMainSourcePath().get()))
+ .flatMap(Collection::stream).collect(Collectors.toList());
+ javaExec.setClasspath(getProject().files(getFregeCompilerJar())).setArgs(compilerArgs).exec();
}
}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
index 139429b..f134ec2 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java
@@ -1,9 +1,12 @@
package ch.fhnw.thga.gradleplugins;
+import java.util.List;
+
import javax.inject.Inject;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.ProjectLayout;
+import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
public abstract class FregeExtension {
@@ -22,11 +25,13 @@ public abstract class FregeExtension {
public abstract DirectoryProperty getOutputDir();
+ public abstract ListProperty<String> getCompilerFlags();
+
@Inject
public FregeExtension(ProjectLayout projectLayout) {
getCompilerDownloadDir().convention(projectLayout.getProjectDirectory().dir(DEFAULT_DOWNLOAD_DIRECTORY));
getMainSourceDir().convention(projectLayout.getProjectDirectory());
getOutputDir().convention(projectLayout.getBuildDirectory().dir(DEFAULT_RELATIVE_OUTPUT_DIR));
+ getCompilerFlags().convention(List.of("-O", "-make"));
}
-
}
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
index 8c50a5f..4ac6c61 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java
@@ -27,6 +27,7 @@ public class FregePlugin implements Plugin<Project> {
task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath());
task.getFregeMainSourceDir().set(extension.getMainSourceDir());
task.getFregeOutputDir().set(extension.getOutputDir());
+ task.getFregeCompilerFlags().set(extension.getCompilerFlags());
});
project.getTasks().register(RUN_FREGE_TASK_NAME, RunFregeTask.class, task -> {
task.dependsOn(compileFregeTask);
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
index 7f92053..1b12f56 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
@@ -40,7 +40,7 @@ public abstract class SetupFregeTask extends DefaultTask {
}
@Internal
- public Provider<String> getDownloadUrl() {
+ final public Provider<String> getDownloadUrl() {
return getFregeVersionJarName()
.map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name));
}
diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java
index c8aeda7..9293e44 100644
--- a/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java
+++ b/src/test/java/ch/fhnw/thga/gradleplugins/Builder.java
@@ -13,5 +13,7 @@ public interface Builder {
Builder mainModule(String mainModule);
+ Builder compilerFlags(String compilerFlags);
+
FregeDTO build();
}
diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java
index 271d07b..a09bd27 100644
--- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java
+++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTO.java
@@ -13,15 +13,17 @@ public class FregeDTO {
public final String mainSourceDir;
public final String outputDir;
public final String mainModule;
+ public final String compilerFlags;
public FregeDTO(String version, String release, String compilerDownloadDir, String mainSourceDir,
- String outputDir, String mainModule) {
+ String outputDir, String mainModule, String compilerFlags) {
this.version = version;
this.release = release;
this.compilerDownloadDir = compilerDownloadDir;
this.mainSourceDir = mainSourceDir;
this.outputDir = outputDir;
this.mainModule = mainModule;
+ this.compilerFlags = compilerFlags;
}
public String getVersion() {
@@ -48,6 +50,10 @@ public class FregeDTO {
return mainModule;
}
+ public String getCompilerFlags() {
+ return compilerFlags;
+ }
+
private String getFieldValue(Field field) {
try {
return field.get(this).toString();
diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java
index f4cabbe..910114e 100644
--- a/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java
+++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregeDTOBuilder.java
@@ -7,6 +7,7 @@ public final class FregeDTOBuilder implements Builder {
private String mainSourceDir = "";
private String outputDir = "";
private String mainModule = "";
+ private String compilerFlags = "";
private static volatile FregeDTOBuilder instance;
@@ -65,7 +66,13 @@ public final class FregeDTOBuilder implements Builder {
return this;
}
+ @Override
+ public Builder compilerFlags(String compilerFlags) {
+ this.compilerFlags = compilerFlags;
+ return this;
+ }
+
public FregeDTO build() {
- return new FregeDTO(version, release, compilerDownloadDir, mainSourceDir, outputDir, mainModule);
+ return new FregeDTO(version, release, compilerDownloadDir, mainSourceDir, outputDir, mainModule, compilerFlags);
}
}