@@ -191,48 +191,33 @@ internal class MethodFieldResolver(
191
191
override fun toString () = " MethodFieldResolver{method=$method }"
192
192
}
193
193
194
- internal open class MethodFieldResolverDataFetcher (
194
+ internal class MethodFieldResolverDataFetcher (
195
195
private val sourceResolver : SourceResolver ,
196
- method : Method ,
196
+ private val method : Method ,
197
197
private val args : List <ArgumentPlaceholder >,
198
198
private val options : SchemaParserOptions ,
199
199
) : DataFetcher<Any> {
200
200
201
- private val resolverMethod = method
202
- private val isSuspendFunction = try {
203
- method.kotlinFunction?.isSuspend == true
204
- } catch (e: InternalError ) {
205
- false
206
- }
201
+ private val isSuspendFunction = method.isSuspendFunction()
207
202
208
203
override fun get (environment : DataFetchingEnvironment ): Any? {
209
204
val source = sourceResolver.resolve(environment, null )
210
205
val args = this .args.map { it(environment) }.toTypedArray()
211
206
212
207
return if (isSuspendFunction) {
213
208
environment.coroutineScope().future(options.coroutineContextProvider.provide()) {
214
- invokeSuspend(source, resolverMethod , args)?.transformWithGenericWrapper(environment)
209
+ invokeSuspend(source, method , args)?.transformWithGenericWrapper(options.genericWrappers, { environment } )
215
210
}
216
211
} else {
217
- invoke(resolverMethod , source, args)?.transformWithGenericWrapper(environment)
212
+ invoke(method , source, args)?.transformWithGenericWrapper(options.genericWrappers, { environment } )
218
213
}
219
214
}
220
215
221
- private fun Any.transformWithGenericWrapper (environment : DataFetchingEnvironment ): Any? {
222
- return options.genericWrappers
223
- .asSequence()
224
- .filter { it.type.isInstance(this ) }
225
- .sortedWith(CompareGenericWrappers )
226
- .firstOrNull()
227
- ?.transformer?.invoke(this , environment) ? : this
228
- }
229
-
230
216
/* *
231
- * Function that returns the object used to fetch the data.
232
- * It can be a DataFetcher or an entity.
217
+ * Function that returns the object used to fetch the data. It can be a DataFetcher or an entity.
233
218
*/
234
219
@Suppress(" unused" )
235
- open fun getWrappedFetchingObject (environment : DataFetchingEnvironment ): Any {
220
+ fun getWrappedFetchingObject (environment : DataFetchingEnvironment ): Any {
236
221
return sourceResolver.resolve(environment, null )
237
222
}
238
223
}
@@ -247,38 +232,45 @@ internal class LightMethodFieldResolverDataFetcher(
247
232
private val options : SchemaParserOptions ,
248
233
) : LightDataFetcher<Any?> {
249
234
250
- private val resolverMethod = method
251
- private val isSuspendFunction = try {
252
- method.kotlinFunction?.isSuspend == true
253
- } catch (e: InternalError ) {
254
- false
255
- }
235
+ private val isSuspendFunction = method.isSuspendFunction()
256
236
257
237
override fun get (fieldDefinition : GraphQLFieldDefinition , sourceObject : Any , environmentSupplier : Supplier <DataFetchingEnvironment >): Any? {
258
238
val source = sourceResolver.resolve(null , sourceObject)
239
+
259
240
return if (isSuspendFunction) {
260
241
environmentSupplier.get().coroutineScope().future(options.coroutineContextProvider.provide()) {
261
- invokeSuspend(source, resolverMethod , emptyArray())?.transformWithGenericWrapper(environmentSupplier)
242
+ invokeSuspend(source, method , emptyArray())?.transformWithGenericWrapper(options.genericWrappers, environmentSupplier)
262
243
}
263
244
} else {
264
- invoke(resolverMethod , source, emptyArray())?.transformWithGenericWrapper(environmentSupplier)
245
+ invoke(method , source, emptyArray())?.transformWithGenericWrapper(options.genericWrappers, environmentSupplier)
265
246
}
266
247
}
267
248
268
249
override fun get (environment : DataFetchingEnvironment ): Any? {
269
250
return get(environment.fieldDefinition, sourceResolver.resolve(environment, null ), { environment })
270
251
}
271
252
272
- private fun Any.transformWithGenericWrapper (environment : Supplier <DataFetchingEnvironment >): Any? {
273
- return options.genericWrappers
274
- .asSequence()
275
- .filter { it.type.isInstance(this ) }
276
- .sortedWith(CompareGenericWrappers )
277
- .firstOrNull()
278
- ?.transformer?.invoke(this , environment.get()) ? : this
253
+ /* *
254
+ * Function that returns the object used to fetch the data. It can be a DataFetcher or an entity.
255
+ */
256
+ @Suppress(" unused" )
257
+ fun getWrappedFetchingObject (environment : DataFetchingEnvironment ): Any {
258
+ return sourceResolver.resolve(environment, null )
279
259
}
280
260
}
281
261
262
+ private fun Any.transformWithGenericWrapper (
263
+ genericWrappers : List <GenericWrapper >,
264
+ environmentSupplier : Supplier <DataFetchingEnvironment >
265
+ ): Any? {
266
+ return genericWrappers
267
+ .asSequence()
268
+ .filter { it.type.isInstance(this ) }
269
+ .sortedWith(CompareGenericWrappers )
270
+ .firstOrNull()
271
+ ?.transformer?.invoke(this , environmentSupplier.get()) ? : this
272
+ }
273
+
282
274
private class CompareGenericWrappers {
283
275
companion object : Comparator <GenericWrapper > {
284
276
override fun compare (w1 : GenericWrapper , w2 : GenericWrapper ): Int = when {
@@ -288,6 +280,14 @@ private class CompareGenericWrappers {
288
280
}
289
281
}
290
282
283
+ private fun Method.isSuspendFunction (): Boolean {
284
+ return try {
285
+ this .kotlinFunction?.isSuspend == true
286
+ } catch (e: InternalError ) {
287
+ false
288
+ }
289
+ }
290
+
291
291
private suspend inline fun invokeSuspend (target : Any , resolverMethod : Method , args : Array <Any ?>): Any? {
292
292
return suspendCoroutineUninterceptedOrReturn { continuation ->
293
293
invoke(resolverMethod, target, args + continuation)
0 commit comments