@@ -3,6 +3,7 @@ package com.coxautodev.graphql.tools
3
3
import com.coxautodev.graphql.tools.SchemaParserOptions.GenericWrapper
4
4
import com.esotericsoftware.reflectasm.MethodAccess
5
5
import com.fasterxml.jackson.core.type.TypeReference
6
+ import graphql.TrivialDataFetcher
6
7
import graphql.execution.batched.Batched
7
8
import graphql.language.FieldDefinition
8
9
import graphql.language.ListType
@@ -11,7 +12,7 @@ import graphql.language.Type
11
12
import graphql.language.TypeName
12
13
import graphql.schema.DataFetcher
13
14
import graphql.schema.DataFetchingEnvironment
14
- import graphql.schema.GraphQLTypeUtil.isScalar
15
+ import graphql.schema.GraphQLTypeUtil.*
15
16
import kotlinx.coroutines.GlobalScope
16
17
import kotlinx.coroutines.future.future
17
18
import java.lang.reflect.Method
@@ -116,17 +117,24 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
116
117
return if (batched) {
117
118
BatchedMethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
118
119
} 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
+
120
126
}
121
127
}
122
128
123
129
private fun isScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean =
124
- when (type) {
125
- is ListType ->
130
+ when {
131
+ type is ListType ->
126
132
List ::class .java.isAssignableFrom(this .genericType.getRawClass(genericParameterType))
127
133
&& isScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
128
- is TypeName ->
134
+ type is TypeName ->
129
135
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
130
138
else ->
131
139
false
132
140
}
@@ -221,6 +229,10 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
221
229
}
222
230
}
223
231
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
+
224
236
private suspend inline fun MethodAccess.invokeSuspend (target : Any , methodIndex : Int , args : Array <Any ?>): Any? {
225
237
return suspendCoroutineUninterceptedOrReturn { continuation ->
226
238
invoke(target, methodIndex, * args + continuation)
0 commit comments