GROOVY-6804: Try to disambiguate methods thanks to available generic type information
diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 890c28e..7169eaa 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1948,7 +1948,7 @@
if (mn.isEmpty()) {
addNoMatchingMethodError(receiver, name, args, call);
} else {
- mn = disambiguateMethods(mn, call);
+ mn = disambiguateMethods(mn, receiver, args, call);
if (mn.size() == 1) {
MethodNode directMethodCallCandidate = mn.get(0);
ClassNode returnType = getType(directMethodCallCandidate);
@@ -2612,7 +2612,7 @@
if (areCategoryMethodCalls(mn, name, args)) {
addCategoryMethodCallError(call);
}
- mn = disambiguateMethods(mn, call);
+ mn = disambiguateMethods(mn, chosenReceiver!=null?chosenReceiver.getType():null, args, call);
if (mn.size() == 1) {
MethodNode directMethodCallCandidate = mn.get(0);
if (chosenReceiver==null) {
@@ -3314,7 +3314,7 @@
if (areCategoryMethodCalls(methods, name, args)) {
addCategoryMethodCallError(expr);
}
- methods = disambiguateMethods(methods, expr);
+ methods = disambiguateMethods(methods, receiver, args, expr);
if (methods.size() == 1) {
return methods.get(0);
} else {
@@ -3324,8 +3324,17 @@
return null;
}
- private List<MethodNode> disambiguateMethods(List<MethodNode> methods, final Expression expr) {
- if (methods.size()>1) {
+ private List<MethodNode> disambiguateMethods(List<MethodNode> methods, ClassNode receiver, ClassNode[] argTypes, final Expression expr) {
+ if (methods.size()>1 && receiver!=null && argTypes!=null) {
+ List<MethodNode> filteredWithGenerics = new LinkedList<MethodNode>();
+ for (MethodNode methodNode : methods) {
+ if (typeCheckMethodsWithGenerics(receiver, argTypes, methodNode)) {
+ filteredWithGenerics.add(methodNode);
+ }
+ }
+ if (filteredWithGenerics.size()==1) {
+ return filteredWithGenerics;
+ }
methods = extension.handleAmbiguousMethods(methods, expr);
}
return methods;
diff --git a/src/test/groovy/bugs/Groovy6804Bug.groovy b/src/test/groovy/bugs/Groovy6804Bug.groovy
index ae6203f..54546ab 100644
--- a/src/test/groovy/bugs/Groovy6804Bug.groovy
+++ b/src/test/groovy/bugs/Groovy6804Bug.groovy
@@ -5,7 +5,6 @@
class Groovy6804Bug extends StaticTypeCheckingTestCase {
- @NotYetImplemented
void testOverloadedMethod() {
assertScript '''
class Base<K extends Serializable, V> {