Remove obsolete experimental coroutines support
in compiler.
This commit is contained in:
-3
@@ -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).
|
||||
|
||||
+13
-103
@@ -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
|
||||
}
|
||||
|
||||
|
||||
+3
-11
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+2
-63
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user