11package com.coxautodev.graphql.tools
22
33import com.google.common.primitives.Primitives
4- import org.apache.commons.lang3.ClassUtils
54import org.apache.commons.lang3.reflect.TypeUtils
65import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
76import sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
@@ -95,26 +94,33 @@ internal open class GenericType(protected val mostSpecificType: JavaType, protec
9594 val unwrapsTo = genericType.schemaWrapper.invoke(typeArguments[genericType.index])
9695 return unwrapGenericType(unwrapsTo)
9796 }
98- is Class <* > -> if (type.isPrimitive) Primitives .wrap(type) else type
9997 is TypeVariable <* > -> {
100- if (declaringType is ParameterizedType ) {
101- unwrapGenericType( TypeUtils .determineTypeArguments(getRawClass(mostSpecificType), declaringType)[type]
102- ? : error( " No type variable found for: ${ TypeUtils .toLongString(type)} " ) )
98+ val parameterizedDeclaringType = parameterizedDeclaringTypeOrSuperType(declaringType)
99+ if (parameterizedDeclaringType != null ) {
100+ unwrapGenericType(parameterizedDeclaringType, type)
103101 } else {
104- val raw = TypeUtils .getRawType(type, declaringType)
105- if (raw != null ) {
106- unwrapGenericType(raw)
107- } else {
108- error(" Could not resolve type variable '${TypeUtils .toLongString(type)} ' because declaring type is not parameterized: ${TypeUtils .toString(declaringType)} " )
109- }
102+ error(" Could not resolve type variable '${TypeUtils .toLongString(type)} ' because declaring type is not parameterized: ${TypeUtils .toString(declaringType)} " )
110103 }
111104 }
112105 is WildcardTypeImpl -> type.upperBounds.firstOrNull()
113106 ? : throw error(" Unable to unwrap type, wildcard has no upper bound: $type " )
107+ is Class <* > -> if (type.isPrimitive) Primitives .wrap(type) else type
114108 else -> error(" Unable to unwrap type: $type " )
115109 }
116110 }
117111
112+ private fun parameterizedDeclaringTypeOrSuperType (declaringType : JavaType ): ParameterizedType ? =
113+ if (declaringType is ParameterizedType ) {
114+ declaringType
115+ } else {
116+ val superclass = declaringType.unwrap().genericSuperclass
117+ parameterizedDeclaringTypeOrSuperType(superclass)
118+ }
119+
120+ private fun unwrapGenericType (declaringType : ParameterizedType , type : TypeVariable <* >) =
121+ unwrapGenericType(TypeUtils .determineTypeArguments(getRawClass(mostSpecificType), declaringType)[type]
122+ ? : error(" No type variable found for: ${TypeUtils .toLongString(type)} " ))
123+
118124 private fun replaceTypeVariable (type : JavaType ): JavaType {
119125 return when (type) {
120126 is ParameterizedType -> {
@@ -134,9 +140,5 @@ internal open class GenericType(protected val mostSpecificType: JavaType, protec
134140 }
135141 }
136142
137- private fun parameterizedDeclaringType (): JavaType ? {
138- return declaringType as ? ParameterizedType
139- ? : ClassUtils .getAllSuperclasses(declaringType.unwrap()).find { it is ParameterizedType }
140- }
141143 }
142144}
0 commit comments