From bbfc91caf379a07198bfa352023524c0b54e1bb0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 29 Mar 2016 19:56:41 +0100 Subject: Add support for reading vararg method invocations --- .../frontends/java/JavaExpressionReader.java | 20 ++++++++++++++++---- .../zwobble/couscous/frontends/java/JavaTypes.java | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/frontends') 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 readArguments(IMethodBinding method, List 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 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()); -- cgit v1.2.3