aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/CouscousCompiler.java7
-rw-r--r--src/main/java/org/zwobble/couscous/Frontend.java11
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java8
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java32
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());
}