diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-20 19:00:49 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-20 19:00:49 +0100 |
| commit | 4054a250df414bb2c756d12b133aaaa8cd6bbce3 (patch) | |
| tree | c7c1951aa372a3d1846cb06dfa1fc3f721c0e6ef /src | |
| parent | 4655cf0dc523484a05f4b648fd87ff9fdd0605ca (diff) | |
Java: read formal method arguments
Diffstat (limited to 'src')
3 files changed, 38 insertions, 0 deletions
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<FieldDeclarationNode> fields; @@ -85,6 +88,11 @@ public class ClassNodeBuilder { return ThisReferenceNode.thisReference(name); } + public MethodBuilder<T> argument(String id, String name, TypeName type) { + arguments.add(formalArg(var(id, name, type))); + return this; + } + public MethodBuilder<T> 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 @@ -181,6 +181,23 @@ public class JavaReaderTests { } @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( new ExpressionStatementNode( |
