diff options
4 files changed, 44 insertions, 14 deletions
diff --git a/src/main/java/org/zwobble/couscous/CouscousCompiler.java b/src/main/java/org/zwobble/couscous/CouscousCompiler.java index a1e0787..39c1709 100644 --- a/src/main/java/org/zwobble/couscous/CouscousCompiler.java +++ b/src/main/java/org/zwobble/couscous/CouscousCompiler.java @@ -5,17 +5,18 @@ import java.nio.file.Path; import java.util.List; import org.zwobble.couscous.ast.ClassNode; -import org.zwobble.couscous.frontends.java.JavaFrontend; public class CouscousCompiler { + private final Frontend frontend; private final Backend backend; - public CouscousCompiler(Backend backend) { + public CouscousCompiler(Frontend frontend, Backend backend) { + this.frontend = frontend; this.backend = backend; } public void compileDirectory(Path path) throws IOException { - List<ClassNode> classes = JavaFrontend.readSourceDirectory(path); + List<ClassNode> classes = frontend.readSourceDirectory(path); backend.compile(classes); } diff --git a/src/main/java/org/zwobble/couscous/Frontend.java b/src/main/java/org/zwobble/couscous/Frontend.java new file mode 100644 index 0000000..9d823bc --- /dev/null +++ b/src/main/java/org/zwobble/couscous/Frontend.java @@ -0,0 +1,11 @@ +package org.zwobble.couscous; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +import org.zwobble.couscous.ast.ClassNode; + +public interface Frontend { + List<ClassNode> readSourceDirectory(Path path) throws IOException; +} diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java index f58e6af..2a842c9 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java @@ -6,18 +6,20 @@ import java.nio.file.Path; import java.util.List; import java.util.stream.Stream; +import org.zwobble.couscous.Frontend; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.util.ExtraLists; -public class JavaFrontend { - public static List<ClassNode> readSourceDirectory(Path directoryPath) throws IOException { +public class JavaFrontend implements Frontend { + @Override + public List<ClassNode> readSourceDirectory(Path directoryPath) throws IOException { JavaReader reader = new JavaReader(); return ExtraLists.map( findJavaFiles(directoryPath), javaFile -> reader.readClassFromFile(directoryPath, javaFile)); } - private static Stream<Path> findJavaFiles(Path directoryPath) throws IOException { + private Stream<Path> findJavaFiles(Path directoryPath) throws IOException { return Files.walk(directoryPath) .filter(path -> path.toFile().isFile() && path.toString().endsWith(".java")); } diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java index d844360..271c529 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java @@ -10,7 +10,6 @@ import java.util.List; import org.junit.Test; import org.zwobble.couscous.CouscousCompiler; -import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.backends.python.PythonBackend; import org.zwobble.couscous.frontends.java.JavaFrontend; @@ -52,27 +51,41 @@ public class JavaToPythonTests { public void recursiveFactorial() throws Exception { assertEquals( value(720), - execProgram( + execTestProgram( "recursive-factorial", TypeName.of("com.example.RecursiveFactorial"), "factorial", asList(value(6)))); } - private PrimitiveValue execProgram( - String directory, + private PrimitiveValue execTestProgram( + String directoryName, TypeName type, String methodName, List<PrimitiveValue> arguments) throws IOException, InterruptedException { Path path = pathForResource( - "/java/" + directory + "/" + type.getQualifiedName().replace(".", "/") + ".java"); + "/java/" + directoryName + "/" + type.getQualifiedName().replace(".", "/") + ".java"); + + return execProgram( + directoryName(path, type.getQualifiedName().split(".").length), + type, + methodName, + arguments); + } + + private PrimitiveValue execProgram( + Path directory, + TypeName type, + String methodName, + List<PrimitiveValue> arguments) throws IOException, InterruptedException { Path directoryPath = Files.createTempDirectory(null); try { CouscousCompiler compiler = new CouscousCompiler( + new JavaFrontend(), new PythonBackend(directoryPath, "couscous")); - compiler.compileDirectory(directoryName(path, type.getQualifiedName().split(".").length)); + compiler.compileDirectory(directory); return PythonMethodRunner.runFunction(directoryPath, type, methodName, arguments); } finally { deleteRecursively(directoryPath.toFile()); @@ -97,8 +110,11 @@ public class JavaToPythonTests { try { Files.createDirectories(directoryPath.resolve("com/example")); Files.write(directoryPath.resolve("com/example/Example.java"), asList(javaClass)); - List<ClassNode> classNodes = JavaFrontend.readSourceDirectory(directoryPath); - return new PythonMethodRunner().runMethod(classNodes, TypeName.of("com.example.Example"), "main", asList()); + return execProgram( + directoryPath, + TypeName.of("com.example.Example"), + "main", + asList()); } finally { deleteRecursively(directoryPath.toFile()); } |
