aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java47
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java11
2 files changed, 47 insertions, 11 deletions
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 d0b3f17..8037540 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -11,9 +11,11 @@ import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ConditionalExpression;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.FieldAccess;
+import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.NumberLiteral;
@@ -23,6 +25,7 @@ import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.ThisExpression;
import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.zwobble.couscous.ast.AssignableExpressionNode;
import org.zwobble.couscous.ast.AssignmentNode;
import org.zwobble.couscous.ast.ClassNode;
@@ -60,22 +63,44 @@ public class JavaReader {
val type = (TypeDeclaration)ast.types().get(0);
- for (val method : type.getMethods()) {
- classBuilder.method(
- method.getName().getIdentifier(),
- true,
- builder -> {
- for (Object statement : method.getBody().statements()) {
- builder.statement(readStatement((Statement)statement));
- }
- return builder;
- });
- }
+ readFields(type, classBuilder);
+ readMethods(type, classBuilder);
return classBuilder
.build();
}
+ private static void readFields(TypeDeclaration type, ClassNodeBuilder classBuilder) {
+ for (val field : type.getFields()) {
+ readField(field, classBuilder);
+ }
+ }
+
+ private static void readField(FieldDeclaration field, ClassNodeBuilder classBuilder) {
+ for (val fragment : field.fragments()) {
+ val name = ((VariableDeclarationFragment)fragment).getName().getIdentifier();
+ classBuilder.field(name, typeOf(field.getType().resolveBinding()));
+ }
+ }
+
+ private static void readMethods(TypeDeclaration type, ClassNodeBuilder classBuilder) {
+ for (val method : type.getMethods()) {
+ readMethod(classBuilder, method);
+ }
+ }
+
+ private static void readMethod(ClassNodeBuilder classBuilder, MethodDeclaration method) {
+ classBuilder.method(
+ method.getName().getIdentifier(),
+ true,
+ builder -> {
+ for (Object statement : method.getBody().statements()) {
+ builder.statement(readStatement((Statement)statement));
+ }
+ return builder;
+ });
+ }
+
private static StatementNode readStatement(Statement statement) {
switch (statement.getNodeType()) {
case ASTNode.RETURN_STATEMENT:
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 c62b9a7..1596d91 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
@@ -18,6 +18,7 @@ import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.AssignmentNode.assign;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
+import static org.zwobble.couscous.ast.FieldDeclarationNode.field;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall;
@@ -44,6 +45,16 @@ public class JavaReaderTests {
}
@Test
+ public void canReadFieldDeclarations() {
+ val classNode = readClass(
+ "private String name;");
+
+ assertEquals(
+ asList(field("name", TypeName.of("java.lang.String"))),
+ classNode.getFields());
+ }
+
+ @Test
public void canReadExplicitFieldReference() {
canReadFieldReference("this.name");
}