diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-08 08:28:42 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-08 08:28:42 +0000 |
| commit | 17072b4d14dad00acac247508e35b52c0233170b (patch) | |
| tree | 828e8741714def549479267ba1c8c44ea542683c /src | |
| parent | b1f3af70685985974fafaeb8f3df991d158d2a01 (diff) | |
Allow multiple source paths to be set
Diffstat (limited to 'src')
8 files changed, 33 insertions, 29 deletions
diff --git a/src/main/java/org/zwobble/couscous/CouscousCompiler.java b/src/main/java/org/zwobble/couscous/CouscousCompiler.java index da9852f..9c909ac 100644 --- a/src/main/java/org/zwobble/couscous/CouscousCompiler.java +++ b/src/main/java/org/zwobble/couscous/CouscousCompiler.java @@ -5,18 +5,19 @@ 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 JavaFrontend frontend; private final Backend backend; - public CouscousCompiler(Frontend frontend, Backend backend) { + public CouscousCompiler(JavaFrontend frontend, Backend backend) { this.frontend = frontend; this.backend = backend; } - public void compileDirectory(Path sourceRoot, Path path) throws IOException { - List<ClassNode> classes = frontend.readSourceDirectory(sourceRoot, path); + public void compileDirectory(List<Path> sourcePaths, Path path) throws IOException { + List<ClassNode> classes = frontend.readSourceDirectory(sourcePaths, path); backend.compile(classes); } diff --git a/src/main/java/org/zwobble/couscous/Frontend.java b/src/main/java/org/zwobble/couscous/Frontend.java deleted file mode 100644 index b400356..0000000 --- a/src/main/java/org/zwobble/couscous/Frontend.java +++ /dev/null @@ -1,11 +0,0 @@ -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 sourceRoot, 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 ca71954..5ab2678 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java @@ -1,7 +1,6 @@ package org.zwobble.couscous.frontends.java; import com.google.common.collect.Multimaps; -import org.zwobble.couscous.Frontend; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.Node; import org.zwobble.couscous.ast.VariableDeclaration; @@ -20,12 +19,11 @@ import static org.zwobble.couscous.util.ExtraLists.eagerFlatMap; import static org.zwobble.couscous.util.ExtraLists.flatMap; import static org.zwobble.couscous.util.ExtraStreams.toStream; -public class JavaFrontend implements Frontend { - @Override - public List<ClassNode> readSourceDirectory(Path sourceRoot, Path directoryPath) throws IOException { +public class JavaFrontend { + public List<ClassNode> readSourceDirectory(List<Path> sourcePaths, Path directoryPath) throws IOException { List<ClassNode> classNodes = flatMap( findJavaFiles(directoryPath), - javaFile -> JavaReader.readClassFromFile(sourceRoot, javaFile)); + javaFile -> JavaReader.readClassFromFile(sourcePaths, javaFile)); ensureDeclarationsAreUnique(classNodes); return classNodes; } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java index c740b9d..9de85cc 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java @@ -6,13 +6,20 @@ import java.nio.CharBuffer; import java.nio.file.Files; import java.nio.file.Path; import java.util.Hashtable; +import java.util.List; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; import com.google.common.base.Charsets; +import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Iterables.transform; +import static java.util.Arrays.asList; + public class JavaParser { private final ASTParser parser; @@ -29,12 +36,19 @@ public class JavaParser { parser.setResolveBindings(true); } - public CompilationUnit parseCompilationUnit(Path root, Path sourcePath) throws IOException { - parser.setUnitName("/" + root.relativize(sourcePath).toString()); + public CompilationUnit parseCompilationUnit(List<Path> sourcePaths, Path sourcePath) throws IOException { + parser.setUnitName(sourcePath.toString()); + + String[] sourcePathArguments = Iterables.toArray( + concat( + ImmutableList.of("/usr/lib/jvm/java-8-openjdk-amd64/jre/src.zip"), + transform(sourcePaths, Object::toString)), + String.class); + parser.setEnvironment( new String[]{"/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar"}, - new String[]{"/usr/lib/jvm/java-8-openjdk-amd64/jre/src.zip", root.toString()}, - new String[]{"UTF-8", "UTF-8"}, + sourcePathArguments, + Iterables.toArray(transform(asList(sourcePathArguments), argument -> "UTF-8"), String.class), false); final byte[] javaFileBytes = Files.readAllBytes(sourcePath); CharBuffer source = Charsets.UTF_8.decode(ByteBuffer.wrap(javaFileBytes)); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 5e81ec9..04aa3b8 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -36,8 +36,8 @@ import static org.zwobble.couscous.util.ExtraLists.*; import static org.zwobble.couscous.util.ExtraMaps.toMap; public class JavaReader { - public static List<ClassNode> readClassFromFile(Path root, Path sourcePath) throws IOException { - CompilationUnit ast = new JavaParser().parseCompilationUnit(root, sourcePath); + public static List<ClassNode> readClassFromFile(List<Path> sourcePaths, Path sourcePath) throws IOException { + CompilationUnit ast = new JavaParser().parseCompilationUnit(sourcePaths, sourcePath); System.out.println(sourcePath); for (Message message : ast.getMessages()) { System.out.println(message.getMessage()); diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java index 49b1fbf..8008261 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java @@ -26,7 +26,7 @@ public class JavaToInterpreterTests extends CompilerTests { List<PrimitiveValue> arguments ) throws IOException, InterruptedException { JavaFrontend frontend = new JavaFrontend(); - List<ClassNode> classNodes = frontend.readSourceDirectory(directory, directory); + List<ClassNode> classNodes = frontend.readSourceDirectory(ImmutableList.of(directory), directory); Project project = JavaProject.of(classNodes); Interpreter interpreter = new Interpreter(project); diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java index 2c8dfeb..d2d62b1 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java @@ -1,5 +1,6 @@ package org.zwobble.couscous.tests; +import com.google.common.collect.ImmutableList; import org.junit.Test; import org.zwobble.couscous.CouscousCompiler; import org.zwobble.couscous.ast.TypeName; @@ -28,7 +29,7 @@ public class JavaToPythonTests extends CompilerTests { CouscousCompiler compiler = new CouscousCompiler( new JavaFrontend(), new PythonBackend(directoryPath, "couscous")); - compiler.compileDirectory(directory, directory); + compiler.compileDirectory(ImmutableList.of(directory), directory); return PythonMethodRunner.runFunction(directoryPath, type, methodName, arguments); } finally { deleteRecursively(directoryPath.toFile()); diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java index 2e61fe0..5548b2f 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java @@ -1,5 +1,6 @@ package org.zwobble.couscous.tests.frontends.java; +import com.google.common.collect.ImmutableList; import org.junit.Test; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.frontends.java.JavaReader; @@ -646,7 +647,7 @@ public class JavaReaderTests { Files.createDirectories(directoryPath.resolve("com/example")); Files.write(sourcePath, asList(javaClass)); - return JavaReader.readClassFromFile(directoryPath, sourcePath); + return JavaReader.readClassFromFile(ImmutableList.of(directoryPath), sourcePath); } finally { deleteRecursively(directoryPath.toFile()); } |
