11package com.coxautodev.graphql.tools
22
3+ import com.fasterxml.classmate.TypeResolver
34import graphql.language.FieldDefinition
45import graphql.schema.DataFetcher
56import graphql.schema.DataFetchingEnvironment
6- import java.lang.reflect.ParameterizedType
77
88/* *
99 * @author Nick Weedon
@@ -14,10 +14,23 @@ 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+ */
1725 fun getMapGenericType (mapClass : JavaType ) : JavaType {
18- if (mapClass is ParameterizedType ) {
19- return mapClass.actualTypeArguments[1 ]
26+ val resolvedType = TypeResolver ().resolve(mapClass)
27+
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
2032 } else {
33+ // TODO raise an error? try to handle this case?
2134 return Object ::class .java
2235 }
2336 }
0 commit comments