@@ -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,8 @@ 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.*
16
+ import kotlinx.coroutines.GlobalScope
15
17
import kotlinx.coroutines.future.future
16
18
import java.lang.reflect.Method
17
19
import java.util.Comparator
@@ -115,17 +117,24 @@ internal class MethodFieldResolver(field: FieldDefinition, search: FieldResolver
115
117
return if (batched) {
116
118
BatchedMethodFieldResolverDataFetcher (getSourceResolver(), this .method, args, options)
117
119
} 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
+
119
126
}
120
127
}
121
128
122
129
private fun isScalarType (environment : DataFetchingEnvironment , type : Type <* >, genericParameterType : JavaType ): Boolean =
123
- when (type) {
124
- is ListType ->
130
+ when {
131
+ type is ListType ->
125
132
List ::class .java.isAssignableFrom(this .genericType.getRawClass(genericParameterType))
126
133
&& isScalarType(environment, type.type, this .genericType.unwrapGenericType(genericParameterType))
127
- is TypeName ->
134
+ type is TypeName ->
128
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
129
138
else ->
130
139
false
131
140
}
@@ -220,6 +229,10 @@ open class MethodFieldResolverDataFetcher(private val sourceResolver: SourceReso
220
229
}
221
230
}
222
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
+
223
236
private suspend inline fun MethodAccess.invokeSuspend (target : Any , methodIndex : Int , args : Array <Any ?>): Any? {
224
237
return suspendCoroutineUninterceptedOrReturn { continuation ->
225
238
invoke(target, methodIndex, * args + continuation)
0 commit comments