aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-10 14:08:00 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-10 14:08:00 +0100
commit1f41544a60c12b34eeff50f4629462534b4bb725 (patch)
treeb01f94842ca09ae5d9a27af2593382e39d628b0e /src/main
parent814afa129ff03c3c6396afcf5f87ea6ae5b6413f (diff)
Parse Java method calls
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java2
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java27
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java28
3 files changed, 37 insertions, 20 deletions
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>)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();