aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java48
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java23
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 =