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() {