From fdc236296d03d543358c7817a0d34b171f1eda61 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 24 May 2023 10:11:25 +0300 Subject: [PATCH] [FIR2IR] Generate @FlexibleMutability annotation on IR types if needed --- ...ir2IrJvmSpecialAnnotationSymbolProvider.kt | 5 ++- .../kotlin/fir/backend/Fir2IrBuiltIns.kt | 7 ++++ .../kotlin/fir/backend/Fir2IrTypeConverter.kt | 28 +++++++++++++-- .../reflection/typeOf/flexibleTypes_after.kt | 2 -- .../box/reflection/typeOf/rawTypes_after.kt | 2 -- .../ir/irText/classes/kt45934.fir.ir.txt | 8 ++--- .../firProblems/AbstractMutableMap.fir.ir.txt | 16 ++++----- .../firProblems/AllCandidates.fir.ir.txt | 2 +- .../SyntheticSetterType.fir.ir.txt | 8 ----- .../SyntheticSetterType.fir.kt.txt | 3 -- .../irText/firProblems/SyntheticSetterType.kt | 1 + .../typeParametersInImplicitCast.fir.ir.txt | 4 +-- .../typeParametersInImplicitCast.fir.kt.txt | 2 +- .../ir/irText/stubs/builtinMap.fir.ir.txt | 2 +- .../irText/types/javaWildcardType.fir.ir.txt | 36 +++++++++---------- .../irText/types/javaWildcardType.fir.kt.txt | 8 ++--- ...bilityInDestructuringAssignment.fir.ir.txt | 4 +-- ...bilityInDestructuringAssignment.fir.kt.txt | 2 +- .../enhancedNullabilityInForLoop.fir.ir.txt | 8 ++--- .../types/rawTypeInSignature.fir.ir.txt | 20 +++++------ .../types/rawTypeInSignature.fir.kt.txt | 7 ++-- .../jetbrains/kotlin/name/StandardClassIds.kt | 1 + .../types/CommonFlexibleTypeBoundsChecker.kt | 27 ++++++++++++++ .../jetbrains/kotlin/types/flexibleTypes.kt | 23 ++++-------- 24 files changed, 132 insertions(+), 94 deletions(-) delete mode 100644 compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.ir.txt delete mode 100644 compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.kt.txt create mode 100644 core/compiler.common/src/org/jetbrains/kotlin/types/CommonFlexibleTypeBoundsChecker.kt diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/Fir2IrJvmSpecialAnnotationSymbolProvider.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/Fir2IrJvmSpecialAnnotationSymbolProvider.kt index 68b3c4f9405..d9b415d80b1 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/Fir2IrJvmSpecialAnnotationSymbolProvider.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/Fir2IrJvmSpecialAnnotationSymbolProvider.kt @@ -40,6 +40,7 @@ class Fir2IrJvmSpecialAnnotationSymbolProvider : Fir2IrSpecialSymbolProvider() { when (id) { ENHANCED_NULLABILITY_ID -> id.toIrClass(kotlinJvmInternalPackage).symbol FLEXIBLE_NULLABILITY_ID -> id.toIrClass(kotlinInternalIrPackage).symbol + FLEXIBLE_MUTABILITY_ID -> id.toIrClass(kotlinInternalIrPackage).symbol RAW_TYPE_ANNOTATION_ID -> id.toIrClass(kotlinInternalIrPackage).symbol else -> null } @@ -60,7 +61,9 @@ class Fir2IrJvmSpecialAnnotationSymbolProvider : Fir2IrSpecialSymbolProvider() { private val ENHANCED_NULLABILITY_ID = ClassId.topLevel(JvmAnnotationNames.ENHANCED_NULLABILITY_ANNOTATION) private val FLEXIBLE_NULLABILITY_ID = ClassId.topLevel(IrBuiltIns.KOTLIN_INTERNAL_IR_FQN.child(Name.identifier("FlexibleNullability"))) + private val FLEXIBLE_MUTABILITY_ID = + ClassId.topLevel(IrBuiltIns.KOTLIN_INTERNAL_IR_FQN.child(Name.identifier("FlexibleMutability"))) private val RAW_TYPE_ANNOTATION_ID = ClassId.topLevel(IrBuiltIns.KOTLIN_INTERNAL_IR_FQN.child(Name.identifier("RawType"))) } -} \ No newline at end of file +} diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt index f8160daeb20..349eed77adb 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrBuiltIns.kt @@ -42,6 +42,13 @@ class Fir2IrBuiltIns( internal fun flexibleNullabilityAnnotationConstructorCall(): IrConstructorCall? = flexibleNullabilityAnnotationSymbol?.toConstructorCall() + private val flexibleMutabilityAnnotationSymbol by lazy { + specialAnnotationIrSymbolById(StandardClassIds.Annotations.FlexibleMutability) + } + + internal fun flexibleMutabilityAnnotationConstructorCall(): IrConstructorCall? = + flexibleMutabilityAnnotationSymbol?.toConstructorCall() + private val rawTypeAnnotationSymbol by lazy { specialAnnotationIrSymbolById(StandardClassIds.Annotations.RawTypeAnnotation) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt index 6fdfc32d871..6b47acd675e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrTypeConverter.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.types.makeNotNull import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds.Annotations.ExtensionFunctionType +import org.jetbrains.kotlin.types.CommonFlexibleTypeBoundsChecker import org.jetbrains.kotlin.types.TypeApproximatorConfiguration import org.jetbrains.kotlin.types.Variance @@ -109,6 +110,7 @@ class Fir2IrTypeConverter( typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT, annotations: List = emptyList(), hasFlexibleNullability: Boolean = false, + hasFlexibleMutability: Boolean = false, addRawTypeAnnotation: Boolean = false ): IrType { return when (this) { @@ -137,6 +139,11 @@ class Fir2IrTypeConverter( } } } + if (hasFlexibleMutability) { + builtIns.flexibleMutabilityAnnotationConstructorCall()?.let { + typeAnnotations += it + } + } if (isExtensionFunctionType && annotations.getAnnotationsByClassId(ExtensionFunctionType, session).isEmpty()) { builtIns.extensionFunctionTypeAnnotationConstructorCall()?.let { @@ -173,6 +180,7 @@ class Fir2IrTypeConverter( typeContext, annotations, hasFlexibleNullability = lowerBound.nullability != upperBound.nullability, + hasFlexibleMutability = isMutabilityFlexible(), addRawTypeAnnotation = true ) } @@ -190,10 +198,18 @@ class Fir2IrTypeConverter( (intermediate.withNullability(upper.isNullable) as ConeKotlinType) .withAttributes(lower.attributes) .toIrType( - typeContext, annotations, hasFlexibleNullability = lower.nullability != upper.nullability + typeContext, + annotations, + hasFlexibleNullability = lower.nullability != upper.nullability, + hasFlexibleMutability = isMutabilityFlexible() ) } else { - upperBound.toIrType(typeContext, annotations, hasFlexibleNullability = lowerBound.nullability != upperBound.nullability) + upperBound.toIrType( + typeContext, + annotations, + hasFlexibleNullability = lowerBound.nullability != upperBound.nullability, + hasFlexibleMutability = isMutabilityFlexible() + ) } } is ConeCapturedType -> { @@ -226,6 +242,14 @@ class Fir2IrTypeConverter( } } + private fun ConeFlexibleType.isMutabilityFlexible(): Boolean { + val lowerFqName = lowerBound.classId?.asSingleFqName() ?: return false + val upperFqName = upperBound.classId?.asSingleFqName() ?: return false + if (lowerFqName == upperFqName) return false + return CommonFlexibleTypeBoundsChecker.getBaseBoundFqNameByMutability(lowerFqName) == + CommonFlexibleTypeBoundsChecker.getBaseBoundFqNameByMutability(upperFqName) + } + private fun ConeTypeProjection.toIrTypeArgument(typeContext: ConversionTypeContext): IrTypeArgument { fun toIrTypeArgument(type: ConeKotlinType, variance: Variance): IrTypeProjection { val irType = type.toIrType(typeContext) diff --git a/compiler/testData/codegen/box/reflection/typeOf/flexibleTypes_after.kt b/compiler/testData/codegen/box/reflection/typeOf/flexibleTypes_after.kt index db06b84bc5d..5787e3f685c 100644 --- a/compiler/testData/codegen/box/reflection/typeOf/flexibleTypes_after.kt +++ b/compiler/testData/codegen/box/reflection/typeOf/flexibleTypes_after.kt @@ -1,6 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_K2: JVM_IR, JS_IR -// FIR status: Fail 2: kotlin.collections.List // WITH_REFLECT // FILE: box.kt diff --git a/compiler/testData/codegen/box/reflection/typeOf/rawTypes_after.kt b/compiler/testData/codegen/box/reflection/typeOf/rawTypes_after.kt index dbea861ae6a..c2bc2e4f2af 100644 --- a/compiler/testData/codegen/box/reflection/typeOf/rawTypes_after.kt +++ b/compiler/testData/codegen/box/reflection/typeOf/rawTypes_after.kt @@ -1,6 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND_K2: JVM_IR, JS_IR -// FIR status: Fail 3: (kotlin.collections.MutableList..kotlin.collections.MutableList<*>?) // WITH_REFLECT // FILE: box.kt diff --git a/compiler/testData/ir/irText/classes/kt45934.fir.ir.txt b/compiler/testData/ir/irText/classes/kt45934.fir.ir.txt index 777c3d258f3..3bee190afd4 100644 --- a/compiler/testData/ir/irText/classes/kt45934.fir.ir.txt +++ b/compiler/testData/ir/irText/classes/kt45934.fir.ir.txt @@ -6,14 +6,14 @@ FILE fqName: fileName:/kt45934.kt BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[.I]' - FUN DELEGATED_MEMBER name:foo visibility:public modality:OPEN ($this:.C) returnType:@[FlexibleNullability] kotlin.collections.MutableList<@[FlexibleNullability] C of .C.foo?>? + FUN DELEGATED_MEMBER name:foo visibility:public modality:OPEN ($this:.C) returnType:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] C of .C.foo?>? overridden: - public abstract fun foo (): @[FlexibleNullability] kotlin.collections.MutableList<@[FlexibleNullability] C of .I.foo?>? declared in .I + public abstract fun foo (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] C of .I.foo?>? declared in .I TYPE_PARAMETER name:C index:0 variance: superTypes:[@[FlexibleNullability] kotlin.Any?] reified:false $this: VALUE_PARAMETER name: type:.C BLOCK_BODY - RETURN type=kotlin.Nothing from='public open fun foo (): @[FlexibleNullability] kotlin.collections.MutableList<@[FlexibleNullability] C of .C.foo?>? declared in .C' - CALL 'public open fun foo (): @[FlexibleNullability] kotlin.collections.MutableList<@[FlexibleNullability] kotlin.String?>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableList<@[FlexibleNullability] kotlin.String?>? origin=null + RETURN type=kotlin.Nothing from='public open fun foo (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] C of .C.foo?>? declared in .C' + CALL 'public open fun foo (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] kotlin.String?>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] kotlin.String?>? origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final]' type=.J origin=null receiver: GET_VAR ': .C declared in .C.foo' type=.C origin=null FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final] diff --git a/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.ir.txt b/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.ir.txt index 7dae6db76ab..a8b1a66b079 100644 --- a/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.ir.txt @@ -20,11 +20,11 @@ FILE fqName: fileName:/AbstractMutableMap.kt CONST Null type=kotlin.Nothing? value=null PROPERTY name:entries visibility:public modality:OPEN [val] overridden: - public abstract entries: @[FlexibleNullability] kotlin.collections.MutableSet<@[FlexibleNullability] kotlin.collections.MutableMap.MutableEntry<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>?>? [fake_override,val] + public abstract entries: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableSet<@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableMap.MutableEntry<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>?>? [fake_override,val] FUN name: visibility:public modality:OPEN <> ($this:.MyMap.MyMap, V of .MyMap>) returnType:kotlin.collections.MutableSet.MyMap, V of .MyMap>> correspondingProperty: PROPERTY name:entries visibility:public modality:OPEN [val] overridden: - public abstract fun (): @[FlexibleNullability] kotlin.collections.MutableSet<@[FlexibleNullability] kotlin.collections.MutableMap.MutableEntry<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>?>? [fake_override] declared in kotlin.collections.AbstractMutableMap + public abstract fun (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableSet<@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableMap.MutableEntry<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>?>? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:.MyMap.MyMap, V of .MyMap> BLOCK_BODY RETURN type=kotlin.Nothing from='public open fun (): kotlin.collections.MutableSet.MyMap, V of .MyMap>> declared in .MyMap' @@ -55,19 +55,19 @@ FILE fqName: fileName:/AbstractMutableMap.kt VALUE_PARAMETER name:value index:1 type:V of .MyMap PROPERTY FAKE_OVERRIDE name:keys visibility:public modality:OPEN [fake_override,val] overridden: - public open keys: @[FlexibleNullability] kotlin.collections.MutableSet<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?>? [fake_override,val] - FUN FAKE_OVERRIDE name: visibility:public modality:OPEN <> ($this:java.util.AbstractMap) returnType:@[FlexibleNullability] kotlin.collections.MutableSet<@[FlexibleNullability] K of .MyMap?>? [fake_override] + public open keys: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableSet<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?>? [fake_override,val] + FUN FAKE_OVERRIDE name: visibility:public modality:OPEN <> ($this:java.util.AbstractMap) returnType:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableSet<@[FlexibleNullability] K of .MyMap?>? [fake_override] correspondingProperty: PROPERTY FAKE_OVERRIDE name:keys visibility:public modality:OPEN [fake_override,val] overridden: - public open fun (): @[FlexibleNullability] kotlin.collections.MutableSet<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?>? [fake_override] declared in kotlin.collections.AbstractMutableMap + public open fun (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableSet<@[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?>? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:java.util.AbstractMap PROPERTY FAKE_OVERRIDE name:values visibility:public modality:OPEN [fake_override,val] overridden: - public open values: @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>? [fake_override,val] - FUN FAKE_OVERRIDE name: visibility:public modality:OPEN <> ($this:java.util.AbstractMap) returnType:@[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] V of .MyMap?>? [fake_override] + public open values: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>? [fake_override,val] + FUN FAKE_OVERRIDE name: visibility:public modality:OPEN <> ($this:java.util.AbstractMap) returnType:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] V of .MyMap?>? [fake_override] correspondingProperty: PROPERTY FAKE_OVERRIDE name:values visibility:public modality:OPEN [fake_override,val] overridden: - public open fun (): @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>? [fake_override] declared in kotlin.collections.AbstractMutableMap + public open fun (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:java.util.AbstractMap FUN FAKE_OVERRIDE name:replaceAll visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in @[EnhancedNullability] V of .MyMap, out @[EnhancedNullability] V of .MyMap>) returnType:kotlin.Unit [fake_override] overridden: diff --git a/compiler/testData/ir/irText/firProblems/AllCandidates.fir.ir.txt b/compiler/testData/ir/irText/firProblems/AllCandidates.fir.ir.txt index 7368ca181d5..ad93adf6e0a 100644 --- a/compiler/testData/ir/irText/firProblems/AllCandidates.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/AllCandidates.fir.ir.txt @@ -63,7 +63,7 @@ FILE fqName: fileName:/AllCandidates.kt FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> ($receiver:@[FlexibleNullability] .OverloadResolutionResultsImpl<@[FlexibleNullability] A of .allCandidatesResult?>?) returnType:kotlin.Unit $receiver: VALUE_PARAMETER name:$this$apply type:@[FlexibleNullability] .OverloadResolutionResultsImpl<@[FlexibleNullability] A of .allCandidatesResult?>? BLOCK_BODY - CALL 'public open fun setAllCandidates (allCandidates: @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] .ResolvedCall<@[FlexibleNullability] D of .OverloadResolutionResultsImpl?>?>?): kotlin.Unit declared in .OverloadResolutionResultsImpl' type=kotlin.Unit origin=EQ + CALL 'public open fun setAllCandidates (allCandidates: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] .ResolvedCall<@[FlexibleNullability] D of .OverloadResolutionResultsImpl?>?>?): kotlin.Unit declared in .OverloadResolutionResultsImpl' type=kotlin.Unit origin=EQ $this: GET_VAR '$this$apply: @[FlexibleNullability] .OverloadResolutionResultsImpl<@[FlexibleNullability] A of .allCandidatesResult?>? declared in .allCandidatesResult.' type=@[FlexibleNullability] .OverloadResolutionResultsImpl<@[FlexibleNullability] A of .allCandidatesResult?>? origin=null allCandidates: CALL 'public final fun map (transform: kotlin.Function1): kotlin.collections.List [inline] declared in kotlin.collections.CollectionsKt' type=kotlin.collections.List<.ResolvedCall.allCandidatesResult>> origin=null : .MyCandidate diff --git a/compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.ir.txt b/compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.ir.txt deleted file mode 100644 index bd2fffebf24..00000000000 --- a/compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.ir.txt +++ /dev/null @@ -1,8 +0,0 @@ -FILE fqName: fileName:/SyntheticSetterType.kt - FUN name:foo visibility:public modality:FINAL <> (descriptor:.PropertyDescriptorImpl) returnType:kotlin.Unit - VALUE_PARAMETER name:descriptor index:0 type:.PropertyDescriptorImpl - BLOCK_BODY - CALL 'public open fun setOverriddenDescriptors (overriddenDescriptors: @[EnhancedNullability] kotlin.collections.MutableCollection.CallableMemberDescriptor?>): kotlin.Unit declared in .PropertyDescriptorImpl' type=kotlin.Unit origin=EQ - $this: GET_VAR 'descriptor: .PropertyDescriptorImpl declared in .foo' type=.PropertyDescriptorImpl origin=null - overriddenDescriptors: CALL 'public final fun emptyList (): kotlin.collections.List declared in kotlin.collections.CollectionsKt' type=kotlin.collections.List<@[FlexibleNullability] .PropertyDescriptor?> origin=null - : @[FlexibleNullability] .PropertyDescriptor? diff --git a/compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.kt.txt b/compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.kt.txt deleted file mode 100644 index 0fbad156101..00000000000 --- a/compiler/testData/ir/irText/firProblems/SyntheticSetterType.fir.kt.txt +++ /dev/null @@ -1,3 +0,0 @@ -fun foo(descriptor: PropertyDescriptorImpl) { - descriptor.setOverriddenDescriptors(overriddenDescriptors = emptyList<@FlexibleNullability PropertyDescriptor?>()) -} diff --git a/compiler/testData/ir/irText/firProblems/SyntheticSetterType.kt b/compiler/testData/ir/irText/firProblems/SyntheticSetterType.kt index e8380de3ec3..1632b299ed3 100644 --- a/compiler/testData/ir/irText/firProblems/SyntheticSetterType.kt +++ b/compiler/testData/ir/irText/firProblems/SyntheticSetterType.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // TARGET_BACKEND: JVM // WITH_STDLIB // FILE: PropertyDescriptorImpl.java diff --git a/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.ir.txt b/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.ir.txt index 806758b6525..5371f5ba9c7 100644 --- a/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.ir.txt +++ b/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.ir.txt @@ -13,7 +13,7 @@ FILE fqName: fileName:/typeParametersInImplicitCast.kt VALUE_PARAMETER name:it index:0 type:kotlin.collections.List.problematic> BLOCK_BODY RETURN type=kotlin.Nothing from='local final fun (it: kotlin.collections.List.problematic>): kotlin.collections.Iterable<@[FlexibleNullability] T of .problematic?> declared in .problematic' - TYPE_OP type=kotlin.collections.MutableList<@[FlexibleNullability] T of .problematic?> origin=IMPLICIT_NOTNULL typeOperand=kotlin.collections.MutableList<@[FlexibleNullability] T of .problematic?> - CALL 'public/*package*/ open fun id (v: @[FlexibleNullability] kotlin.collections.MutableList<@[FlexibleNullability] T of .ListId.id?>?): @[EnhancedNullability] kotlin.collections.MutableList<@[FlexibleNullability] T of .ListId.id?> declared in .ListId' type=@[EnhancedNullability] kotlin.collections.MutableList<@[FlexibleNullability] T of .problematic?> origin=null + TYPE_OP type=@[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] T of .problematic?> origin=IMPLICIT_NOTNULL typeOperand=@[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] T of .problematic?> + CALL 'public/*package*/ open fun id (v: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] T of .ListId.id?>?): @[EnhancedNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] T of .ListId.id?> declared in .ListId' type=@[EnhancedNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[FlexibleNullability] T of .problematic?> origin=null : @[FlexibleNullability] T of .problematic? v: GET_VAR 'it: kotlin.collections.List.problematic> declared in .problematic.' type=kotlin.collections.List.problematic> origin=null diff --git a/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.kt.txt b/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.kt.txt index 8d4129700a2..a75e6c98780 100644 --- a/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.kt.txt +++ b/compiler/testData/ir/irText/regressions/typeParametersInImplicitCast.fir.kt.txt @@ -1,6 +1,6 @@ fun problematic(lss: List>): List { return lss.flatMap, @FlexibleNullability T?>(transform = local fun (it: List): Iterable<@FlexibleNullability T?> { - return id<@FlexibleNullability T?>(v = it) /*!! MutableList<@FlexibleNullability T?> */ + return id<@FlexibleNullability T?>(v = it) /*!! @FlexibleMutability MutableList<@FlexibleNullability T?> */ } ) } diff --git a/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt b/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt index cbfc9c5d4c6..06edb39c216 100644 --- a/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/builtinMap.fir.ir.txt @@ -18,7 +18,7 @@ FILE fqName: fileName:/builtinMap.kt if: CONST Boolean type=kotlin.Boolean value=true then: CALL 'public final fun apply (block: @[ExtensionFunctionType] kotlin.Function1): T of kotlin.StandardKt.apply [inline] declared in kotlin.StandardKt' type=java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> origin=null : java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> - $receiver: CONSTRUCTOR_CALL 'public constructor (p0: @[FlexibleNullability] kotlin.collections.MutableMap?) declared in java.util.LinkedHashMap' type=java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> origin=null + $receiver: CONSTRUCTOR_CALL 'public constructor (p0: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableMap?) declared in java.util.LinkedHashMap' type=java.util.LinkedHashMap<@[FlexibleNullability] K1 of .plus?, @[FlexibleNullability] V1 of .plus?> origin=null : @[FlexibleNullability] K1 of .plus? : @[FlexibleNullability] V1 of .plus? p0: GET_VAR ': kotlin.collections.Map.plus, V1 of .plus> declared in .plus' type=kotlin.collections.Map.plus, V1 of .plus> origin=null diff --git a/compiler/testData/ir/irText/types/javaWildcardType.fir.ir.txt b/compiler/testData/ir/irText/types/javaWildcardType.fir.ir.txt index 60ec4e7abea..b9072bc56d9 100644 --- a/compiler/testData/ir/irText/types/javaWildcardType.fir.ir.txt +++ b/compiler/testData/ir/irText/types/javaWildcardType.fir.ir.txt @@ -32,44 +32,44 @@ FILE fqName: fileName:/javaWildcardType.kt BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[.J; .K]' - FUN DELEGATED_MEMBER name:jf1 visibility:public modality:OPEN <> ($this:.C) returnType:@[FlexibleNullability] kotlin.collections.MutableCollection? + FUN DELEGATED_MEMBER name:jf1 visibility:public modality:OPEN <> ($this:.C) returnType:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? overridden: - public abstract fun jf1 (): @[FlexibleNullability] kotlin.collections.MutableCollection? declared in .J + public abstract fun jf1 (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? declared in .J $this: VALUE_PARAMETER name: type:.C BLOCK_BODY - RETURN type=kotlin.Nothing from='public open fun jf1 (): @[FlexibleNullability] kotlin.collections.MutableCollection? declared in .C' - CALL 'public abstract fun jf1 (): @[FlexibleNullability] kotlin.collections.MutableCollection? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableCollection? origin=null + RETURN type=kotlin.Nothing from='public open fun jf1 (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? declared in .C' + CALL 'public abstract fun jf1 (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final]' type=.J origin=null receiver: GET_VAR ': .C declared in .C.jf1' type=.C origin=null - FUN DELEGATED_MEMBER name:jf2 visibility:public modality:OPEN <> ($this:.C) returnType:@[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? + FUN DELEGATED_MEMBER name:jf2 visibility:public modality:OPEN <> ($this:.C) returnType:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? overridden: - public abstract fun jf2 (): @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .J + public abstract fun jf2 (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .J $this: VALUE_PARAMETER name: type:.C BLOCK_BODY - RETURN type=kotlin.Nothing from='public open fun jf2 (): @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .C' - CALL 'public abstract fun jf2 (): @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? origin=null + RETURN type=kotlin.Nothing from='public open fun jf2 (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .C' + CALL 'public abstract fun jf2 (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final]' type=.J origin=null receiver: GET_VAR ': .C declared in .C.jf2' type=.C origin=null - FUN DELEGATED_MEMBER name:jg1 visibility:public modality:OPEN <> ($this:.C, c:@[FlexibleNullability] kotlin.collections.MutableCollection?) returnType:kotlin.Unit + FUN DELEGATED_MEMBER name:jg1 visibility:public modality:OPEN <> ($this:.C, c:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection?) returnType:kotlin.Unit overridden: - public abstract fun jg1 (c: @[FlexibleNullability] kotlin.collections.MutableCollection?): kotlin.Unit declared in .J + public abstract fun jg1 (c: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection?): kotlin.Unit declared in .J $this: VALUE_PARAMETER name: type:.C - VALUE_PARAMETER name:c index:0 type:@[FlexibleNullability] kotlin.collections.MutableCollection? + VALUE_PARAMETER name:c index:0 type:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? BLOCK_BODY - CALL 'public abstract fun jg1 (c: @[FlexibleNullability] kotlin.collections.MutableCollection?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null + CALL 'public abstract fun jg1 (c: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final]' type=.J origin=null receiver: GET_VAR ': .C declared in .C.jg1' type=.C origin=null - c: GET_VAR 'c: @[FlexibleNullability] kotlin.collections.MutableCollection? declared in .C.jg1' type=@[FlexibleNullability] kotlin.collections.MutableCollection? origin=null - FUN DELEGATED_MEMBER name:jg2 visibility:public modality:OPEN <> ($this:.C, c:@[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>?) returnType:kotlin.Unit + c: GET_VAR 'c: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? declared in .C.jg1' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection? origin=null + FUN DELEGATED_MEMBER name:jg2 visibility:public modality:OPEN <> ($this:.C, c:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>?) returnType:kotlin.Unit overridden: - public abstract fun jg2 (c: @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>?): kotlin.Unit declared in .J + public abstract fun jg2 (c: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>?): kotlin.Unit declared in .J $this: VALUE_PARAMETER name: type:.C - VALUE_PARAMETER name:c index:0 type:@[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? + VALUE_PARAMETER name:c index:0 type:@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? BLOCK_BODY - CALL 'public abstract fun jg2 (c: @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null + CALL 'public abstract fun jg2 (c: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final]' type=.J origin=null receiver: GET_VAR ': .C declared in .C.jg2' type=.C origin=null - c: GET_VAR 'c: @[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .C.jg2' type=@[FlexibleNullability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? origin=null + c: GET_VAR 'c: @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? declared in .C.jg2' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableCollection<@[FlexibleNullability] kotlin.CharSequence?>? origin=null FIELD DELEGATE name:$$delegate_0 type:.J visibility:private [final] EXPRESSION_BODY GET_VAR 'j: .J declared in .C.' type=.J origin=null diff --git a/compiler/testData/ir/irText/types/javaWildcardType.fir.kt.txt b/compiler/testData/ir/irText/types/javaWildcardType.fir.kt.txt index 6f998a71dba..1a678aa2190 100644 --- a/compiler/testData/ir/irText/types/javaWildcardType.fir.kt.txt +++ b/compiler/testData/ir/irText/types/javaWildcardType.fir.kt.txt @@ -16,19 +16,19 @@ class C : J, K { } - override fun jf1(): @FlexibleNullability MutableCollection? { + override fun jf1(): @FlexibleNullability @FlexibleMutability MutableCollection? { return .#$$delegate_0.jf1() } - override fun jf2(): @FlexibleNullability MutableCollection<@FlexibleNullability CharSequence?>? { + override fun jf2(): @FlexibleNullability @FlexibleMutability MutableCollection<@FlexibleNullability CharSequence?>? { return .#$$delegate_0.jf2() } - override fun jg1(c: @FlexibleNullability MutableCollection?) { + override fun jg1(c: @FlexibleNullability @FlexibleMutability MutableCollection?) { .#$$delegate_0.jg1(c = c) } - override fun jg2(c: @FlexibleNullability MutableCollection<@FlexibleNullability CharSequence?>?) { + override fun jg2(c: @FlexibleNullability @FlexibleMutability MutableCollection<@FlexibleNullability CharSequence?>?) { .#$$delegate_0.jg2(c = c) } diff --git a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.ir.txt b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.ir.txt index 3932fc39be9..2636a6a4dae 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.ir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.ir.txt @@ -182,8 +182,8 @@ FILE fqName: fileName:/enhancedNullabilityInDestructuringAssignment.kt : kotlin.collections.IndexedValue<@[EnhancedNullability] .P> $receiver: CALL 'public final fun withIndex (): kotlin.collections.Iterable> declared in kotlin.collections.CollectionsKt' type=kotlin.collections.Iterable.P>> origin=null : @[EnhancedNullability] .P - $receiver: TYPE_OP type=kotlin.collections.MutableList<@[EnhancedNullability] .P> origin=IMPLICIT_NOTNULL typeOperand=kotlin.collections.MutableList<@[EnhancedNullability] .P> - CALL 'public open fun listOfNotNull (): @[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null + $receiver: TYPE_OP type=@[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P> origin=IMPLICIT_NOTNULL typeOperand=@[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P> + CALL 'public open fun listOfNotNull (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null VAR name:x type:kotlin.Int [val] CALL 'public final fun component1 (): kotlin.Int [operator] declared in kotlin.collections.IndexedValue' type=kotlin.Int origin=COMPONENT_N(index=1) $this: GET_VAR 'val tmp_3: kotlin.collections.IndexedValue<@[EnhancedNullability] .P> [val] declared in .test4' type=kotlin.collections.IndexedValue<@[EnhancedNullability] .P> origin=null diff --git a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.kt.txt b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.kt.txt index afe3d49db6f..c33928fe4eb 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.kt.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInDestructuringAssignment.fir.kt.txt @@ -80,7 +80,7 @@ fun test3() { } fun test4() { - val : IndexedValue<@EnhancedNullability P> = listOfNotNull() /*!! MutableList<@EnhancedNullability P> */.withIndex<@EnhancedNullability P>().first>() + val : IndexedValue<@EnhancedNullability P> = listOfNotNull() /*!! @FlexibleMutability MutableList<@EnhancedNullability P> */.withIndex<@EnhancedNullability P>().first>() val x: Int = .component1() val y: @EnhancedNullability P = .component2() /*!! P */ use(x = x, y = y) diff --git a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInForLoop.fir.ir.txt b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInForLoop.fir.ir.txt index 663400dc9cb..a6f060ec2c8 100644 --- a/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInForLoop.fir.ir.txt +++ b/compiler/testData/ir/irText/types/nullChecks/enhancedNullabilityInForLoop.fir.ir.txt @@ -7,7 +7,7 @@ FILE fqName: fileName:/enhancedNullabilityInForLoop.kt BLOCK type=kotlin.Unit origin=FOR_LOOP VAR FOR_LOOP_ITERATOR name:tmp_0 type:kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] CALL 'public abstract fun iterator (): kotlin.collections.MutableIterator [fake_override,operator] declared in kotlin.collections.MutableList' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=FOR_LOOP_ITERATOR - $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null + $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null WHILE label=null origin=FOR_LOOP_INNER_WHILE condition: CALL 'public abstract fun hasNext (): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.MutableIterator' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT $this: GET_VAR 'val tmp_0: kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] declared in .testForInListUnused' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=null @@ -22,7 +22,7 @@ FILE fqName: fileName:/enhancedNullabilityInForLoop.kt BLOCK type=kotlin.Unit origin=FOR_LOOP VAR FOR_LOOP_ITERATOR name:tmp_1 type:kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] CALL 'public abstract fun iterator (): kotlin.collections.MutableIterator [fake_override,operator] declared in kotlin.collections.MutableList' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=FOR_LOOP_ITERATOR - $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null + $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null WHILE label=null origin=FOR_LOOP_INNER_WHILE condition: CALL 'public abstract fun hasNext (): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.MutableIterator' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT $this: GET_VAR 'val tmp_1: kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] declared in .testForInListDestructured' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=null @@ -42,7 +42,7 @@ FILE fqName: fileName:/enhancedNullabilityInForLoop.kt BLOCK_BODY VAR name:iterator type:kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] CALL 'public abstract fun iterator (): kotlin.collections.MutableIterator [fake_override,operator] declared in kotlin.collections.MutableList' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=null - $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null + $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null WHILE label=null origin=WHILE_LOOP condition: CALL 'public abstract fun hasNext (): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.MutableIterator' type=kotlin.Boolean origin=null $this: GET_VAR 'val iterator: kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] declared in .testDesugaredForInList' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=null @@ -73,7 +73,7 @@ FILE fqName: fileName:/enhancedNullabilityInForLoop.kt BLOCK type=kotlin.Unit origin=FOR_LOOP VAR FOR_LOOP_ITERATOR name:tmp_4 type:kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] CALL 'public abstract fun iterator (): kotlin.collections.MutableIterator [fake_override,operator] declared in kotlin.collections.MutableList' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=FOR_LOOP_ITERATOR - $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null + $this: CALL 'public open fun listOfNotNull (): @[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? declared in .J' type=@[FlexibleNullability] @[FlexibleMutability] kotlin.collections.MutableList<@[EnhancedNullability] .P>? origin=null WHILE label=null origin=FOR_LOOP_INNER_WHILE condition: CALL 'public abstract fun hasNext (): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.MutableIterator' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT $this: GET_VAR 'val tmp_4: kotlin.collections.MutableIterator<@[EnhancedNullability] .P> [val] declared in .testForInListUse' type=kotlin.collections.MutableIterator<@[EnhancedNullability] .P> origin=null diff --git a/compiler/testData/ir/irText/types/rawTypeInSignature.fir.ir.txt b/compiler/testData/ir/irText/types/rawTypeInSignature.fir.ir.txt index b1cd15ddd4c..4f46b9d2640 100644 --- a/compiler/testData/ir/irText/types/rawTypeInSignature.fir.ir.txt +++ b/compiler/testData/ir/irText/types/rawTypeInSignature.fir.ir.txt @@ -84,24 +84,24 @@ FILE fqName: fileName:/rawTypeInSignature.kt BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:KRaw modality:FINAL visibility:public superTypes:[.JRaw]' - FUN DELEGATED_MEMBER name:takesRawList visibility:public modality:OPEN <> ($this:.KRaw, list:@[FlexibleNullability] @[RawType] kotlin.collections.MutableList) returnType:kotlin.Unit + FUN DELEGATED_MEMBER name:takesRawList visibility:public modality:OPEN <> ($this:.KRaw, list:@[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList) returnType:kotlin.Unit overridden: - public abstract fun takesRawList (list: @[FlexibleNullability] @[RawType] kotlin.collections.MutableList): kotlin.Unit declared in .JRaw + public abstract fun takesRawList (list: @[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList): kotlin.Unit declared in .JRaw $this: VALUE_PARAMETER name: type:.KRaw - VALUE_PARAMETER name:list index:0 type:@[FlexibleNullability] @[RawType] kotlin.collections.MutableList + VALUE_PARAMETER name:list index:0 type:@[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList BLOCK_BODY - CALL 'public abstract fun takesRawList (list: @[FlexibleNullability] @[RawType] kotlin.collections.MutableList): kotlin.Unit declared in .JRaw' type=kotlin.Unit origin=null + CALL 'public abstract fun takesRawList (list: @[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList): kotlin.Unit declared in .JRaw' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.JRaw visibility:private [final]' type=.JRaw origin=null receiver: GET_VAR ': .KRaw declared in .KRaw.takesRawList' type=.KRaw origin=null - list: GET_VAR 'list: @[FlexibleNullability] @[RawType] kotlin.collections.MutableList declared in .KRaw.takesRawList' type=@[FlexibleNullability] @[RawType] kotlin.collections.MutableList origin=null - FUN DELEGATED_MEMBER name:returnsRawList visibility:public modality:OPEN <> ($this:.KRaw) returnType:@[FlexibleNullability] @[RawType] kotlin.collections.MutableList + list: GET_VAR 'list: @[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList declared in .KRaw.takesRawList' type=@[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList origin=null + FUN DELEGATED_MEMBER name:returnsRawList visibility:public modality:OPEN <> ($this:.KRaw) returnType:@[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList overridden: - public abstract fun returnsRawList (): @[FlexibleNullability] @[RawType] kotlin.collections.MutableList declared in .JRaw + public abstract fun returnsRawList (): @[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList declared in .JRaw $this: VALUE_PARAMETER name: type:.KRaw BLOCK_BODY - RETURN type=kotlin.Nothing from='public open fun returnsRawList (): @[FlexibleNullability] @[RawType] kotlin.collections.MutableList declared in .KRaw' - TYPE_OP type=@[RawType] kotlin.collections.MutableList origin=IMPLICIT_NOTNULL typeOperand=@[RawType] kotlin.collections.MutableList - CALL 'public abstract fun returnsRawList (): @[FlexibleNullability] @[RawType] kotlin.collections.MutableList declared in .JRaw' type=@[FlexibleNullability] @[RawType] kotlin.collections.MutableList origin=null + RETURN type=kotlin.Nothing from='public open fun returnsRawList (): @[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList declared in .KRaw' + TYPE_OP type=@[FlexibleMutability] @[RawType] kotlin.collections.MutableList origin=IMPLICIT_NOTNULL typeOperand=@[FlexibleMutability] @[RawType] kotlin.collections.MutableList + CALL 'public abstract fun returnsRawList (): @[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList declared in .JRaw' type=@[FlexibleNullability] @[FlexibleMutability] @[RawType] kotlin.collections.MutableList origin=null $this: GET_FIELD 'FIELD DELEGATE name:$$delegate_0 type:.JRaw visibility:private [final]' type=.JRaw origin=null receiver: GET_VAR ': .KRaw declared in .KRaw.returnsRawList' type=.KRaw origin=null FUN DELEGATED_MEMBER name:takesRawGenericInv visibility:public modality:OPEN <> ($this:.KRaw, g:@[FlexibleNullability] @[RawType] .GenericInv) returnType:kotlin.Unit diff --git a/compiler/testData/ir/irText/types/rawTypeInSignature.fir.kt.txt b/compiler/testData/ir/irText/types/rawTypeInSignature.fir.kt.txt index 7691fec9f74..22da89c5bb1 100644 --- a/compiler/testData/ir/irText/types/rawTypeInSignature.fir.kt.txt +++ b/compiler/testData/ir/irText/types/rawTypeInSignature.fir.kt.txt @@ -44,12 +44,12 @@ class KRaw : JRaw { } - override fun takesRawList(list: @FlexibleNullability @RawType MutableList) { + override fun takesRawList(list: @FlexibleNullability @FlexibleMutability @RawType MutableList) { .#$$delegate_0.takesRawList(list = list) } - override fun returnsRawList(): @FlexibleNullability @RawType MutableList { - return .#$$delegate_0.returnsRawList() /*!! @RawType MutableList */ + override fun returnsRawList(): @FlexibleNullability @FlexibleMutability @RawType MutableList { + return .#$$delegate_0.returnsRawList() /*!! @FlexibleMutability @RawType MutableList */ } override fun takesRawGenericInv(g: @FlexibleNullability @RawType GenericInv) { @@ -79,3 +79,4 @@ class KRaw : JRaw { private /* final field */ val $$delegate_0: JRaw = j } + diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index 8432e59193d..dfffde5c7f8 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -174,6 +174,7 @@ object StandardClassIds { val RawTypeAnnotation = "RawType".internalIrId() val FlexibleNullability = "FlexibleNullability".internalIrId() + val FlexibleMutability = "FlexibleMutability".internalIrId() val EnhancedNullability = "EnhancedNullability".jvmInternalId() val InlineOnly = "InlineOnly".internalId() diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/CommonFlexibleTypeBoundsChecker.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/CommonFlexibleTypeBoundsChecker.kt new file mode 100644 index 00000000000..58dc553021e --- /dev/null +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/CommonFlexibleTypeBoundsChecker.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.types + +import org.jetbrains.kotlin.builtins.StandardNames.FqNames +import org.jetbrains.kotlin.name.FqName + +object CommonFlexibleTypeBoundsChecker { + val baseTypesToMutableEquivalent = mapOf( + FqNames.iterable to FqNames.mutableIterable, + FqNames.iterator to FqNames.mutableIterator, + FqNames.listIterator to FqNames.mutableListIterator, + FqNames.list to FqNames.mutableList, + FqNames.collection to FqNames.mutableCollection, + FqNames.set to FqNames.mutableSet, + FqNames.map to FqNames.mutableMap, + FqNames.mapEntry to FqNames.mutableMapEntry + ) + val mutableToBaseMap = baseTypesToMutableEquivalent.entries.associateBy({ it.value }) { it.key } + + fun getBaseBoundFqNameByMutability(fqName: FqName): FqName? = + if (fqName in baseTypesToMutableEquivalent) fqName + else mutableToBaseMap[fqName] +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt index bc2db357cf6..c54cafb7b5d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt @@ -154,22 +154,11 @@ class FlexibleTypeImpl(lowerBound: SimpleType, upperBound: SimpleType) : Flexibl } object FlexibleTypeBoundsChecker { - private val fqNames = StandardNames.FqNames - private val baseTypesToMutableEquivalent = mapOf( - fqNames.iterable to fqNames.mutableIterable, - fqNames.iterator to fqNames.mutableIterator, - fqNames.listIterator to fqNames.mutableListIterator, - fqNames.list to fqNames.mutableList, - fqNames.collection to fqNames.mutableCollection, - fqNames.set to fqNames.mutableSet, - fqNames.map to fqNames.mutableMap, - fqNames.mapEntry to fqNames.mutableMapEntry - ) - private val mutableToBaseMap = baseTypesToMutableEquivalent.entries.associateBy({ it.value }) { it.key } - fun areTypesMayBeLowerAndUpperBoundsOfSameFlexibleTypeByMutability(a: KotlinType, b: KotlinType): Boolean { val fqName = a.constructor.declarationDescriptor?.fqNameSafe ?: return false - val possiblePairBound = (baseTypesToMutableEquivalent[fqName] ?: mutableToBaseMap[fqName]) ?: return false + val possiblePairBound = (CommonFlexibleTypeBoundsChecker.baseTypesToMutableEquivalent[fqName] + ?: CommonFlexibleTypeBoundsChecker.mutableToBaseMap[fqName]) + ?: return false return possiblePairBound == b.constructor.declarationDescriptor?.fqNameSafe } @@ -178,7 +167,7 @@ object FlexibleTypeBoundsChecker { fun getBaseBoundFqNameByMutability(type: KotlinType): FqName? = type.constructor.declarationDescriptor?.fqNameSafe?.let(::getBaseBoundFqNameByMutability) - fun getBaseBoundFqNameByMutability(fqName: FqName): FqName? = - if (fqName in baseTypesToMutableEquivalent) fqName - else mutableToBaseMap[fqName] + fun getBaseBoundFqNameByMutability(fqName: FqName): FqName? { + return CommonFlexibleTypeBoundsChecker.getBaseBoundFqNameByMutability(fqName) + } }