[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;
                                 }
                             }
                         }