aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-27 22:28:29 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-27 22:28:29 +0100
commit5f852c33a8a57bd8fad58747b339961ac6c835ef (patch)
treec709a1ec6f1214fca9338053ff65dd79d3ce3008
parent6aed29ed46535506b27aee8121ca56116356a2d9 (diff)
Support passing arrays as vararg argument
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java6
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java18
2 files changed, 23 insertions, 1 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 fcce1e1..e6b3822 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -317,7 +317,11 @@ public class JavaExpressionReader {
ITypeBinding[] parameterTypes = method.getParameterTypes();
return IntStream.range(0, parameterTypes.length)
.mapToObj(index -> {
- if (method.isVarargs() && index == parameterTypes.length - 1) {
+ boolean isVarargs =
+ method.isVarargs() &&
+ index == parameterTypes.length - 1 &&
+ (javaArguments.size() != parameterTypes.length || !javaArguments.get(index).resolveTypeBinding().isEqualTo(parameterTypes[index]));
+ if (isVarargs) {
Type elementType = typeOf(parameterTypes[index].getElementType());
List<ExpressionNode> elements = IntStream.range(index, javaArguments.size())
.mapToObj(argumentIndex -> readExpression(elementType, javaArguments.get(argumentIndex)))
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
index fb7a25b..408c390 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java
@@ -268,6 +268,24 @@ public class ExpressionReadingTests {
}
@Test
+ public void canReadMethodCallsWithArrayAsVarargs() {
+ TypeParameter typeParameter = typeParameter(Identifiers.method(Identifiers.forType("java.util.Arrays"), "asList"), "T");
+ assertEquals(
+ methodCall(
+ staticReceiver("java.util.Arrays"),
+ "asList",
+ list(Types.STRING),
+ list(array(Types.STRING, list())),
+ parameterizedType(ScalarType.of("java.util.List"), list(Types.STRING)),
+ signature(
+ "asList",
+ list(typeParameter),
+ list(Types.array(typeParameter)),
+ parameterizedType(ScalarType.of("java.util.List"), list(typeParameter)))),
+ readExpression("java.util.List<String>", "java.util.Arrays.asList(new String[]{})"));
+ }
+
+ @Test
public void canReadGenericStaticMethodCallsWithExplicitTypeParameters() {
TypeParameter typeParameter = typeParameter(Identifiers.method(Identifiers.forType("java.util.Collections"), "emptyList"), "T");
assertEquals(