Skip to content

Commit 8b55277

Browse files
committed
GROOVY-10791
1 parent 3f377f3 commit 8b55277

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/StaticCompilationTests.java

+22
Original file line numberDiff line numberDiff line change
@@ -7885,4 +7885,26 @@ public void testCompileStatic10742() {
78857885
"Groovy:Invalid return type: void is not convertible to java.lang.String\n" +
78867886
"----------\n");
78877887
}
7888+
7889+
@Test
7890+
public void testCompileStatic10791() {
7891+
assumeTrue(isParrotParser());
7892+
7893+
//@formatter:off
7894+
String[] sources = {
7895+
"Main.groovy",
7896+
"import java.util.function.*\n" +
7897+
"@SuppressWarnings('rawtypes')\n" +
7898+
"@groovy.transform.CompileStatic\n" +
7899+
"void test(List list) {\n" +
7900+
" BiConsumer<List,Consumer> bc = List::forEach\n" + // default method of Iterator
7901+
" Consumer printer = { print(it) }\n" +
7902+
" bc.accept(list, printer)\n" +
7903+
"}\n" +
7904+
"test(['works'])\n",
7905+
};
7906+
//@formatter:on
7907+
7908+
runConformTest(sources, "works");
7909+
}
78887910
}

base/org.codehaus.groovy30/src/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
5353
import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
5454
import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
55+
import static org.codehaus.groovy.ast.tools.GeneralUtils.getInterfacesAndSuperInterfaces;
5556
import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
5657
import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
5758
import static org.codehaus.groovy.ast.tools.GenericsUtils.extractPlaceholders;
@@ -281,9 +282,14 @@ private MethodNode findMethodRefMethod(final String methodName, final Parameter[
281282

282283
private List<MethodNode> findVisibleMethods(final String name, final ClassNode type) {
283284
List<MethodNode> methods = type.getMethods(name);
285+
// GROOVY-10791: include interface default methods in search
286+
for (ClassNode cn : getInterfacesAndSuperInterfaces(type)) {
287+
for (MethodNode mn : cn.getDeclaredMethods(name)) {
288+
if (mn.isDefault()) methods.add(mn);
289+
}
290+
}
284291
methods.addAll(findDGMMethodsForClassNode(controller.getSourceUnit().getClassLoader(), type, name));
285-
methods = filterMethodsByVisibility(methods, controller.getClassNode());
286-
return methods;
292+
return filterMethodsByVisibility(methods, controller.getClassNode());
287293
}
288294

289295
private void addFatalError(final String msg, final ASTNode node) {

base/org.codehaus.groovy40/src/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
5050
import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
5151
import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
52+
import static org.codehaus.groovy.ast.tools.GeneralUtils.getInterfacesAndSuperInterfaces;
5253
import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
5354
import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
5455
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
@@ -354,9 +355,14 @@ else if (samParameters.length >= nParameters) { // 1+ case
354355

355356
private List<MethodNode> findVisibleMethods(final String name, final ClassNode type) {
356357
List<MethodNode> methods = type.getMethods(name);
358+
// GROOVY-10791: include interface default methods in search
359+
for (ClassNode cn : getInterfacesAndSuperInterfaces(type)) {
360+
for (MethodNode mn : cn.getDeclaredMethods(name)) {
361+
if (mn.isDefault()) methods.add(mn);
362+
}
363+
}
357364
methods.addAll(findDGMMethodsForClassNode(controller.getSourceUnit().getClassLoader(), type, name));
358-
methods = filterMethodsByVisibility(methods, controller.getClassNode());
359-
return methods;
365+
return filterMethodsByVisibility(methods, controller.getClassNode());
360366
}
361367

362368
private void addFatalError(final String msg, final ASTNode node) {

0 commit comments

Comments
 (0)