@@ -3,6 +3,7 @@ package com.coxautodev.graphql.tools
33import com.coxautodev.graphql.tools.SchemaParserOptions.GenericWrapper
44import com.esotericsoftware.reflectasm.MethodAccess
55import com.fasterxml.jackson.core.type.TypeReference
6+ import graphql.TrivialDataFetcher
67import graphql.execution.batched.Batched
78import graphql.language.FieldDefinition
89import graphql.language.ListType
@@ -11,7 +12,8 @@ import graphql.language.Type
1112import graphql.language.TypeName
1213import graphql.schema.DataFetcher
1314import graphql.schema.DataFetchingEnvironment
14- import graphql.schema.GraphQLTypeUtil.isScalar
15+ import graphql.schema.GraphQLTypeUtil.*
16+ import kotlinx.coroutines.GlobalScope
1517import kotlinx.coroutines.future.future
1618import java.lang.reflect.Method
1719import java.util.Comparator
@@ -115,17 +117,24 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
115117 return if (batched) {
116118 BatchedMethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
117119 } else {
118- MethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
120+ if (args.isEmpty() && isTrivialDataFetcher(this .method)) {
121+ TrivialMethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
122+ } else {
123+ MethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
124+ }
125+
119126 }
120127 }
121128
122129 private fun isScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean =
123- when (type) {
124- is ListType ->
130+ when {
131+ type is ListType ->
125132 List ::class .java.isAssignableFrom(this .genericType.getRawClass(genericParameterType))
126133 && isScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
127- is TypeName ->
134+ type is TypeName ->
128135 environment.graphQLSchema?.getType(type.name)?.let { isScalar(it) } ? : false
136+ type is NonNullType && type.type is TypeName ->
137+ environment.graphQLSchema?.getType((type.type as TypeName ).name)?.let { isScalar(unwrapNonNull(it)) } ? : false
129138 else ->
130139 false
131140 }
@@ -220,6 +229,10 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
220229 }
221230}
222231
232+ open class TrivialMethodFieldResolverDataFetcher (private val sourceResolver : SourceResolver , method : Method , private val args : List <ArgumentPlaceholder >, private val options : SchemaParserOptions ) : MethodFieldResolverDataFetcher(sourceResolver, method, args, options), TrivialDataFetcher<Any> {
233+
234+ }
235+
223236private suspend inline fun MethodAccess.invokeSuspend (target : Any , methodIndex : Int , args : Array <Any ?>): Any? {
224237 return suspendCoroutineUninterceptedOrReturn { continuation ->
225238 invoke(target, methodIndex, * args + continuation)
0 commit comments