diff options
10 files changed, 83 insertions, 22 deletions
@@ -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); } } |