@@ -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,7 @@ 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.*
1516import kotlinx.coroutines.GlobalScope
1617import kotlinx.coroutines.future.future
1718import java.lang.reflect.Method
@@ -116,17 +117,24 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
116117 return if (batched) {
117118 BatchedMethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
118119 } else {
119- 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+
120126 }
121127 }
122128
123129 private fun isScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean =
124- when (type) {
125- is ListType ->
130+ when {
131+ type is ListType ->
126132 List ::class .java.isAssignableFrom(this .genericType.getRawClass(genericParameterType))
127133 && isScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
128- is TypeName ->
134+ type is TypeName ->
129135 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
130138 else ->
131139 false
132140 }
@@ -221,6 +229,10 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
221229 }
222230}
223231
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+
224236private suspend inline fun MethodAccess.invokeSuspend (target : Any , methodIndex : Int , args : Array <Any ?>): Any? {
225237 return suspendCoroutineUninterceptedOrReturn { continuation ->
226238 invoke(target, methodIndex, * args + continuation)
0 commit comments