[Native] Move isRestrictedSuspendFunction from IrUtils2
This function is also helpful for JVM backend.
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
+3
@@ -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<*>,
|
||||||
|
|||||||
+6
-2
@@ -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
|
||||||
|
|||||||
-4
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user