From 1f41544a60c12b34eeff50f4629462534b4bb725 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Oct 2015 14:08:00 +0100 Subject: Parse Java method calls --- .../couscous/frontends/java/JavaFrontend.java | 2 +- .../couscous/frontends/java/JavaParser.java | 27 +++++++++++---------- .../couscous/frontends/java/JavaReader.java | 28 ++++++++++++++++------ 3 files changed, 37 insertions(+), 20 deletions(-) (limited to 'src/main/java') 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 d5cdd6c..8b92cec 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java @@ -16,7 +16,7 @@ public class JavaFrontend { val reader = new JavaReader(); return findJavaFiles(directoryPath) - .map(javaFile -> reader.readClassFromFile(javaFile)) + .map(javaFile -> reader.readClassFromFile(directoryPath, javaFile)) .collect(Collectors.toList()); } 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 1d031c3..d171761 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java @@ -5,6 +5,7 @@ import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Path; +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; @@ -18,21 +19,23 @@ public class JavaParser { public JavaParser() { parser = ASTParser.newParser(AST.JLS8); + parser.setBindingsRecovery(true); + parser.setKind(ASTParser.K_COMPILATION_UNIT); + parser.setCompilerOptions(JavaCore.getOptions()); + parser.setEnvironment( + new String[] {"/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar"}, + new String[0], + new String[0], + false); parser.setResolveBindings(true); } - public CompilationUnit parseCompilationUnit(Path path) throws IOException { - val javaFileBytes = Files.readAllBytes(path); - val javaFileChars = Charsets.UTF_8.decode(ByteBuffer.wrap(javaFileBytes)); - return parseCompilationUnit(javaFileChars.array()); - } - - public CompilationUnit parseCompilationUnit(String source) { - return parseCompilationUnit(source.toCharArray()); - } - - private CompilationUnit parseCompilationUnit(char[] source) { - parser.setSource(source); + public CompilationUnit parseCompilationUnit(Path root, Path sourcePath) throws IOException { + parser.setUnitName("/" + root.relativize(sourcePath).toString()); + + val javaFileBytes = Files.readAllBytes(sourcePath); + val source = Charsets.UTF_8.decode(ByteBuffer.wrap(javaFileBytes)); + parser.setSource(source.array()); return (CompilationUnit)parser.createAST(null); } } 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 1dbb288..a9cef4b 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -1,11 +1,13 @@ package org.zwobble.couscous.frontends.java; import java.nio.file.Path; +import java.util.List; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.BooleanLiteral; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.NumberLiteral; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.Statement; @@ -15,8 +17,12 @@ import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ClassNodeBuilder; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.MethodCallNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.StatementNode; +import org.zwobble.couscous.ast.TypeName; + +import com.google.common.collect.Lists; import lombok.SneakyThrows; import lombok.val; @@ -25,13 +31,8 @@ public class JavaReader { private final JavaParser parser = new JavaParser(); @SneakyThrows - public ClassNode readClassFromFile(Path path) { - val ast = parser.parseCompilationUnit(path); - return readCompilationUnit(ast); - } - - public ClassNode readClassFromString(String source) { - val ast = parser.parseCompilationUnit(source); + public ClassNode readClassFromFile(Path root, Path sourcePath) { + val ast = parser.parseCompilationUnit(root, sourcePath); return readCompilationUnit(ast); } @@ -79,6 +80,8 @@ public class JavaReader { return readNumberLiteral((NumberLiteral)expression); case ASTNode.STRING_LITERAL: return readStringLiteral((StringLiteral)expression); + case ASTNode.METHOD_INVOCATION: + return readMethodInvocation((MethodInvocation)expression); default: throw new RuntimeException("Unsupported expression: " + expression.getClass()); } @@ -96,6 +99,17 @@ public class JavaReader { return LiteralNode.literal(expression.getLiteralValue()); } + @SuppressWarnings("unchecked") + private static ExpressionNode readMethodInvocation(MethodInvocation expression) { + return MethodCallNode.methodCall( + readExpression(expression.getExpression()), + expression.getName().getIdentifier(), + Lists.transform( + (List)expression.arguments(), + JavaReader::readExpression), + TypeName.of(expression.resolveTypeBinding().getQualifiedName())); + } + private static String generateClassName(CompilationUnit ast) { val type = (TypeDeclaration)ast.types().get(0); return ast.getPackage().getName().getFullyQualifiedName() + "." + type.getName().getFullyQualifiedName(); -- cgit v1.2.3