Skip to content

Commit 94fa444

Browse files
committed
Fixed unit tests for generics
1 parent c4e6df5 commit 94fa444

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/main/kotlin/com/coxautodev/graphql/tools/GenericType.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.coxautodev.graphql.tools
22

33
import com.google.common.primitives.Primitives
4-
import org.apache.commons.lang3.ClassUtils
54
import org.apache.commons.lang3.reflect.TypeUtils
65
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
76
import 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

Comments
 (0)