| // Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:async'; | |
| import 'package:meta/meta.dart' show internal; | |
| import 'jni.dart'; | |
| import 'jobject.dart'; | |
| import 'types.dart'; | |
| @internal | |
| final coroutineSingletonsClass = JClass.forName( | |
| 'kotlin/coroutines/intrinsics/CoroutineSingletons', | |
| ); | |
| @internal | |
| final result$FailureClass = JClass.forName(r'kotlin/Result$Failure'); | |
| @internal | |
| final failureExceptionField = result$FailureClass.instanceFieldId( | |
| 'exception', | |
| 'Ljava/lang/Throwable;', | |
| ); | |
| @internal | |
| final result$Class = JClass.forName(r'kotlin/Result'); | |
| @internal | |
| final resultValueField = result$Class.instanceFieldId( | |
| 'value', | |
| 'Ljava/lang/Object;', | |
| ); | |
| final _coroutineIntrinsicsClass = JClass.forName( | |
| 'kotlin/coroutines/intrinsics/IntrinsicsKt', | |
| ); | |
| final _coroutineSuspended = _coroutineIntrinsicsClass.staticMethodId( | |
| 'getCOROUTINE_SUSPENDED', | |
| '()Ljava/lang/Object;', | |
| )(_coroutineIntrinsicsClass, const $JObject$Type$(), []); | |
| final _unitClass = JClass.forName('kotlin/Unit'); | |
| final _unit = _unitClass | |
| .staticFieldId('INSTANCE', 'Lkotlin/Unit;') | |
| .get(_unitClass, const $JObject$Type$()); | |
| @internal | |
| class KotlinContinuation extends JObject { | |
| KotlinContinuation.fromReference(super.reference) : super.fromReference(); | |
| static final _class = JClass.forName(r'kotlin/coroutines/Continuation'); | |
| static final _resumeWithId = _class.instanceMethodId( | |
| r'resumeWith', | |
| r'(Ljava/lang/Object;)V', | |
| ); | |
| void resumeWith(JObject? result) { | |
| _resumeWithId(this, const jvoidType(), [result]); | |
| } | |
| static final _result$FailureConstructor = result$FailureClass.constructorId( | |
| r'(Ljava/lang/Throwable;)V', | |
| ); | |
| void resumeWithException(Object dartException, StackTrace stackTrace) { | |
| resumeWith( | |
| _result$FailureConstructor<JObject>(result$FailureClass, [ | |
| ProtectedJniExtensions.newDartException('$dartException\n$stackTrace'), | |
| ]), | |
| ); | |
| } | |
| JObject resumeWithFuture(Future<JObject?> future) { | |
| unawaited(future.then(resumeWith, onError: resumeWithException)); | |
| return _coroutineSuspended; | |
| } | |
| JObject resumeWithVoidFuture(Future<void> future) => | |
| resumeWithFuture(future.then((_) => _unit)); | |
| } |