aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-29 19:56:41 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-29 19:56:41 +0100
commitbbfc91caf379a07198bfa352023524c0b54e1bb0 (patch)
treea1b081d63bb693f9cad63f980e430540a20d0586 /src/main/java/org/zwobble/couscous/frontends
parentdf10352d2eea46b3e82cbd7783ed16e3f02fced6 (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.java20
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java3
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());