diff options
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java | 6 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java | 18 |
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( |
