diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 48 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 23 |
2 files changed, 51 insertions, 20 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 04ed784..62aa75a 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -34,6 +34,7 @@ import org.zwobble.couscous.ast.AssignableExpressionNode; import org.zwobble.couscous.ast.AssignmentNode; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ClassNodeBuilder; +import org.zwobble.couscous.ast.ClassNodeBuilder.MethodBuilder; import org.zwobble.couscous.ast.ConstructorCallNode; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.ExpressionStatementNode; @@ -100,26 +101,33 @@ public class JavaReader { } private static void readMethod(ClassNodeBuilder classBuilder, MethodDeclaration method) { - classBuilder.method( - method.getName().getIdentifier(), - true, - builder -> { - for (Object parameterObject : method.parameters()) { - val parameter = (SingleVariableDeclaration)parameterObject; - builder.argument( - parameter.resolveBinding().getKey(), - parameter.getName().getIdentifier(), - typeOf(parameter.resolveBinding())); - } - - for (Object statement : method.getBody().statements()) { - for (StatementNode intermediateStatement : readStatement((Statement)statement)) { - builder.statement(intermediateStatement); - } - - } - return builder; - }); + if (method.isConstructor()) { + classBuilder.constructor(builder -> buildMethod(method, builder)); + } else { + classBuilder.method( + method.getName().getIdentifier(), + true, + builder -> buildMethod(method, builder)); + } + } + + private static <T> MethodBuilder<T> buildMethod( + MethodDeclaration method, + MethodBuilder<T> builder) { + for (Object parameterObject : method.parameters()) { + val parameter = (SingleVariableDeclaration)parameterObject; + builder.argument( + parameter.resolveBinding().getKey(), + parameter.getName().getIdentifier(), + typeOf(parameter.resolveBinding())); + } + for (Object statement : method.getBody().statements()) { + for (StatementNode intermediateStatement : readStatement((Statement)statement)) { + builder.statement(intermediateStatement); + } + + } + return builder; } private static List<StatementNode> readStatement(Statement 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 4a92f1b..a9465cd 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 @@ -21,6 +21,7 @@ import org.zwobble.couscous.values.StringValue; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.AssignmentNode.assign; +import static org.zwobble.couscous.ast.AssignmentNode.assignStatement; import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FieldDeclarationNode.field; @@ -207,6 +208,28 @@ public class JavaReaderTests { asList(literal("42")))), readStatement("Integer.parseInt(\"42\");")); } + + @Test + public void canDeclareConstructor() { + val classNode = readClass( + "private final String name;" + + "public Example() {" + + " this.name = \"Flaws\";" + + "}"); + + val constructor = classNode.getConstructor(); + + assertEquals(asList(), constructor.getArguments()); + + assertEquals( + asList(assignStatement( + fieldAccess( + thisReference(TypeName.of("com.example.Example")), + "name", + StringValue.REF), + literal("Flaws"))), + constructor.getBody()); + } private ExpressionNode readExpressionInInstanceMethod(String expressionSource) { val javaClass = |
