Repository: tapestry-5 Updated Branches: refs/heads/5.4.x 2c0edea0a -> bc7199284
TAP5-2560: Error in GenericsUtils affecting property access Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/32fde0f8 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/32fde0f8 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/32fde0f8 Branch: refs/heads/5.4.x Commit: 32fde0f8c38f89d596d78b7f2292b4a26958f484 Parents: 2c0edea Author: Thiago H. de Paula Figueiredo <[email protected]> Authored: Wed Jan 9 00:22:53 2019 -0200 Committer: Thiago H. de Paula Figueiredo <[email protected]> Committed: Wed Jan 9 22:44:57 2019 -0200 ---------------------------------------------------------------------- .../ioc/internal/util/GenericsUtils.java | 50 ++++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/32fde0f8/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/GenericsUtils.java ---------------------------------------------------------------------- diff --git a/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/GenericsUtils.java b/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/GenericsUtils.java index bd834a5..3a9b5c8 100644 --- a/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/GenericsUtils.java +++ b/commons/src/main/java/org/apache/tapestry5/ioc/internal/util/GenericsUtils.java @@ -12,8 +12,18 @@ package org.apache.tapestry5.ioc.internal.util; -import java.lang.reflect.*; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.GenericDeclaration; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; +import java.util.ArrayList; import java.util.LinkedList; +import java.util.List; /** * Static methods related to the use of JDK 1.5 generics. @@ -367,15 +377,7 @@ public class GenericsUtils } Class theClass = asClass(containingType); - Type genericSuperclass = theClass.getGenericSuperclass(); - while (genericSuperclass != null && // true for interfaces with no superclass - !theClass.equals(Object.class) && - !theClass.equals(typeVariableOwner)) - { - stack.addFirst(genericSuperclass); - theClass = asClass(genericSuperclass); - genericSuperclass = theClass.getGenericSuperclass(); - } + addGenericSuperclasses(theClass, typeVariableOwner, stack); int i = getTypeVariableIndex(typeVariable); Type resolved = typeVariable; @@ -400,6 +402,34 @@ public class GenericsUtils return ((TypeVariable) resolved).getBounds()[0]; } + + private static void addGenericSuperclasses(Class theClass, final Class typeVariableOwner, final LinkedList<Type> stack) { + Type genericSuperclass = theClass.getGenericSuperclass(); + while (genericSuperclass != null && // true for interfaces with no superclass + !theClass.equals(Object.class) && + !theClass.equals(typeVariableOwner)) + { + stack.addFirst(genericSuperclass); + theClass = asClass(genericSuperclass); + genericSuperclass = theClass.getGenericSuperclass(); + } + for (Type type : theClass.getGenericInterfaces()) { + stack.add(type); + } + for (Class implementedInterface : getAllImplementedInterfaces(theClass)) { + addGenericSuperclasses(implementedInterface, typeVariableOwner, stack); + } + } + + private static List<Class> getAllImplementedInterfaces(Class theClass) { + List<Class> list = new ArrayList<>(); + for (Class implementedInterface : theClass.getInterfaces()) { + list.add(implementedInterface); + list.addAll(getAllImplementedInterfaces(implementedInterface)); + } + return list; + } + /** * @param type - something like List<T>[] or List<? extends T>[] or T[] * @param containingType - the shallowest type in the hierarchy where type is defined.
