aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/sugar/TypeDeclarationBody.java6
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java12
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java28
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;" +