diff options
Diffstat (limited to 'src')
3 files changed, 41 insertions, 5 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 048ce73..381c521 100644 --- a/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java +++ b/src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java @@ -6,6 +6,8 @@ import org.zwobble.couscous.util.ExtraLists; import java.util.List; +import static org.zwobble.couscous.util.ExtraLists.list; + public class TypeDeclarationBody { public static Builder builder() { return new Builder(); @@ -29,8 +31,8 @@ public class TypeDeclarationBody { (isStatic ? staticConstructor : instanceInitializers).addAll(statements); } - public void addInitializer(StatementNode statement) { - staticConstructor.add(statement); + public void addInitializer(boolean isStatic, StatementNode statement) { + addInitializer(isStatic, list(statement)); } public void constructor(ConstructorNode constructor) { 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 483ea24..c85b4fb 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -28,6 +28,8 @@ import static org.zwobble.couscous.ast.AssignmentNode.assignStatement; import static org.zwobble.couscous.ast.ConstructorNode.constructor; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FieldDeclarationNode.field; +import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver; +import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables; @@ -239,7 +241,6 @@ public class JavaReader { .ifPresent(method -> readMethod(body, scope, method)); Casts.tryCast(Initializer.class, declaration) - // TODO: handle instance initializer .ifPresent(initializer -> body.addInitializer( Modifier.isStatic(initializer.getModifiers()), readStatement(scope, initializer.getBody()))); @@ -256,11 +257,16 @@ public class JavaReader { TypeName type = typeOf(field.getType()); fragments.forEach(fragment -> { builder.field(field(Modifier.isStatic(field.getModifiers()), fragment.getName().getIdentifier(), type)); - // TODO: handle instance initializer if (fragment.getInitializer() != null) { ExpressionNode value = readExpression(scope, type, fragment.getInitializer()); String name = fragment.getName().getIdentifier(); - builder.addInitializer(assignStatement(fieldAccess(declaringType, name, type), value)); + boolean isStatic = Modifier.isStatic(field.getModifiers()); + Receiver receiver = isStatic + ? staticReceiver(declaringType) + : instanceReceiver(thisReference(declaringType)); + + StatementNode assignment = assignStatement(fieldAccess(receiver, name, type), value); + builder.addInitializer(isStatic,assignment); } }); 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 49ce07e..d70f911 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 @@ -678,6 +678,34 @@ public class JavaReaderTests { } @Test + public void fieldInitializerIsPrependedToConstructor() { + ClassNode classNode = readClass( + "private final String name;" + + "public Example() {" + + " this.name = \"Flaws\";" + + "}" + + "private final int 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;" + |
