diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt index b1fba08cf1a..fc847e6e90c 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/CallGenerator.kt @@ -86,13 +86,14 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator endOffset: Int, descriptor: DeclarationDescriptor, resolvedCall: ResolvedCall<*>?, - origin: IrStatementOrigin? + origin: IrStatementOrigin?, + irType: IrType? = null ): IrExpression = when (descriptor) { is FakeCallableDescriptorForObject -> - generateValueReference(startOffset, endOffset, descriptor.getReferencedDescriptor(), resolvedCall, origin) + generateValueReference(startOffset, endOffset, descriptor.getReferencedDescriptor(), resolvedCall, origin, irType) is TypeAliasDescriptor -> - generateValueReference(startOffset, endOffset, descriptor.classDescriptor!!, null, origin) + generateValueReference(startOffset, endOffset, descriptor.classDescriptor!!, null, origin, irType) is ClassDescriptor -> { val classValueType = descriptor.classValueType!! statementGenerator.generateSingletonReference(descriptor, startOffset, endOffset, classValueType) @@ -107,7 +108,7 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator IrGetFieldImpl(startOffset, endOffset, field, fieldType, receiver?.load()) } is VariableDescriptor -> - generateGetVariable(startOffset, endOffset, descriptor, getTypeArguments(resolvedCall), origin) + generateGetVariable(startOffset, endOffset, descriptor, getTypeArguments(resolvedCall), origin, irType) else -> TODO("Unexpected callable descriptor: $descriptor ${descriptor::class.java.simpleName}") } @@ -117,7 +118,8 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator endOffset: Int, descriptor: VariableDescriptor, typeArguments: Map?, - origin: IrStatementOrigin? = null + origin: IrStatementOrigin? = null, + irType: IrType? = null ) = if (descriptor is LocalVariableDescriptor && descriptor.isDelegated) { val getterDescriptor = descriptor.getter!! @@ -128,8 +130,15 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator context.callToSubstitutedDescriptorMap[this] = getterDescriptor putTypeArguments(typeArguments) { it.toIrType() } } - } else - IrGetValueImpl(startOffset, endOffset, descriptor.type.toIrType(), context.symbolTable.referenceValue(descriptor), origin) + } else { + val getValue = + IrGetValueImpl(startOffset, endOffset, descriptor.type.toIrType(), context.symbolTable.referenceValue(descriptor), origin) + if (irType != null) { + IrTypeOperatorCallImpl(startOffset, endOffset, irType, IrTypeOperator.IMPLICIT_CAST, irType, getValue) + } else { + getValue + } + } fun generateDelegatingConstructorCall(startOffset: Int, endOffset: Int, call: CallBuilder): IrExpression = call.callReceiver.call { dispatchReceiver, extensionReceiver -> diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt index cd6bfe7c0b5..dbe3a0d34fe 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.psi2ir.intermediate.IntermediateValue import org.jetbrains.kotlin.psi2ir.intermediate.createTemporaryVariableInBlock import org.jetbrains.kotlin.psi2ir.intermediate.setExplicitReceiverValue import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingContext.SMARTCAST import org.jetbrains.kotlin.resolve.BindingContextUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall @@ -327,7 +328,8 @@ class StatementGenerator( ): IrExpression = CallGenerator(this).generateValueReference( expression.startOffsetSkippingComments, expression.endOffset, - descriptor, resolvedCall, null + descriptor, resolvedCall, null, + context.bindingContext.get(SMARTCAST, expression)?.defaultType?.toIrType() ) override fun visitCallExpression(expression: KtCallExpression, data: Nothing?): IrStatement { diff --git a/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14597_full.kt b/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14597_full.kt index e006b5a0a45..6e79d96a82d 100644 --- a/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14597_full.kt +++ b/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14597_full.kt @@ -1,6 +1,3 @@ -// IGNORE_BACKEND: JVM_IR -// TODO KT-36845 Generate enum-based TABLESWITCH/LOOKUPSWITCH on a value with smart cast to enum in JVM_IR - enum class En { A, B, ะก } fun box() { diff --git a/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14802.kt b/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14802.kt index 96b7ce38d35..edd99cad712 100644 --- a/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14802.kt +++ b/compiler/testData/codegen/bytecodeText/whenEnumOptimization/kt14802.kt @@ -1,6 +1,3 @@ -// IGNORE_BACKEND: JVM_IR -// TODO KT-36845 Generate enum-based TABLESWITCH/LOOKUPSWITCH on a value with smart cast to enum in JVM_IR - class EncapsulatedEnum>(val value: T) enum class MyEnum(val value: String) { diff --git a/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.kt.txt b/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.kt.txt index 2a8da60a737..225648dd90a 100644 --- a/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.kt.txt +++ b/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.kt.txt @@ -89,7 +89,7 @@ fun test5(a: Any) { a as Function1 /*~> Unit */ { // BLOCK val tmp0_array: A = A - val tmp2_sam: IFoo = a /*as Function1<@ParameterName(name = "i") Int, Unit> */ /*-> IFoo */ + val tmp2_sam: IFoo = a /*as Function1 */ /*-> IFoo */ tmp0_array.set(i = tmp2_sam, newValue = tmp0_array.get(i = tmp2_sam).plus(other = 1)) } } diff --git a/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.txt b/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.txt index a832bdbd431..46b03f58936 100644 --- a/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.txt +++ b/compiler/testData/ir/irText/expressions/callableReferences/caoWithAdaptationForSam.txt @@ -199,7 +199,7 @@ FILE fqName: fileName:/caoWithAdaptationForSam.kt GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=.A VAR IR_TEMPORARY_VARIABLE name:tmp_9 type:.IFoo [val] TYPE_OP type=.IFoo origin=SAM_CONVERSION typeOperand=.IFoo - TYPE_OP type=kotlin.Function1<@[ParameterName(name = 'i')] kotlin.Int, kotlin.Unit> origin=IMPLICIT_CAST typeOperand=kotlin.Function1<@[ParameterName(name = 'i')] kotlin.Int, kotlin.Unit> + TYPE_OP type=kotlin.Function1 origin=IMPLICIT_CAST typeOperand=kotlin.Function1 GET_VAR 'a: kotlin.Any declared in .test5' type=kotlin.Any origin=null CALL 'public final fun set (i: .IFoo, newValue: kotlin.Int): kotlin.Unit [operator] declared in ' type=kotlin.Unit origin=PLUSEQ $receiver: GET_VAR 'val tmp_8: .A [val] declared in .test5' type=.A origin=null diff --git a/compiler/testData/ir/irText/expressions/elvis.kt.txt b/compiler/testData/ir/irText/expressions/elvis.kt.txt index 1906fcd3efa..25899bebd6a 100644 --- a/compiler/testData/ir/irText/expressions/elvis.kt.txt +++ b/compiler/testData/ir/irText/expressions/elvis.kt.txt @@ -34,10 +34,10 @@ fun test3(a: Any?, b: Any?): String { a !is String? -> return "" } return { // BLOCK - val tmp0_elvis_lhs: Any? = a + val tmp0_elvis_lhs: String? = a /*as String? */ when { EQEQ(arg0 = tmp0_elvis_lhs, arg1 = null) -> b /*as String */ - else -> tmp0_elvis_lhs /*as String */ + else -> tmp0_elvis_lhs } } } diff --git a/compiler/testData/ir/irText/expressions/elvis.txt b/compiler/testData/ir/irText/expressions/elvis.txt index 4d0432e69bf..3fe78d58f46 100644 --- a/compiler/testData/ir/irText/expressions/elvis.txt +++ b/compiler/testData/ir/irText/expressions/elvis.txt @@ -64,19 +64,19 @@ FILE fqName: fileName:/elvis.kt CONST String type=kotlin.String value="" RETURN type=kotlin.Nothing from='public final fun test3 (a: kotlin.Any?, b: kotlin.Any?): kotlin.String declared in ' BLOCK type=kotlin.String origin=ELVIS - VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.Any? [val] - GET_VAR 'a: kotlin.Any? declared in .test3' type=kotlin.Any? origin=null + VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.String? [val] + TYPE_OP type=kotlin.String? origin=IMPLICIT_CAST typeOperand=kotlin.String? + GET_VAR 'a: kotlin.Any? declared in .test3' type=kotlin.Any? origin=null WHEN type=kotlin.String origin=null BRANCH if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ - arg0: GET_VAR 'val tmp_2: kotlin.Any? [val] declared in .test3' type=kotlin.Any? origin=null + arg0: GET_VAR 'val tmp_2: kotlin.String? [val] declared in .test3' type=kotlin.String? origin=null arg1: CONST Null type=kotlin.Nothing? value=null then: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String GET_VAR 'b: kotlin.Any? declared in .test3' type=kotlin.Any? origin=null BRANCH if: CONST Boolean type=kotlin.Boolean value=true - then: TYPE_OP type=kotlin.String origin=IMPLICIT_CAST typeOperand=kotlin.String - GET_VAR 'val tmp_2: kotlin.Any? [val] declared in .test3' type=kotlin.Any? origin=null + then: GET_VAR 'val tmp_2: kotlin.String? [val] declared in .test3' type=kotlin.String? origin=null FUN name:test4 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Any VALUE_PARAMETER name:x index:0 type:kotlin.Any BLOCK_BODY diff --git a/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.kt.txt b/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.kt.txt index 30e1040f2a5..994da11b45d 100644 --- a/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.kt.txt +++ b/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.kt.txt @@ -1,12 +1,6 @@ fun test(x: Any?, y: Double): Boolean { return when { - x is Int -> less(arg0 = { // BLOCK - val tmp0_safe_receiver: Any? = x - when { - EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null - else -> tmp0_safe_receiver /*as Int */.toDouble() - } - }, arg1 = y) + x is Int -> less(arg0 = x /*as Int */.toDouble(), arg1 = y) else -> false } } diff --git a/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.txt b/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.txt index 4fba5465ab7..c9b9b99b311 100644 --- a/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.txt +++ b/compiler/testData/ir/irText/expressions/floatingPointComparisons/nullableAnyAsIntToDouble.txt @@ -9,20 +9,9 @@ FILE fqName: fileName:/nullableAnyAsIntToDouble.kt if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.Int GET_VAR 'x: kotlin.Any? declared in .test' type=kotlin.Any? origin=null then: CALL 'public final fun less (arg0: kotlin.Double, arg1: kotlin.Double): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=LT - arg0: BLOCK type=kotlin.Double? origin=SAFE_CALL - VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.Any? [val] + arg0: CALL 'public open fun toDouble (): kotlin.Double declared in kotlin.Int' type=kotlin.Double origin=null + $this: TYPE_OP type=kotlin.Int origin=IMPLICIT_CAST typeOperand=kotlin.Int GET_VAR 'x: kotlin.Any? declared in .test' type=kotlin.Any? origin=null - WHEN type=kotlin.Double? origin=null - BRANCH - if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ - arg0: GET_VAR 'val tmp_0: kotlin.Any? [val] declared in .test' type=kotlin.Any? origin=null - arg1: CONST Null type=kotlin.Nothing? value=null - then: CONST Null type=kotlin.Nothing? value=null - BRANCH - if: CONST Boolean type=kotlin.Boolean value=true - then: CALL 'public open fun toDouble (): kotlin.Double declared in kotlin.Int' type=kotlin.Double origin=null - $this: TYPE_OP type=kotlin.Int origin=IMPLICIT_CAST typeOperand=kotlin.Int - GET_VAR 'val tmp_0: kotlin.Any? [val] declared in .test' type=kotlin.Any? origin=null arg1: GET_VAR 'y: kotlin.Double declared in .test' type=kotlin.Double origin=null BRANCH if: CONST Boolean type=kotlin.Boolean value=true diff --git a/compiler/testData/ir/irText/expressions/implicitCastToNonNull.kt.txt b/compiler/testData/ir/irText/expressions/implicitCastToNonNull.kt.txt index 4b880aec3fc..70ed96c17a8 100644 --- a/compiler/testData/ir/irText/expressions/implicitCastToNonNull.kt.txt +++ b/compiler/testData/ir/irText/expressions/implicitCastToNonNull.kt.txt @@ -15,14 +15,14 @@ fun test2(x: T): Int { inline fun test3(x: Any): Int { return when { x !is T -> 0 - else -> x /*as CharSequence */.() + else -> x /*as T */.() } } inline fun test4(x: Any?): Int { return when { x !is T -> 0 - else -> x /*as CharSequence */.() + else -> x /*as T */.() } } diff --git a/compiler/testData/ir/irText/expressions/implicitCastToNonNull.txt b/compiler/testData/ir/irText/expressions/implicitCastToNonNull.txt index 41a2e36e965..5d32173c40c 100644 --- a/compiler/testData/ir/irText/expressions/implicitCastToNonNull.txt +++ b/compiler/testData/ir/irText/expressions/implicitCastToNonNull.txt @@ -41,7 +41,7 @@ FILE fqName: fileName:/implicitCastToNonNull.kt BRANCH if: CONST Boolean type=kotlin.Boolean value=true then: CALL 'public abstract fun (): kotlin.Int declared in kotlin.CharSequence' type=kotlin.Int origin=GET_PROPERTY - $this: TYPE_OP type=kotlin.CharSequence origin=IMPLICIT_CAST typeOperand=kotlin.CharSequence + $this: TYPE_OP type=T of .test3 origin=IMPLICIT_CAST typeOperand=T of .test3 GET_VAR 'x: kotlin.Any declared in .test3' type=kotlin.Any origin=null FUN name:test4 visibility:public modality:FINAL (x:kotlin.Any?) returnType:kotlin.Int [inline] TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.CharSequence] @@ -56,7 +56,7 @@ FILE fqName: fileName:/implicitCastToNonNull.kt BRANCH if: CONST Boolean type=kotlin.Boolean value=true then: CALL 'public abstract fun (): kotlin.Int declared in kotlin.CharSequence' type=kotlin.Int origin=GET_PROPERTY - $this: TYPE_OP type=kotlin.CharSequence origin=IMPLICIT_CAST typeOperand=kotlin.CharSequence + $this: TYPE_OP type=T of .test4 origin=IMPLICIT_CAST typeOperand=T of .test4 GET_VAR 'x: kotlin.Any? declared in .test4' type=kotlin.Any? origin=null FUN name:test5 visibility:public modality:FINAL (x:T of .test5, fn:kotlin.Function1.test5, kotlin.Unit>) returnType:kotlin.Unit TYPE_PARAMETER name:T index:0 variance: superTypes:[S of .test5?] diff --git a/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.kt.txt b/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.kt.txt index 4188588622b..ff50d562da6 100644 --- a/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.kt.txt +++ b/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.kt.txt @@ -1,7 +1,7 @@ fun f(x: Any): String { when { x is A<*> -> { // BLOCK - return x /*as A */.call(block = local fun (y: Any?): @FlexibleNullability String? { + return x /*as A<*> */ /*as A */.call(block = local fun (y: Any?): @FlexibleNullability String? { return "OK" } /*-> @FlexibleNullability I<@FlexibleNullability T?>? */) /*!! String */ diff --git a/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.txt b/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.txt index 6691f1859ff..9ceb814ffab 100644 --- a/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.txt +++ b/compiler/testData/ir/irText/expressions/sam/genericSamSmartcast.txt @@ -11,7 +11,8 @@ FILE fqName: fileName:/genericSamSmartcast.kt TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String CALL 'public open fun call (block: @[FlexibleNullability] .A.I<@[FlexibleNullability] T of .A?>?): @[FlexibleNullability] kotlin.String? declared in .A' type=@[FlexibleNullability] kotlin.String? origin=null $this: TYPE_OP type=.A.A> origin=IMPLICIT_CAST typeOperand=.A.A> - GET_VAR 'x: kotlin.Any declared in .f' type=kotlin.Any origin=null + TYPE_OP type=.A<*> origin=IMPLICIT_CAST typeOperand=.A<*> + GET_VAR 'x: kotlin.Any declared in .f' type=kotlin.Any origin=null block: TYPE_OP type=@[FlexibleNullability] .A.I<@[FlexibleNullability] T of .A?>? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] .A.I<@[FlexibleNullability] T of .A?>? FUN_EXPR type=kotlin.Function1 origin=LAMBDA FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> (y:kotlin.Any?) returnType:@[FlexibleNullability] kotlin.String? diff --git a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.kt.txt b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.kt.txt index 799c183c678..b2a8e98e6ea 100644 --- a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.kt.txt +++ b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.kt.txt @@ -4,6 +4,6 @@ fun test1(f: Function1): C<@FlexibleNullability String?> { fun test2(x: Any) { x as Function1 /*~> Unit */ - C<@FlexibleNullability String?>(jxx = x /*as Function1<@ParameterName(name = "x") @FlexibleNullability String?, @FlexibleNullability String?> */ /*-> @FlexibleNullability J<@FlexibleNullability String?, @FlexibleNullability String?>? */) /*~> Unit */ + C<@FlexibleNullability String?>(jxx = x /*as Function1 */ /*-> @FlexibleNullability J<@FlexibleNullability String?, @FlexibleNullability String?>? */) /*~> Unit */ } diff --git a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.txt b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.txt index d0156cf0372..c99d235eca4 100644 --- a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.txt +++ b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall.txt @@ -17,5 +17,5 @@ FILE fqName: fileName:/samConversionInGenericConstructorCall.kt CONSTRUCTOR_CALL 'public constructor (jxx: @[FlexibleNullability] .J<@[FlexibleNullability] X of .C?, @[FlexibleNullability] X of .C?>?) declared in .C' type=.C<@[FlexibleNullability] kotlin.String?> origin=null : @[FlexibleNullability] kotlin.String? jxx: TYPE_OP type=@[FlexibleNullability] .J<@[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?>? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] .J<@[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?>? - TYPE_OP type=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?> origin=IMPLICIT_CAST typeOperand=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?> + TYPE_OP type=kotlin.Function1 origin=IMPLICIT_CAST typeOperand=kotlin.Function1 GET_VAR 'x: kotlin.Any declared in .test2' type=kotlin.Any origin=null diff --git a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.kt.txt b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.kt.txt index 179e9a35468..4de1ad8e837 100644 --- a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.kt.txt +++ b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.kt.txt @@ -38,6 +38,6 @@ fun testGenericJavaCtor1(f: Function1): G<@FlexibleNullability Stri fun testGenericJavaCtor2(x: Any) { x as Function1 /*~> Unit */ - G<@FlexibleNullability String?, @FlexibleNullability Int?>(x = x /*as Function1<@ParameterName(name = "x") @FlexibleNullability String?, @FlexibleNullability Int?> */ /*-> @FlexibleNullability J<@FlexibleNullability Int?, @FlexibleNullability String?>? */) /*~> Unit */ + G<@FlexibleNullability String?, @FlexibleNullability Int?>(x = x /*as Function1 */ /*-> @FlexibleNullability J<@FlexibleNullability Int?, @FlexibleNullability String?>? */) /*~> Unit */ } diff --git a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.txt b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.txt index 7d57b2140ad..229419e46fa 100644 --- a/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.txt +++ b/compiler/testData/ir/irText/expressions/sam/samConversionInGenericConstructorCall_NI.txt @@ -110,5 +110,5 @@ FILE fqName: fileName:/samConversionInGenericConstructorCall_NI.kt : @[FlexibleNullability] kotlin.String? : @[FlexibleNullability] kotlin.Int? x: TYPE_OP type=@[FlexibleNullability] .J<@[FlexibleNullability] kotlin.Int?, @[FlexibleNullability] kotlin.String?>? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] .J<@[FlexibleNullability] kotlin.Int?, @[FlexibleNullability] kotlin.String?>? - TYPE_OP type=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.Int?> origin=IMPLICIT_CAST typeOperand=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.Int?> + TYPE_OP type=kotlin.Function1 origin=IMPLICIT_CAST typeOperand=kotlin.Function1 GET_VAR 'x: kotlin.Any declared in .testGenericJavaCtor2' type=kotlin.Any origin=null diff --git a/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.kt.txt b/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.kt.txt index 73b504c7621..ed788a12528 100644 --- a/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.kt.txt +++ b/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.kt.txt @@ -26,7 +26,7 @@ fun test4(a: Any) { fun test5(a: Any) { a as Function1 /*~> Unit */ - bar<@FlexibleNullability String?>(j = a /*as Function1<@ParameterName(name = "x") @FlexibleNullability String?, @FlexibleNullability String?> */ /*-> @FlexibleNullability J<@FlexibleNullability String?>? */) + bar<@FlexibleNullability String?>(j = a /*as Function1 */ /*-> @FlexibleNullability J<@FlexibleNullability String?>? */) } fun test6(a: Function1) { @@ -35,7 +35,7 @@ fun test6(a: Function1) { fun test7(a: Any) { a as Function1 /*~> Unit */ - bar<@FlexibleNullability T?>(j = a /*as Function1<@ParameterName(name = "x") @FlexibleNullability T?, @FlexibleNullability T?> */ /*-> @FlexibleNullability J<@FlexibleNullability T?>? */) + bar<@FlexibleNullability T?>(j = a /*as Function1 */ /*-> @FlexibleNullability J<@FlexibleNullability T?>? */) } fun test8(efn: @ExtensionFunctionType Function1): J<@FlexibleNullability String?> { diff --git a/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.txt b/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.txt index 5407c55305c..ce62696bc7b 100644 --- a/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.txt +++ b/compiler/testData/ir/irText/expressions/sam/samConversionToGeneric.txt @@ -50,7 +50,7 @@ FILE fqName: fileName:/samConversionToGeneric.kt CALL 'public open fun bar (j: @[FlexibleNullability] .J<@[FlexibleNullability] X of .H.bar?>?): kotlin.Unit declared in .H' type=kotlin.Unit origin=null : @[FlexibleNullability] kotlin.String? j: TYPE_OP type=@[FlexibleNullability] .J<@[FlexibleNullability] kotlin.String?>? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] .J<@[FlexibleNullability] kotlin.String?>? - TYPE_OP type=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?> origin=IMPLICIT_CAST typeOperand=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?> + TYPE_OP type=kotlin.Function1 origin=IMPLICIT_CAST typeOperand=kotlin.Function1 GET_VAR 'a: kotlin.Any declared in .test5' type=kotlin.Any origin=null FUN name:test6 visibility:public modality:FINAL (a:kotlin.Function1.test6, T of .test6>) returnType:kotlin.Unit TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] @@ -70,7 +70,7 @@ FILE fqName: fileName:/samConversionToGeneric.kt CALL 'public open fun bar (j: @[FlexibleNullability] .J<@[FlexibleNullability] X of .H.bar?>?): kotlin.Unit declared in .H' type=kotlin.Unit origin=null : @[FlexibleNullability] T of .test7? j: TYPE_OP type=@[FlexibleNullability] .J<@[FlexibleNullability] T of .test7?>? origin=SAM_CONVERSION typeOperand=@[FlexibleNullability] .J<@[FlexibleNullability] T of .test7?>? - TYPE_OP type=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] T of .test7?, @[FlexibleNullability] T of .test7?> origin=IMPLICIT_CAST typeOperand=kotlin.Function1<@[ParameterName(name = 'x')] @[FlexibleNullability] T of .test7?, @[FlexibleNullability] T of .test7?> + TYPE_OP type=kotlin.Function1.test7, T of .test7> origin=IMPLICIT_CAST typeOperand=kotlin.Function1.test7, T of .test7> GET_VAR 'a: kotlin.Any declared in .test7' type=kotlin.Any origin=null FUN name:test8 visibility:public modality:FINAL <> (efn:@[ExtensionFunctionType] kotlin.Function1) returnType:.J<@[FlexibleNullability] kotlin.String?> VALUE_PARAMETER name:efn index:0 type:@[ExtensionFunctionType] kotlin.Function1 diff --git a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.kt.txt b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.kt.txt index b67ccc83075..103d5468f2e 100644 --- a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.kt.txt +++ b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.kt.txt @@ -19,9 +19,9 @@ fun test(x: I1) { x !is I2 -> return Unit } // COMPOSITE { - val tmp0_container: I1 = x - val c1: Int = tmp0_container.component1() - val c2: String = tmp0_container /*as I2 */.component2() + val tmp0_container: I2 = x /*as I2 */ + val c1: Int = tmp0_container /*as I1 */.component1() + val c2: String = tmp0_container.component2() // } } diff --git a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.txt b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.txt index c62a4a1435d..278e9257ecb 100644 --- a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.txt +++ b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.txt @@ -49,12 +49,13 @@ FILE fqName: fileName:/smartCastsWithDestructuring.kt then: RETURN type=kotlin.Nothing from='public final fun test (x: .I1): kotlin.Unit declared in ' GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit COMPOSITE type=kotlin.Unit origin=DESTRUCTURING_DECLARATION - VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:.I1 [val] - GET_VAR 'x: .I1 declared in .test' type=.I1 origin=null + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:.I2 [val] + TYPE_OP type=.I2 origin=IMPLICIT_CAST typeOperand=.I2 + GET_VAR 'x: .I1 declared in .test' type=.I1 origin=null VAR name:c1 type:kotlin.Int [val] CALL 'public final fun component1 (): kotlin.Int [operator] declared in ' type=kotlin.Int origin=COMPONENT_N(index=1) - $receiver: GET_VAR 'val tmp_0: .I1 [val] declared in .test' type=.I1 origin=null + $receiver: TYPE_OP type=.I1 origin=IMPLICIT_CAST typeOperand=.I1 + GET_VAR 'val tmp_0: .I2 [val] declared in .test' type=.I2 origin=null VAR name:c2 type:kotlin.String [val] CALL 'public final fun component2 (): kotlin.String [operator] declared in ' type=kotlin.String origin=COMPONENT_N(index=2) - $receiver: TYPE_OP type=.I2 origin=IMPLICIT_CAST typeOperand=.I2 - GET_VAR 'val tmp_0: .I1 [val] declared in .test' type=.I1 origin=null + $receiver: GET_VAR 'val tmp_0: .I2 [val] declared in .test' type=.I2 origin=null diff --git a/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.kt.txt b/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.kt.txt index 2d41ef13f73..f5cc9cd21b7 100644 --- a/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.kt.txt +++ b/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.kt.txt @@ -78,8 +78,8 @@ class GB : GA { fun testGB1(a: Any) { a as GB /*~> Unit */ - a /*as GB<*, *> */.f() /*~> Unit */ - a /*as GB<*, *> */.() /*~> Unit */ + a /*as GB */.f() /*~> Unit */ + a /*as GB */.() /*~> Unit */ } } diff --git a/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.txt b/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.txt index 0bb26d5c38d..8f6e2e2aa16 100644 --- a/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.txt +++ b/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.txt @@ -187,11 +187,11 @@ FILE fqName: fileName:/smartCastOnFakeOverrideReceiver.kt GET_VAR 'a: kotlin.Any declared in .GB.testGB1' type=kotlin.Any origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL 'public final fun f (): kotlin.Int [fake_override] declared in .GB' type=kotlin.Int origin=null - $this: TYPE_OP type=.GB<*, *> origin=IMPLICIT_CAST typeOperand=.GB<*, *> + $this: TYPE_OP type=.GB origin=IMPLICIT_CAST typeOperand=.GB GET_VAR 'a: kotlin.Any declared in .GB.testGB1' type=kotlin.Any origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL 'public final fun (): kotlin.Int [fake_override] declared in .GB' type=kotlin.Int origin=GET_PROPERTY - $this: TYPE_OP type=.GB<*, *> origin=IMPLICIT_CAST typeOperand=.GB<*, *> + $this: TYPE_OP type=.GB origin=IMPLICIT_CAST typeOperand=.GB GET_VAR 'a: kotlin.Any declared in .GB.testGB1' type=kotlin.Any origin=null FUN FAKE_OVERRIDE name:f visibility:public modality:FINAL <> ($this:.GA.GB>) returnType:kotlin.Int [fake_override] overridden: