This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 8914888628 GROOVY-10975: SC: method reference placeholder return type 
for primitive
8914888628 is described below

commit 8914888628e564e2f9437d883d7c8f62788d73f1
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Fri Aug 25 12:48:34 2023 -0500

    GROOVY-10975: SC: method reference placeholder return type for primitive
    
    4_0_X backport
---
 .../asm/sc/AbstractFunctionalInterfaceWriter.java  | 35 ++++++++++++++++++++--
 .../transform/stc/MethodReferenceTest.groovy       | 14 +++++++++
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionalInterfaceWriter.java
 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionalInterfaceWriter.java
index 90b6c4e7dd..8ff46aad07 100644
--- 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionalInterfaceWriter.java
+++ 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionalInterfaceWriter.java
@@ -85,10 +85,39 @@ public interface AbstractFunctionalInterfaceWriter {
     }
 
     default Object[] createBootstrapMethodArguments(final String 
abstractMethodDesc, final int insn, final ClassNode methodOwner, final 
MethodNode methodNode, final Parameter[] parameters, final boolean 
serializable) {
-        ClassNode returnType = !abstractMethodDesc.endsWith(")V") ? 
methodNode.getReturnType() : ClassHelper.VOID_TYPE; // GROOVY-10933
+        ClassNode returnType = methodNode.getReturnType();
+        switch (Type.getReturnType(abstractMethodDesc).getSort()) {
+          case Type.BOOLEAN:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Boolean_TYPE; // GROOVY-10975
+            break;
+          case Type.BYTE:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Byte_TYPE;
+            break;
+          case Type.CHAR:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Character_TYPE;
+            break;
+          case Type.DOUBLE:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Double_TYPE;
+            break;
+          case Type.FLOAT:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Float_TYPE;
+            break;
+          case Type.INT:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Integer_TYPE;
+            break;
+          case Type.LONG:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Long_TYPE;
+            break;
+          case Type.SHORT:
+            if (returnType.isGenericsPlaceHolder()) returnType = 
ClassHelper.Short_TYPE;
+            break;
+          case Type.VOID:
+            returnType = ClassHelper.VOID_TYPE; // GROOVY-10933
+        }
+
         Object[] arguments = !serializable ? new Object[3] : new 
Object[]{null, null, null, 5, 0};
 
-        arguments[0] = Type.getType(abstractMethodDesc);
+        arguments[0] = Type.getMethodType(abstractMethodDesc);
 
         arguments[1] = new Handle(
                 insn, // H_INVOKESTATIC or H_INVOKEVIRTUAL or 
H_INVOKEINTERFACE (GROOVY-9853)
@@ -97,7 +126,7 @@ public interface AbstractFunctionalInterfaceWriter {
                 BytecodeHelper.getMethodDescriptor(methodNode),
                 methodOwner.isInterface());
 
-        arguments[2] = 
Type.getType(BytecodeHelper.getMethodDescriptor(returnType, parameters));
+        arguments[2] = 
Type.getMethodType(BytecodeHelper.getMethodDescriptor(returnType, parameters));
 
         return arguments;
     }
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy 
b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 356dcf9cf4..820869957b 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -538,6 +538,20 @@ final class MethodReferenceTest {
         '''
     }
 
+    @Test // instance::instanceMethod -- GROOVY-10975
+    void testComparatorII() {
+        assertScript shell, '''
+            @CompileStatic
+            void test() {
+                Collection<Integer> c = [1]
+                Map<Integer,Integer> m = [1:1]
+                new Hashtable(Collections.min(c, m::put))
+            }
+
+            test()
+        '''
+    }
+
     @NotYetImplemented
     @Test // instance::instanceMethod -- GROOVY-11026
     void testBiFunctionII() {

Reply via email to