aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-13 14:36:16 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-13 14:36:16 +0000
commit2d24979f47af2027de780fc956fa37829edafe40 (patch)
tree294ad60501120e22e425af9ae66a276b1f636c6a
parent0102779512e4475a32c95f0d84d704bcef7d38fe (diff)
Read instance initializers
-rw-r--r--src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java12
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java6
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java31
3 files changed, 42 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java b/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java
index 666d777..048ce73 100644
--- a/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java
+++ b/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.ast.sugar;
import com.google.common.collect.ImmutableList;
import org.zwobble.couscous.ast.*;
+import org.zwobble.couscous.util.ExtraLists;
import java.util.List;
@@ -13,6 +14,7 @@ public class TypeDeclarationBody {
public static class Builder {
private final ImmutableList.Builder<FieldDeclarationNode> fields = ImmutableList.builder();
private final ImmutableList.Builder<StatementNode> staticConstructor = ImmutableList.builder();
+ private final ImmutableList.Builder<StatementNode> instanceInitializers = ImmutableList.builder();
private ConstructorNode constructor = ConstructorNode.DEFAULT;
private final ImmutableList.Builder<MethodNode> methods = ImmutableList.builder();
@@ -23,11 +25,11 @@ public class TypeDeclarationBody {
fields.add(field);
}
- public void addStaticInitializer(List<StatementNode> statements) {
- staticConstructor.addAll(statements);
+ public void addInitializer(boolean isStatic, List<StatementNode> statements) {
+ (isStatic ? staticConstructor : instanceInitializers).addAll(statements);
}
- public void addStaticInitializer(StatementNode statement) {
+ public void addInitializer(StatementNode statement) {
staticConstructor.add(statement);
}
@@ -43,7 +45,9 @@ public class TypeDeclarationBody {
return new TypeDeclarationBody(
fields.build(),
staticConstructor.build(),
- constructor,
+ ConstructorNode.constructor(
+ constructor.getArguments(),
+ ExtraLists.concat(instanceInitializers.build(), constructor.getBody())),
methods.build());
}
}
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 b66fe0d..483ea24 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -240,7 +240,9 @@ public class JavaReader {
Casts.tryCast(Initializer.class, declaration)
// TODO: handle instance initializer
- .ifPresent(initializer -> body.addStaticInitializer(readStatement(scope, initializer.getBody())));
+ .ifPresent(initializer -> body.addInitializer(
+ Modifier.isStatic(initializer.getModifiers()),
+ readStatement(scope, initializer.getBody())));
Casts.tryCast(FieldDeclaration.class, declaration)
.ifPresent(field -> readField(body, scope, type, field));
@@ -258,7 +260,7 @@ public class JavaReader {
if (fragment.getInitializer() != null) {
ExpressionNode value = readExpression(scope, type, fragment.getInitializer());
String name = fragment.getName().getIdentifier();
- builder.addStaticInitializer(assignStatement(fieldAccess(declaringType, name, type), value));
+ builder.addInitializer(assignStatement(fieldAccess(declaringType, name, type), value));
}
});
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 84a4ea7..49ce07e 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
@@ -649,7 +649,36 @@ public class JavaReaderTests {
}
@Test
- public void canDeclareStaticConstructor() {
+ public void instanceInitializerIsPrependedToConstructor() {
+ ClassNode classNode = readClass(
+ "private final String name;" +
+ "private final int year;" +
+ "public Example() {" +
+ " this.name = \"Flaws\";" +
+ "}" +
+ "{ year = 2013; }");
+
+ ConstructorNode constructor = classNode.getConstructor();
+
+ assertEquals(
+ list(
+ assignStatement(
+ fieldAccess(
+ thisReference(TypeName.of("com.example.Example")),
+ "year",
+ IntegerValue.REF),
+ literal(2013)),
+ assignStatement(
+ fieldAccess(
+ thisReference(TypeName.of("com.example.Example")),
+ "name",
+ StringValue.REF),
+ literal("Flaws"))),
+ constructor.getBody());
+ }
+
+ @Test
+ public void canDeclareStaticInitializer() {
ClassNode classNode = readClass(
"private static final String name;" +
"static {" +