[core] Introspection: favor non-vararg methods on ambiguities as does the Java compiler
git-svn-id: https://svn.apache.org/repos/asf/velocity/engine/trunk@1859988 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMethod.java b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMethod.java
index 3d38bcf..7e912e6 100644
--- a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMethod.java
+++ b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTMethod.java
@@ -183,7 +183,7 @@
if (i < params.length - 1)
plist.append(", ");
}
- log.debug("Object '{}' does not contain method {}({}) at {}[line {}, column {}]", o.getClass().getName(), methodName, plist, getTemplateName(), getLine(), getColumn());
+ log.debug("Object '{}' does not contain method {}({}) (or several ambiguous methods) at {}[line {}, column {}]", o.getClass().getName(), methodName, plist, getTemplateName(), getLine(), getColumn());
}
/*
diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java b/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
index f9f1e00..51bac9b 100644
--- a/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
+++ b/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
@@ -284,10 +284,23 @@
case MORE_SPECIFIC:
it.remove();
break;
- case EQUIVALENT:
case INCOMPARABLE:
+ /* Java compiler favors non-vararg methods. Let's do the same. */
+ if (match.varargs != best.varargs)
+ {
+ if (match.varargs)
+ {
+ keepMethod = false;
+ }
+ else if (best.varargs)
+ {
+ it.remove();
+ }
+ }
/* otherwise it's an equivalent match */
break;
+ case EQUIVALENT:
+ break;
}
}
}