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 b4269461ede..dee145e84bb 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 @@ -46,6 +46,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import static java.util.Comparator.comparingInt; import static java.util.stream.Collectors.joining; @@ -399,10 +400,14 @@ private MethodNode chooseMethodRefMethod(final List methods, final E private List findVisibleMethods(final String name, final ClassNode type) { List methods = type.getMethods(name); - // GROOVY-10791: include interface default methods in search - for (ClassNode cn : getInterfacesAndSuperInterfaces(type)) { + // GROOVY-10791, GROOVY-11467: include non-static interface methods + Set implemented = getInterfacesAndSuperInterfaces(type); + implemented.remove(type); + for (ClassNode cn : implemented) { for (MethodNode mn : cn.getDeclaredMethods(name)) { - if (mn.isDefault()) methods.add(mn); + if (mn.isDefault() || (mn.isPublic() && !mn.isStatic() && type.isAbstract())) { + methods.add(mn); + } } } methods.addAll(findDGMMethodsForClassNode(controller.getSourceUnit().getClassLoader(), type, name)); diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy index 3995542c67e..cc2c8f61c6f 100644 --- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy +++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy @@ -1494,6 +1494,26 @@ final class MethodReferenceTest { ''' } + @Test // GROOVY-11467 + void testSuperInterfaceMethodReference() { + assertScript shell, ''' + interface A { int m() } + interface B extends A { } + class C implements B { int m() { 42 } } + + @CompileStatic + class D { + B b = new C() + void test() { + IntSupplier s = b::m + assert s.getAsInt() == 42 + } + } + + new D().test() + ''' + } + @Test // GROOVY-10635 void testRecordComponentMethodReference() { assertScript shell, '''