@@ -5,13 +5,18 @@ import com.esotericsoftware.reflectasm.MethodAccess
55import com.fasterxml.jackson.core.type.TypeReference
66import graphql.execution.batched.Batched
77import graphql.language.FieldDefinition
8+ import graphql.language.ListType
89import graphql.language.NonNullType
10+ import graphql.language.Type
11+ import graphql.language.TypeName
912import graphql.schema.DataFetcher
1013import graphql.schema.DataFetchingEnvironment
14+ import graphql.schema.GraphQLTypeUtil.isScalar
1115import kotlinx.coroutines.GlobalScope
1216import kotlinx.coroutines.future.future
1317import java.lang.reflect.Method
14- import java.util.*
18+ import java.util.Comparator
19+ import java.util.Optional
1520import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn
1621import kotlin.reflect.full.valueParameters
1722import kotlin.reflect.jvm.javaType
@@ -89,6 +94,12 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
8994 }
9095 }
9196
97+ if (value != null
98+ && genericParameterType.unwrap().isAssignableFrom(value.javaClass)
99+ && isScalarType(environment, definition.type, genericParameterType)) {
100+ return @add value
101+ }
102+
92103 return @add mapper.convertValue(value, typeReference)
93104 }
94105 }
@@ -109,9 +120,24 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
109120 }
110121 }
111122
123+ private fun isScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean =
124+ when (type) {
125+ is ListType ->
126+ List ::class .java.isAssignableFrom(this .genericType.getRawClass(genericParameterType))
127+ && isScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
128+ is TypeName ->
129+ environment.graphQLSchema?.getType(type.name)?.let { isScalar(it) } ? : false
130+ else ->
131+ false
132+ }
133+
112134 override fun scanForMatches (): List <TypeClassMatcher .PotentialMatch > {
113135 val batched = isBatched(method, search)
114- val unwrappedGenericType = genericType.unwrapGenericType(try { method.kotlinFunction?.returnType?.javaType ? : method.genericReturnType } catch (e: InternalError ) { method.genericReturnType })
136+ val unwrappedGenericType = genericType.unwrapGenericType(try {
137+ method.kotlinFunction?.returnType?.javaType ? : method.genericReturnType
138+ } catch (e: InternalError ) {
139+ method.genericReturnType
140+ })
115141 val returnValueMatch = TypeClassMatcher .PotentialMatch .returnValue(field.type, unwrappedGenericType, genericType, SchemaClassScanner .ReturnValueReference (method), batched)
116142
117143 return field.inputValueDefinitions.mapIndexed { i, inputDefinition ->
@@ -148,7 +174,11 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
148174 // Convert to reflactasm reflection
149175 private val methodAccess = MethodAccess .get(method.declaringClass)!!
150176 private val methodIndex = methodAccess.getIndex(method.name, * method.parameterTypes)
151- private val isSuspendFunction = try {method.kotlinFunction?.isSuspend == true } catch (e: InternalError ) { false }
177+ private val isSuspendFunction = try {
178+ method.kotlinFunction?.isSuspend == true
179+ } catch (e: InternalError ) {
180+ false
181+ }
152182
153183 private class CompareGenericWrappers {
154184 companion object : Comparator <GenericWrapper > {
0 commit comments