You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/05/28 22:59:43 UTC
[groovy] branch master updated: GROOVY-9813: add test cases
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 02d1a3b4f7 GROOVY-9813: add test cases
02d1a3b4f7 is described below
commit 02d1a3b4f76f1311eb2286188b224cfbbf0324db
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat May 28 17:44:17 2022 -0500
GROOVY-9813: add test cases
---
.../java/org/codehaus/groovy/ast/MethodNode.java | 1 +
...StaticTypesMethodReferenceExpressionWriter.java | 9 +--
.../transform/stc/MethodReferenceTest.groovy | 76 ++++++++++++++++++++++
3 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/ast/MethodNode.java b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
index 34f941918e..331742c46d 100644
--- a/src/main/java/org/codehaus/groovy/ast/MethodNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/MethodNode.java
@@ -110,6 +110,7 @@ public class MethodNode extends AnnotatedNode {
public void setModifiers(int modifiers) {
invalidateCachedData();
this.modifiers = modifiers;
+ getVariableScope().setInStaticContext(isStatic());
}
public String getName() {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
index 8a13ac663d..c16229448d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java
@@ -211,7 +211,7 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
private MethodNode addSyntheticMethodForVariadicReference(final MethodNode mn, final int samParameters, final boolean isStaticTarget) {
Parameter[] parameters = new Parameter[samParameters];
- Expression arguments = null, receiver = null;
+ Expression arguments, receiver;
if (mn.isStatic()) {
for (int i = 0, j = mn.getParameters().length-1; i < samParameters; i += 1) {
ClassNode t = mn.getParameters()[Math.min(i, j)].getType();
@@ -222,11 +222,11 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
receiver = classX(mn.getDeclaringClass());
} else {
int p = 0;
- if (isStaticTarget) parameters[p++] = new Parameter(mn.getDeclaringClass(), "o");
- for (int i = 0, j = mn.getParameters().length-1; i < samParameters - p; i += 1) {
+ if (isStaticTarget) parameters[p++] = new Parameter(mn.getDeclaringClass(), "target");
+ for (int i = 0, j = mn.getParameters().length-1, n = samParameters-p; i < n; i += 1) {
ClassNode t = mn.getParameters()[Math.min(i, j)].getType();
if (i >= j) t = t.getComponentType(); // targets the array
- parameters[p++] = new Parameter(t, "p" + p);
+ parameters[p] = new Parameter(t, "p" + p); p += 1;
}
if (isStaticTarget) {
arguments = new ArgumentListExpression(removeFirstParameter(parameters));
@@ -247,6 +247,7 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE
MethodNode delegateMethod = addSyntheticMethod(methodName, mn.getReturnType(), methodCall, parameters, mn.getExceptions());
if (!isStaticTarget && !mn.isStatic()) delegateMethod.setModifiers(delegateMethod.getModifiers() & ~Opcodes.ACC_STATIC);
delegateMethod.putNodeMetaData(StaticCompilationMetadataKeys.STATIC_COMPILE_NODE, Boolean.TRUE);
+ delegateMethod.setGenericsTypes(mn.getGenericsTypes());
return delegateMethod;
}
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index f1188942e7..e3b5f894cb 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -240,6 +240,82 @@ final class MethodReferenceTest {
'''
}
+ @Test // instance::instanceMethod -- GROOVY-9813
+ void testFunctionII() {
+ String asList = '''
+ def <T> List<T> asList(T... a) {
+ return Arrays.asList(a)
+ }
+ '''
+
+ assertScript shell, asList + '''
+ @CompileStatic
+ void test() {
+ Supplier<List> zero = this::asList
+ def list = zero.get()
+ assert list.isEmpty()
+ }
+ test()
+ '''
+
+ assertScript shell, asList + '''
+ @CompileStatic
+ void test() {
+ Function<Integer, List> one = this::asList
+ def list = one.apply(1)
+ assert list.size() == 1
+ assert list[0] == 1
+ }
+ test()
+ '''
+
+ assertScript shell, asList + '''
+ @CompileStatic
+ void test() {
+ BiFunction<Integer, Integer, List> two = this::asList
+ def list = two.apply(2,3)
+ assert list.size() == 2
+ assert list[0] == 2
+ assert list[1] == 3
+ }
+ test()
+ '''
+
+ assertScript shell, asList + '''
+ @CompileStatic
+ void test() { def that = this
+ BiFunction<Integer, Integer, List> two = that::asList
+ def list = two.apply(2,3)
+ assert list.size() == 2
+ assert list[0] == 2
+ assert list[1] == 3
+ }
+ test()
+ '''
+ }
+
+ @Test // instance::instanceMethod
+ @groovy.test.NotYetImplemented
+ void testFunctionII2() {
+ assertScript shell, """
+ class C {
+ def m(... args) {
+ [this, *args]
+ }
+ }
+ @CompileStatic
+ void test(C c) {
+ BiFunction<Integer, Integer, List> two = c::m
+ def list = two.apply(1,2)
+ assert list.size() == 3
+ assert list[0] == c
+ assert list[1] == 1
+ assert list[2] == 2
+ }
+ test(new C())
+ """
+ }
+
@Test // instance::instanceMethod -- GROOVY-10057
void testPredicateII() {
assertScript shell, '''