diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/fakeDescriptorsForReferences.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/fakeDescriptorsForReferences.kt index 1e26ea17ecd..018c43e80a8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/fakeDescriptorsForReferences.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/fakeDescriptorsForReferences.kt @@ -114,9 +114,9 @@ private fun ReceiverParameterDescriptor.substituteTopLevelType(newType: KotlinTy private fun TypeApproximator.approximate(type: UnwrappedType, toSuper: Boolean): KotlinType? { if (type.arguments.isEmpty() && type.constructor.isDenotable) return null return if (toSuper) - approximateToSuperType(type, TypeApproximatorConfiguration.PublicDeclaration) + approximateToSuperType(type, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) else - approximateToSubType(type, TypeApproximatorConfiguration.PublicDeclaration) + approximateToSubType(type, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) } /** diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 89c63eecb43..4753ecbcd8e 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -702,9 +702,9 @@ class FirElementSerializer private constructor( } is ConeIntersectionType -> { val approximatedType = if (toSuper) { - typeApproximator.approximateToSuperType(type, TypeApproximatorConfiguration.PublicDeclaration) + typeApproximator.approximateToSuperType(type, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) } else { - typeApproximator.approximateToSubType(type, TypeApproximatorConfiguration.PublicDeclaration) + typeApproximator.approximateToSubType(type, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) } assert(approximatedType != type && approximatedType is ConeKotlinType) { "Approximation failed: ${type.renderForDebugging()}" diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt index 4ebc36edd01..2c2dea1efd2 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirMetadataSerializer.kt @@ -276,9 +276,9 @@ internal fun FirTypeRef.approximated( toSuper: Boolean ): FirTypeRef { val approximatedType = if (toSuper) - approximator.approximateToSuperType(coneType, TypeApproximatorConfiguration.PublicDeclaration) + approximator.approximateToSuperType(coneType, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) else - approximator.approximateToSubType(coneType, TypeApproximatorConfiguration.PublicDeclaration) + approximator.approximateToSubType(coneType, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) return withReplacedConeType(approximatedType as? ConeKotlinType).apply { coneType.collectTypeParameters(typeParameterSet) } } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index b3003ed4238..a07e6ccf020 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -340,9 +340,9 @@ fun FirTypeRef.approximated( return withReplacedConeType(alternativeType) } val approximatedType = if (toSuper) - typeApproximator.approximateToSuperType(alternativeType, TypeApproximatorConfiguration.PublicDeclaration) + typeApproximator.approximateToSuperType(alternativeType, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) else - typeApproximator.approximateToSubType(alternativeType, TypeApproximatorConfiguration.PublicDeclaration) + typeApproximator.approximateToSubType(alternativeType, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) return withReplacedConeType(approximatedType) } diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt index ab939c725fe..4443d46ae7f 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt @@ -139,7 +139,7 @@ class ResultTypeResolver( } private fun KotlinTypeMarker.toPublicType(): KotlinTypeMarker = - typeApproximator.approximateToSuperType(this, TypeApproximatorConfiguration.PublicDeclaration) ?: this + typeApproximator.approximateToSuperType(this, TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes) ?: this private fun Context.isSuitableType(resultType: KotlinTypeMarker, variableWithConstraints: VariableWithConstraints): Boolean { val filteredConstraints = variableWithConstraints.constraints.filter { isProperTypeForFixation(it.type) } diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/types/TypeApproximatorConfiguration.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/types/TypeApproximatorConfiguration.kt index 57312549eda..f03d3d85879 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/types/TypeApproximatorConfiguration.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/types/TypeApproximatorConfiguration.kt @@ -52,12 +52,15 @@ open class TypeApproximatorConfiguration { override val intersectionTypesInContravariantPositions: Boolean get() = true } - object PublicDeclaration : AllFlexibleSameValue() { + open class PublicDeclaration(override val localTypes: Boolean, override val anonymous: Boolean) : AllFlexibleSameValue() { override val allFlexible: Boolean get() = true override val errorType: Boolean get() = true override val definitelyNotNullType: Boolean get() = false override val integerLiteralConstantType: Boolean get() = true override val intersectionTypesInContravariantPositions: Boolean get() = true + + object SaveAnonymousTypes : PublicDeclaration(localTypes = false, anonymous = false) + object ApproximateAnonymousTypes : PublicDeclaration(localTypes = false, anonymous = true) } sealed class AbstractCapturedTypesApproximation(val approximatedCapturedStatus: CaptureStatus?) : diff --git a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt index 1179711fe8b..311c3616fa2 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/types/TypeApproximator.kt @@ -32,7 +32,7 @@ class TypeApproximator( fun approximateDeclarationType(baseType: KotlinType, local: Boolean): UnwrappedType { if (!languageVersionSettings.supportsFeature(LanguageFeature.NewInference)) return baseType.unwrap() - val configuration = if (local) TypeApproximatorConfiguration.LocalDeclaration else TypeApproximatorConfiguration.PublicDeclaration + val configuration = if (local) TypeApproximatorConfiguration.LocalDeclaration else TypeApproximatorConfiguration.PublicDeclaration.SaveAnonymousTypes val preparedType = if (local) baseType.unwrap() else substituteAlternativesInPublicType(baseType) return approximateToSuperType(preparedType, configuration) ?: preparedType }