[Native] Move isRestrictedSuspendFunction from IrUtils2

This function is also helpful for JVM backend.
This commit is contained in:
Ivan Kylchik
2023-08-16 11:17:03 +02:00
committed by Space Team
parent 2657adc6dc
commit 5cd96831dc
4 changed files with 11 additions and 9 deletions
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.impl.MutableClassDescriptor
import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.checkers.isRestrictedSuspendFunction
import org.jetbrains.kotlin.resolve.calls.checkers.isRestrictsSuspensionReceiver import org.jetbrains.kotlin.resolve.calls.checkers.isRestrictsSuspensionReceiver
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -108,9 +109,7 @@ class JvmRuntimeTypes(
if (descriptor.isSuspend) { if (descriptor.isSuspend) {
return mutableListOf<KotlinType>().apply { return mutableListOf<KotlinType>().apply {
if (actualFunctionDescriptor.extensionReceiverParameter?.type if (actualFunctionDescriptor.isRestrictedSuspendFunction()) {
?.isRestrictsSuspensionReceiver() == true
) {
if (descriptor.isSuspendLambdaOrLocalFunction()) { if (descriptor.isSuspendLambdaOrLocalFunction()) {
add(restrictedSuspendLambda.defaultType) add(restrictedSuspendLambda.defaultType)
} else { } else {
@@ -144,6 +144,9 @@ fun KotlinType.isRestrictsSuspensionReceiver() = (listOf(this) + this.supertypes
) == true ) == true
} }
fun FunctionDescriptor.isRestrictedSuspendFunction(): Boolean =
extensionReceiverParameter?.type?.isRestrictsSuspensionReceiver() == true
private fun checkRestrictsSuspension( private fun checkRestrictsSuspension(
enclosingSuspendCallableDescriptor: CallableDescriptor, enclosingSuspendCallableDescriptor: CallableDescriptor,
resolvedCall: ResolvedCall<*>, resolvedCall: ResolvedCall<*>,
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.irCall import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
@@ -26,6 +27,8 @@ import org.jetbrains.kotlin.ir.types.makeNotNull
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.ir.visitors.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.checkers.isRestrictedSuspendFunction
import org.jetbrains.kotlin.resolve.calls.checkers.isRestrictsSuspensionReceiver
internal class NativeSuspendFunctionsLowering( internal class NativeSuspendFunctionsLowering(
generationState: NativeGenerationState generationState: NativeGenerationState
@@ -35,12 +38,13 @@ internal class NativeSuspendFunctionsLowering(
override val stateMachineMethodName = Name.identifier("invokeSuspend") override val stateMachineMethodName = Name.identifier("invokeSuspend")
@OptIn(ObsoleteDescriptorBasedAPI::class)
override fun getCoroutineBaseClass(function: IrFunction): IrClassSymbol = override fun getCoroutineBaseClass(function: IrFunction): IrClassSymbol =
(if (function.isRestrictedSuspendFunction()) { if (function.descriptor.isRestrictedSuspendFunction()) {
symbols.restrictedContinuationImpl symbols.restrictedContinuationImpl
} else { } else {
symbols.continuationImpl symbols.continuationImpl
}) }
override fun nameForCoroutineClass(function: IrFunction) = override fun nameForCoroutineClass(function: IrFunction) =
fileLowerState.getCoroutineImplUniqueName(function).synthesizedName fileLowerState.getCoroutineImplUniqueName(function).synthesizedName
@@ -75,10 +75,6 @@ fun IrBuilderWithScope.irCatch() =
) )
) )
@OptIn(ObsoleteDescriptorBasedAPI::class)
fun IrFunction.isRestrictedSuspendFunction(): Boolean =
this.descriptor.extensionReceiverParameter?.type?.isRestrictsSuspensionReceiver() == true
fun IrBuilderWithScope.irByte(value: Byte) = fun IrBuilderWithScope.irByte(value: Byte) =
IrConstImpl.byte(startOffset, endOffset, context.irBuiltIns.byteType, value) IrConstImpl.byte(startOffset, endOffset, context.irBuiltIns.byteType, value)