You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by nb...@apache.org on 2008/07/14 23:15:29 UTC

svn commit: r676740 - in /velocity/engine/trunk/src: java/org/apache/velocity/util/introspection/MethodMap.java test/org/apache/velocity/test/VarargMethodsTestCase.java

Author: nbubna
Date: Mon Jul 14 14:15:29 2008
New Revision: 676740

URL: http://svn.apache.org/viewvc?rev=676740&view=rev
Log:
fix for VELOCITY-605, prefer foo(Object) to foo(Object[])

Modified:
    velocity/engine/trunk/src/java/org/apache/velocity/util/introspection/MethodMap.java
    velocity/engine/trunk/src/test/org/apache/velocity/test/VarargMethodsTestCase.java

Modified: velocity/engine/trunk/src/java/org/apache/velocity/util/introspection/MethodMap.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/util/introspection/MethodMap.java?rev=676740&r1=676739&r2=676740&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/util/introspection/MethodMap.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/util/introspection/MethodMap.java Mon Jul 14 14:15:29 2008
@@ -272,10 +272,24 @@
             if(c2MoreSpecific)
             {
                 /*
+                 * If one method accepts varargs and the other does not,
+                 * call the non-vararg one more specific.
+                 */
+                boolean last1Array = c1[c1.length - 1].isArray();
+                boolean last2Array = c2[c2.length - 1].isArray();
+                if (last1Array && !last2Array)
+                {
+                    return LESS_SPECIFIC;
+                }
+                if (!last1Array && last2Array)
+                {
+                    return MORE_SPECIFIC;
+                }
+
+                /*
                  *  Incomparable due to cross-assignable arguments (i.e.
                  * foo(String, Object) vs. foo(Object, String))
                  */
-
                 return INCOMPARABLE;
             }
 

Modified: velocity/engine/trunk/src/test/org/apache/velocity/test/VarargMethodsTestCase.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/test/org/apache/velocity/test/VarargMethodsTestCase.java?rev=676740&r1=676739&r2=676740&view=diff
==============================================================================
--- velocity/engine/trunk/src/test/org/apache/velocity/test/VarargMethodsTestCase.java (original)
+++ velocity/engine/trunk/src/test/org/apache/velocity/test/VarargMethodsTestCase.java Mon Jul 14 14:15:29 2008
@@ -132,6 +132,12 @@
         assertEvalEquals("object,string", "$nasty.test($nice,'foo')");
     }
 
+    public void testObjectVarArgVsObjectVelocity605()
+    {
+        assertEvalEquals("string", "$nasty.test('joe')");
+        assertEvalEquals("object", "$nasty.test($nice)");
+    }
+
     public void testNoArgs()
     {
         assertEvalEquals("noargs", "$nasty.test()");
@@ -221,6 +227,16 @@
             return "noargs";
         }
 
+        public Object test(Object arg)
+        {
+            return "object";
+        }
+
+        public Object test(String arg)
+        {
+            return "string";
+        }
+
         public String test(Object[] array)
         {
             return "object[]";