From 4054a250df414bb2c756d12b133aaaa8cd6bbce3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 20 Oct 2015 19:00:49 +0100 Subject: Java: read formal method arguments --- .../java/org/zwobble/couscous/ast/ClassNodeBuilder.java | 8 ++++++++ .../org/zwobble/couscous/frontends/java/JavaReader.java | 13 +++++++++++++ .../couscous/tests/frontends/java/JavaReaderTests.java | 17 +++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index b4ddad9..7466f07 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -5,6 +5,9 @@ import java.util.function.Function; import com.google.common.collect.ImmutableList; +import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; +import static org.zwobble.couscous.ast.VariableDeclaration.var; + public class ClassNodeBuilder { private final TypeName name; private final ImmutableList.Builder fields; @@ -85,6 +88,11 @@ public class ClassNodeBuilder { return ThisReferenceNode.thisReference(name); } + public MethodBuilder argument(String id, String name, TypeName type) { + arguments.add(formalArg(var(id, name, type))); + return this; + } + public MethodBuilder argument(FormalArgumentNode argument) { arguments.add(argument); return this; 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 b8a3b62..22d42ab 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.NumberLiteral; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.Statement; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.ThisExpression; @@ -102,6 +103,14 @@ public class JavaReader { 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); @@ -282,6 +291,10 @@ public class JavaReader { return typeOf(expression.resolveTypeBinding()); } + private static TypeName typeOf(IVariableBinding variableBinding) { + return typeOf(variableBinding.getType()); + } + private static TypeName typeOf(ITypeBinding typeBinding) { return TypeName.of(typeBinding.getQualifiedName()); } 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 98a6138..4a92f1b 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 @@ -180,6 +180,23 @@ public class JavaReaderTests { returnNode.getValue()); } + @Test + public void canDeclareAndReferenceArguments() { + val classNode = readClass( + "public String identity(int value) {" + + " return value;" + + "}"); + + val method = classNode.getMethods().get(0); + val argument = method.getArguments().get(0); + assertEquals("value", argument.getName()); + assertEquals(TypeName.of("int"), argument.getType()); + assertEquals(1, method.getArguments().size()); + + val returnNode = (ReturnNode)method.getBody().get(0); + assertEquals(reference(argument), returnNode.getValue()); + } + @Test public void canReadExpressionStatements() { assertEquals( -- cgit v1.2.3