@@ -7,6 +7,8 @@ import graphql.kickstart.tools.SchemaParserOptions.GenericWrapper
77import graphql.kickstart.tools.util.JavaType
88import graphql.kickstart.tools.util.coroutineScope
99import graphql.kickstart.tools.util.futureValueType
10+ import graphql.kickstart.tools.util.isSuspendFunction
11+ import graphql.kickstart.tools.util.parameterCountWithoutContinuation
1012import graphql.kickstart.tools.util.typeArgument
1113import graphql.kickstart.tools.util.unwrap
1214import graphql.language.*
@@ -26,7 +28,6 @@ import java.lang.reflect.Method
2628import java.util.*
2729import java.util.function.Supplier
2830import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn
29- import kotlin.reflect.full.valueParameters
3031import kotlin.reflect.jvm.javaType
3132import kotlin.reflect.jvm.kotlinFunction
3233
@@ -43,7 +44,7 @@ internal class MethodFieldResolver(
4344 private val log = LoggerFactory .getLogger(javaClass)
4445
4546 private val isSuspendFunction = method.isSuspendFunction()
46- private val numberOfParameters = method.kotlinFunction?.valueParameters?.size ? : method.parameterCount
47+ private val numberOfParameters = method.parameterCountWithoutContinuation()
4748 private val hasAdditionalParameter = numberOfParameters == (field.inputValueDefinitions.size + getIndexOffset() + 1 )
4849
4950 override fun createDataFetcher (): DataFetcher <* > {
@@ -102,7 +103,8 @@ internal class MethodFieldResolver(
102103
103104 // Add DataFetchingEnvironment/Context argument
104105 if (this .hasAdditionalParameter) {
105- when (this .method.parameterTypes.last()) {
106+ // suspend functions have a trailing Continuation parameter
107+ when (this .method.parameterTypes[numberOfParameters - 1 ]) {
106108 null -> throw ResolverError (" Expected at least one argument but got none, this is most likely a bug with graphql-java-tools" )
107109 options.contextClass -> args.add { environment ->
108110 val context: Any? = environment.graphQlContext[options.contextClass]
@@ -282,14 +284,6 @@ private class CompareGenericWrappers {
282284 }
283285}
284286
285- private fun Method.isSuspendFunction (): Boolean {
286- return try {
287- this .kotlinFunction?.isSuspend == true
288- } catch (e: InternalError ) {
289- false
290- }
291- }
292-
293287private suspend inline fun invokeSuspend (target : Any , resolverMethod : Method , args : Array <Any ?>): Any? {
294288 return suspendCoroutineUninterceptedOrReturn { continuation ->
295289 invoke(resolverMethod, target, args + continuation)
0 commit comments