Skip to content

Commit 7a0c8cd

Browse files
committed
Add support for generic map value types
1 parent 305d630 commit 7a0c8cd

File tree

2 files changed

+10
-16
lines changed

2 files changed

+10
-16
lines changed

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

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

3+
import com.fasterxml.classmate.ResolvedType
34
import com.google.common.primitives.Primitives
45
import org.apache.commons.lang3.reflect.TypeUtils
56
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
@@ -131,6 +132,14 @@ internal open class GenericType(protected val mostSpecificType: JavaType, protec
131132
val actualTypeArguments = type.actualTypeArguments.map { replaceTypeVariable(it) }.toTypedArray()
132133
ParameterizedTypeImpl.make(type.rawType as Class<*>?, actualTypeArguments, type.ownerType)
133134
}
135+
is ResolvedType -> {
136+
if (type.typeParameters.isEmpty()) {
137+
type.erasedType
138+
} else {
139+
val actualTypeArguments = type.typeParameters.map { replaceTypeVariable(it) }.toTypedArray()
140+
ParameterizedTypeImpl.make(type.erasedType, actualTypeArguments, null)
141+
}
142+
}
134143
is TypeVariable<*> -> {
135144
if (declaringType is ParameterizedType) {
136145
TypeUtils.getRawType(type, declaringType)

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

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,10 @@ internal class PropertyMapResolver(field: FieldDefinition, search: FieldResolver
1414

1515
var mapGenericValue : JavaType = getMapGenericType(relativeTo)
1616

17-
/**
18-
* this impl still has some problems:
19-
* - mapClass lost its generics somewhere along the way, so if you had
20-
* something like {@code class Resolver<V> implements Map<String, V>}
21-
* then we won't be able to infer the value type
22-
* - this doesn't handle the case of the map value type being generic,
23-
* for example {@code class Resolver implements Map<String, MyType<MyTypeArg>>}
24-
*/
2517
fun getMapGenericType(mapClass : JavaType) : JavaType {
2618
val resolvedType = TypeResolver().resolve(mapClass)
2719

28-
val mapValueType = resolvedType.typeParametersFor(Map::class.java)[1]
29-
if (mapValueType.typeParameters.isEmpty()) {
30-
// no type params should mean regular class
31-
return mapValueType.erasedType
32-
} else {
33-
// TODO raise an error? try to handle this case?
34-
return Object::class.java
35-
}
20+
return resolvedType.typeParametersFor(Map::class.java)[1]
3621
}
3722

3823
override fun createDataFetcher(): DataFetcher<*> {

0 commit comments

Comments
 (0)