diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-03-29 19:56:41 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-03-29 19:56:41 +0100 |
| commit | bbfc91caf379a07198bfa352023524c0b54e1bb0 (patch) | |
| tree | a1b081d63bb693f9cad63f980e430540a20d0586 /src/main/java/org/zwobble/couscous/frontends | |
| parent | df10352d2eea46b3e82cbd7783ed16e3f02fced6 (diff) | |
Add support for reading vararg method invocations
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java | 20 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java | 3 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index c0b69b3..0694cc3 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; +import static org.zwobble.couscous.ast.ArrayNode.array; import static org.zwobble.couscous.ast.CastNode.cast; import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.LiteralNode.literal; @@ -239,10 +240,21 @@ public class JavaExpressionReader { } private List<ExpressionNode> readArguments(IMethodBinding method, List<Expression> javaArguments) { - return IntStream.range(0, javaArguments.size()) - .mapToObj(index -> readExpression( - typeOf(method.getParameterTypes()[index]), - javaArguments.get(index))) + ITypeBinding[] parameterTypes = method.getParameterTypes(); + return IntStream.range(0, parameterTypes.length) + .mapToObj(index -> { + if (method.isVarargs() && index == parameterTypes.length - 1) { + Type elementType = typeOf(parameterTypes[index].getElementType()); + List<ExpressionNode> elements = IntStream.range(index, javaArguments.size()) + .mapToObj(argumentIndex -> readExpression(elementType, javaArguments.get(argumentIndex))) + .collect(Collectors.toList()); + return array(elementType, elements); + } else { + return readExpression( + typeOf(parameterTypes[index]), + javaArguments.get(index)); + } + }) .collect(Collectors.toList()); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java index a770108..4e3fe66 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java @@ -35,6 +35,9 @@ public class JavaTypes { if (typeBinding.isAnonymous()) { throw new RuntimeException("Cannot get type of anonymous type binding"); } + if (typeBinding.isArray()) { + return Types.array(typeOf(typeBinding.getElementType())); + } ITypeBinding outerClass = typeBinding.getDeclaringClass(); if (outerClass == null) { ScalarType rawType = ScalarType.of(typeBinding.getErasure().getQualifiedName()); |
