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>