Remove obsolete experimental coroutines support

in compiler.
This commit is contained in:
Ilmir Usmanov
2021-07-29 08:49:46 +02:00
parent ebb340fe68
commit 486c6b3c15
74 changed files with 349 additions and 1019 deletions
@@ -27,9 +27,6 @@ interface DeserializationConfiguration {
val readDeserializedContracts: Boolean
get() = false
val releaseCoroutines: Boolean
get() = false
/**
* We may want to preserve the order of the declarations the same as in the serialized object
* (for example, to later create a decompiled code with the original order of declarations).
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.FieldDescriptorImpl
@@ -16,13 +15,9 @@ import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.*
import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor.CoroutinesCompatibilityMode
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.UnwrappedType
import org.jetbrains.kotlin.types.typeUtil.contains
class MemberDeserializer(private val c: DeserializationContext) {
private val annotationDeserializer = AnnotationDeserializer(c.components.moduleDescriptor, c.components.notFoundClasses)
@@ -147,40 +142,21 @@ class MemberDeserializer(private val c: DeserializationContext) {
property.initialize(
getter, setter,
FieldDescriptorImpl(getPropertyFieldAnnotations(proto, isDelegate = false), property),
FieldDescriptorImpl(getPropertyFieldAnnotations(proto, isDelegate = true), property),
property.checkExperimentalCoroutine(local.typeDeserializer)
FieldDescriptorImpl(getPropertyFieldAnnotations(proto, isDelegate = true), property)
)
return property
}
private fun DeserializedMemberDescriptor.checkExperimentalCoroutine(
typeDeserializer: TypeDeserializer
): DeserializedMemberDescriptor.CoroutinesCompatibilityMode {
if (!versionAndReleaseCoroutinesMismatch()) return CoroutinesCompatibilityMode.COMPATIBLE
forceUpperBoundsComputation(typeDeserializer)
return if (typeDeserializer.experimentalSuspendFunctionTypeEncountered)
CoroutinesCompatibilityMode.INCOMPATIBLE
else
CoroutinesCompatibilityMode.COMPATIBLE
}
private fun forceUpperBoundsComputation(typeDeserializer: TypeDeserializer) {
typeDeserializer.ownTypeParameters.forEach { it.upperBounds }
}
private fun DeserializedSimpleFunctionDescriptor.initializeWithCoroutinesExperimentalityStatus(
extensionReceiverParameter: ReceiverParameterDescriptor?,
dispatchReceiverParameter: ReceiverParameterDescriptor?,
typeParameters: List<TypeParameterDescriptor>,
unsubstitutedValueParameters: List<ValueParameterDescriptor>,
unsubstitutedReturnType: KotlinType?,
modality: Modality?,
visibility: DescriptorVisibility,
userDataMap: Map<out CallableDescriptor.UserDataKey<*>, *>,
isSuspend: Boolean
extensionReceiverParameter: ReceiverParameterDescriptor?,
dispatchReceiverParameter: ReceiverParameterDescriptor?,
typeParameters: List<TypeParameterDescriptor>,
unsubstitutedValueParameters: List<ValueParameterDescriptor>,
unsubstitutedReturnType: KotlinType?,
modality: Modality?,
visibility: DescriptorVisibility,
userDataMap: Map<out CallableDescriptor.UserDataKey<*>, *>
) {
initialize(
extensionReceiverParameter,
@@ -190,63 +166,12 @@ class MemberDeserializer(private val c: DeserializationContext) {
unsubstitutedReturnType,
modality,
visibility,
userDataMap,
computeExperimentalityModeForFunctions(
extensionReceiverParameter,
unsubstitutedValueParameters,
typeParameters,
unsubstitutedReturnType,
isSuspend
)
userDataMap
)
}
private fun DeserializedCallableMemberDescriptor.computeExperimentalityModeForFunctions(
extensionReceiverParameter: ReceiverParameterDescriptor?,
parameters: Collection<ValueParameterDescriptor>,
typeParameters: Collection<TypeParameterDescriptor>,
returnType: KotlinType?,
isSuspend: Boolean
): DeserializedMemberDescriptor.CoroutinesCompatibilityMode {
if (!versionAndReleaseCoroutinesMismatch()) return CoroutinesCompatibilityMode.COMPATIBLE
if (fqNameOrNull() == KOTLIN_SUSPEND_BUILT_IN_FUNCTION_FQ_NAME) return CoroutinesCompatibilityMode.COMPATIBLE
val types = parameters.map { it.type } + listOfNotNull(extensionReceiverParameter?.type)
if (returnType?.containsSuspendFunctionType() == true) return CoroutinesCompatibilityMode.INCOMPATIBLE
if (typeParameters.any { typeParameter -> typeParameter.upperBounds.any { it.containsSuspendFunctionType() } }) {
return CoroutinesCompatibilityMode.INCOMPATIBLE
}
val maxFromParameters = types.map { type ->
when {
type.isSuspendFunctionType && type.arguments.size <= 3 ->
if (type.arguments.any { it.type.containsSuspendFunctionType() })
CoroutinesCompatibilityMode.INCOMPATIBLE
else
CoroutinesCompatibilityMode.NEEDS_WRAPPER
type.containsSuspendFunctionType() -> CoroutinesCompatibilityMode.INCOMPATIBLE
else -> CoroutinesCompatibilityMode.COMPATIBLE
}
}.maxOrNull() ?: CoroutinesCompatibilityMode.COMPATIBLE
return maxOf(
if (isSuspend)
CoroutinesCompatibilityMode.NEEDS_WRAPPER
else
CoroutinesCompatibilityMode.COMPATIBLE,
maxFromParameters
)
}
private fun KotlinType.containsSuspendFunctionType() = contains(UnwrappedType::isSuspendFunctionType)
private fun DeserializedMemberDescriptor.versionAndReleaseCoroutinesMismatch(): Boolean =
c.components.configuration.releaseCoroutines && versionRequirements.none {
versionRequirements.none {
it.version == VersionRequirement.Version(1, 3) && it.kind == ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION
}
@@ -285,8 +210,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
local.typeDeserializer.type(proto.returnType(c.typeTable)),
ProtoEnumFlags.modality(Flags.MODALITY.get(flags)),
ProtoEnumFlags.descriptorVisibility(Flags.VISIBILITY.get(flags)),
emptyMap<CallableDescriptor.UserDataKey<*>, Any?>(),
Flags.IS_SUSPEND.get(flags)
emptyMap<CallableDescriptor.UserDataKey<*>, Any?>()
)
function.isOperator = Flags.IS_OPERATOR.get(flags)
function.isInfix = Flags.IS_INFIX.get(flags)
@@ -321,8 +245,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
typeAlias.initialize(
local.typeDeserializer.ownTypeParameters,
local.typeDeserializer.simpleType(proto.underlyingType(c.typeTable), expandTypeAliases = false),
local.typeDeserializer.simpleType(proto.expandedType(c.typeTable), expandTypeAliases = false),
typeAlias.checkExperimentalCoroutine(local.typeDeserializer)
local.typeDeserializer.simpleType(proto.expandedType(c.typeTable), expandTypeAliases = false)
)
return typeAlias
@@ -349,19 +272,6 @@ class MemberDeserializer(private val c: DeserializationContext) {
descriptor.setHasStableParameterNames(!Flags.IS_CONSTRUCTOR_WITH_NON_STABLE_PARAMETER_NAMES.get(proto.flags))
val doesClassContainIncompatibility =
(c.containingDeclaration as? DeserializedClassDescriptor)
?.c?.typeDeserializer?.experimentalSuspendFunctionTypeEncountered == true
&& descriptor.versionAndReleaseCoroutinesMismatch()
descriptor.coroutinesExperimentalCompatibilityMode =
if (doesClassContainIncompatibility)
CoroutinesCompatibilityMode.INCOMPATIBLE
else descriptor.computeExperimentalityModeForFunctions(
null, descriptor.valueParameters, descriptor.typeParameters,
descriptor.returnType, isSuspend = false
)
return descriptor
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.builtins.*
import org.jetbrains.kotlin.builtins.StandardNames.CONTINUATION_INTERFACE_FQ_NAME
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.metadata.ProtoBuf
@@ -25,8 +26,7 @@ class TypeDeserializer(
private val parent: TypeDeserializer?,
typeParameterProtos: List<ProtoBuf.TypeParameter>,
private val debugName: String,
private val containerPresentableName: String,
var experimentalSuspendFunctionTypeEncountered: Boolean = false
private val containerPresentableName: String
) {
private val classifierDescriptors: (Int) -> ClassifierDescriptor? =
c.storageManager.createMemoizedFunctionWithNullableValues { fqNameIndex ->
@@ -195,13 +195,9 @@ class TypeDeserializer(
}
private fun transformRuntimeFunctionTypeToSuspendFunction(funType: KotlinType): SimpleType? {
val isReleaseCoroutines = c.components.configuration.releaseCoroutines
val continuationArgumentType = funType.getValueParameterTypesFromFunctionType().lastOrNull()?.type ?: return null
val continuationArgumentFqName = continuationArgumentType.constructor.declarationDescriptor?.fqNameSafe
if (continuationArgumentType.arguments.size != 1 || !(isContinuation(continuationArgumentFqName, true) ||
isContinuation(continuationArgumentFqName, false))
) {
if (continuationArgumentType.arguments.size != 1 || continuationArgumentFqName != CONTINUATION_INTERFACE_FQ_NAME) {
return funType as SimpleType?
}
@@ -212,10 +208,6 @@ class TypeDeserializer(
return createSimpleSuspendFunctionType(funType, suspendReturnType)
}
// Load experimental suspend function type as suspend function type
experimentalSuspendFunctionTypeEncountered = experimentalSuspendFunctionTypeEncountered ||
(isReleaseCoroutines && isContinuation(continuationArgumentFqName, !isReleaseCoroutines))
return createSimpleSuspendFunctionType(funType, suspendReturnType)
}
@@ -34,14 +34,6 @@ interface DeserializedMemberDescriptor : DeserializedDescriptor, MemberDescripto
// Information about the origin of this callable's container (class or package part on JVM) or null if there's no such information.
// TODO: merge with sourceElement of containingDeclaration
override val containerSource: DeserializedContainerSource?
val coroutinesExperimentalCompatibilityMode: CoroutinesCompatibilityMode
enum class CoroutinesCompatibilityMode {
COMPATIBLE,
NEEDS_WRAPPER,
INCOMPATIBLE
}
}
interface DeserializedCallableMemberDescriptor : DeserializedMemberDescriptor, CallableMemberDescriptor
@@ -64,34 +56,6 @@ class DeserializedSimpleFunctionDescriptor(
source ?: SourceElement.NO_SOURCE
) {
override var coroutinesExperimentalCompatibilityMode = DeserializedMemberDescriptor.CoroutinesCompatibilityMode.COMPATIBLE
private set
fun initialize(
extensionReceiverParameter: ReceiverParameterDescriptor?,
dispatchReceiverParameter: ReceiverParameterDescriptor?,
typeParameters: List<TypeParameterDescriptor>,
unsubstitutedValueParameters: List<ValueParameterDescriptor>,
unsubstitutedReturnType: KotlinType?,
modality: Modality?,
visibility: DescriptorVisibility,
userDataMap: Map<out CallableDescriptor.UserDataKey<*>, *>,
isExperimentalCoroutineInReleaseEnvironment: DeserializedMemberDescriptor.CoroutinesCompatibilityMode
): SimpleFunctionDescriptorImpl {
return super.initialize(
extensionReceiverParameter,
dispatchReceiverParameter,
typeParameters,
unsubstitutedValueParameters,
unsubstitutedReturnType,
modality,
visibility,
userDataMap
).also {
this.coroutinesExperimentalCompatibilityMode = isExperimentalCoroutineInReleaseEnvironment
}
}
override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor,
original: FunctionDescriptor?,
@@ -105,7 +69,6 @@ class DeserializedSimpleFunctionDescriptor(
proto, nameResolver, typeTable, versionRequirementTable, containerSource, source
).also {
it.setHasStableParameterNames(hasStableParameterNames())
it.coroutinesExperimentalCompatibilityMode = coroutinesExperimentalCompatibilityMode
}
}
}
@@ -133,20 +96,6 @@ class DeserializedPropertyDescriptor(
containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, SourceElement.NO_SOURCE,
isLateInit, isConst, isExpect, false, isExternal, isDelegated
) {
override var coroutinesExperimentalCompatibilityMode = DeserializedMemberDescriptor.CoroutinesCompatibilityMode.COMPATIBLE
private set
fun initialize(
getter: PropertyGetterDescriptorImpl?,
setter: PropertySetterDescriptor?,
backingField: FieldDescriptor?,
delegateField: FieldDescriptor?,
isExperimentalCoroutineInReleaseEnvironment: DeserializedMemberDescriptor.CoroutinesCompatibilityMode
) {
super.initialize(getter, setter, backingField, delegateField)
.also { this.coroutinesExperimentalCompatibilityMode = isExperimentalCoroutineInReleaseEnvironment }
}
override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor,
newModality: Modality,
@@ -180,9 +129,6 @@ class DeserializedClassConstructorDescriptor(
) : DeserializedCallableMemberDescriptor,
ClassConstructorDescriptorImpl(containingDeclaration, original, annotations, isPrimary, kind, source ?: SourceElement.NO_SOURCE) {
override var coroutinesExperimentalCompatibilityMode = DeserializedMemberDescriptor.CoroutinesCompatibilityMode.COMPATIBLE
internal set
override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor,
original: FunctionDescriptor?,
@@ -196,7 +142,6 @@ class DeserializedClassConstructorDescriptor(
proto, nameResolver, typeTable, versionRequirementTable, containerSource, source
).also {
it.setHasStableParameterNames(hasStableParameterNames())
it.coroutinesExperimentalCompatibilityMode = coroutinesExperimentalCompatibilityMode
}
}
@@ -229,14 +174,10 @@ class DeserializedTypeAliasDescriptor(
private lateinit var typeConstructorParameters: List<TypeParameterDescriptor>
private lateinit var defaultTypeImpl: SimpleType
override var coroutinesExperimentalCompatibilityMode = DeserializedMemberDescriptor.CoroutinesCompatibilityMode.COMPATIBLE
private set
fun initialize(
declaredTypeParameters: List<TypeParameterDescriptor>,
underlyingType: SimpleType,
expandedType: SimpleType,
isExperimentalCoroutineInReleaseEnvironment: DeserializedMemberDescriptor.CoroutinesCompatibilityMode
expandedType: SimpleType
) {
initialize(declaredTypeParameters)
this.underlyingType = underlyingType
@@ -244,7 +185,6 @@ class DeserializedTypeAliasDescriptor(
typeConstructorParameters = computeConstructorTypeParameters()
defaultTypeImpl = computeDefaultType()
constructors = getTypeAliasConstructors()
this.coroutinesExperimentalCompatibilityMode = isExperimentalCoroutineInReleaseEnvironment
}
override val classDescriptor: ClassDescriptor?
@@ -261,8 +201,7 @@ class DeserializedTypeAliasDescriptor(
substituted.initialize(
declaredTypeParameters,
substitutor.safeSubstitute(underlyingType, Variance.INVARIANT).asSimpleType(),
substitutor.safeSubstitute(expandedType, Variance.INVARIANT).asSimpleType(),
coroutinesExperimentalCompatibilityMode
substitutor.safeSubstitute(expandedType, Variance.INVARIANT).asSimpleType()
)
return substituted