Author: cbrisson
Date: Sat Apr  8 14:35:26 2017
New Revision: 1790686

URL: http://svn.apache.org/viewvc?rev=1790686&view=rev
Log:
[engine] Debug new method disambiguation

Modified:
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
    
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java?rev=1790686&r1=1790685&r2=1790686&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/MethodMap.java
 Sat Apr  8 14:35:26 2017
@@ -183,12 +183,16 @@ public class MethodMap
          * one of STRICTLY_CONVERTIBLE, IMPLICITLY_CONVERTIBLE and 
EXPLICITLY_CONVERTIBLE_ */
         int applicability;
 
+        /* whether the method has varrags */
+        boolean varargs;
+
         Match(Method method, int applicability, Class[] unboxedArgs)
         {
             this.method = method;
             this.applicability = applicability;
             this.methodTypes = method.getParameterTypes();
             this.specificity = compare(methodTypes, unboxedArgs);
+            this.varargs = methodTypes.length > 0 && 
methodTypes[methodTypes.length - 1].isArray();
         }
     }
 
@@ -198,7 +202,7 @@ public class MethodMap
         {
             if (cls != null && cls != Object.class) return false;
         }
-        return true;
+        return args.length > 0;
     }
 
     private Method getBestMatch(List<Method> methods, Class[] args)
@@ -211,7 +215,7 @@ public class MethodMap
         }
         for (Method method : methods)
         {
-            int applicability = getApplicability(method, args);
+            int applicability = getApplicability(method, unboxedArgs);
             if (applicability > NOT_CONVERTIBLE)
             {
                 Match match = new Match(method, applicability, unboxedArgs);
@@ -240,11 +244,35 @@ public class MethodMap
                         {
                             it.remove();
                         }
+                        /* compare applicability */
+                        else if (best.applicability > match.applicability)
+                        {
+                            keepMethod = false;
+                        }
+                        else if (best.applicability < match.applicability)
+                        {
+                            it.remove();
+                        }
                         /* compare methods between them */
                         else
                         {
                             /* but only if some provided args are non null and 
not Object */
-                            if (!onlyNullOrObjects(args))
+                            if (onlyNullOrObjects(args))
+                            {
+                                /* in this case we only favor non-varrags 
methods */
+                                if (match.varargs != best.varargs)
+                                {
+                                    if (match.varargs)
+                                    {
+                                        keepMethod = false;
+                                    }
+                                    else if (best.varargs)
+                                    {
+                                        it.remove();
+                                    }
+                                }
+                            }
+                            else
                             {
                                 switch (compare(match.methodTypes, 
best.methodTypes))
                                 {
@@ -256,14 +284,6 @@ public class MethodMap
                                         break;
                                     case EQUIVALENT:
                                     case INCOMPARABLE:
-                                        /* compare applicability */
-                                        if (best.applicability > 
match.applicability)
-                                        {
-                                            keepMethod = false;
-                                        } else if (best.applicability < 
match.applicability)
-                                        {
-                                            it.remove();
-                                        }
                                         /* otherwise it's an equivalent match 
*/
                                         break;
                                 }

Modified: 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp?rev=1790686&r1=1790685&r2=1790686&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
 Sat Apr  8 14:35:26 2017
@@ -99,7 +99,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td><span class="none">none</span></td>
@@ -147,7 +147,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td><span class="none">none</span></td>
@@ -171,7 +171,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td><span class="none">none</span></td>
@@ -195,7 +195,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td><span class="none">none</span></td>
@@ -219,7 +219,7 @@
           <td>  <span class="implicit">implicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td><span class="none">none</span></td>
@@ -243,7 +243,7 @@
           <td>  <span class="implicit">implicit</span></td>
           <td>  <span class="implicit">implicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td><span class="none">none</span></td>
@@ -291,7 +291,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td> <span class="strict">strict</span></td>
@@ -339,7 +339,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td> <span class="strict">strict</span></td>
@@ -363,7 +363,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td> <span class="strict">strict</span></td>
@@ -387,7 +387,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td> <span class="strict">strict</span></td>
@@ -411,7 +411,7 @@
           <td> <span class="strict">strict</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td> <span class="strict">strict</span></td>
@@ -435,7 +435,7 @@
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="strict">strict</span></td>
           <td> <span class="explicit">explicit</span></td>
-          <td> <span class="none">none</span></td>
+          <td> <span class="explicit">explicit</span></td>
           <td> <span class="explicit">explicit</span></td>
           <td> <span class="none">none</span></td>
           <td> <span class="strict">strict</span></td>


Reply via email to