Skip to content

Commit

Permalink
GROOVY-10975: SC: method reference placeholder return type for primitive
Browse files Browse the repository at this point in the history
3_0_X backport
  • Loading branch information
eric-milles committed Aug 25, 2023
1 parent fe1e89c commit 5a1fdfa
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,39 @@ default Object[] createBootstrapMethodArguments(final String abstractMethodDesc,
}

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)
Expand All @@ -96,7 +125,7 @@ default Object[] createBootstrapMethodArguments(final String abstractMethodDesc,
BytecodeHelper.getMethodDescriptor(methodNode),
methodOwner.isInterface());

arguments[2] = Type.getType(BytecodeHelper.getMethodDescriptor(returnType, parameters));
arguments[2] = Type.getMethodType(BytecodeHelper.getMethodDescriptor(returnType, parameters));

return arguments;
}
Expand Down
14 changes: 14 additions & 0 deletions src/test/groovy/transform/stc/MethodReferenceTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,20 @@ final class MethodReferenceTest {
'''
}

@Test // instance::instanceMethod -- GROOVY-10975
void testComparatorII() {
assertScript imports + '''
@CompileStatic
void test() {
Collection<Integer> c = [1]
Map<Integer,Integer> m = [1:1]
new Hashtable(Collections.min(c, m::put))
}
test()
'''
}

@Test // instance::instanceMethod
void testBinaryOperatorII() {
assertScript imports + '''
Expand Down

0 comments on commit 5a1fdfa

Please sign in to comment.