From 6fc0de39c251f4f188044857e435d456ed34fa70 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Thu, 17 Dec 2020 12:51:53 +0100 Subject: [PATCH] [PSI2IR] Propagate smart cast information for variable loads. This gives us more precise type information and can enable backend optimizations. This was motivated by when expressions not compiled to table switches in the JVM_IR backend. Fixed KT-36845. --- .../kotlin/psi2ir/generators/CallGenerator.kt | 23 +++++++++++++------ .../psi2ir/generators/StatementGenerator.kt | 4 +++- .../whenEnumOptimization/kt14597_full.kt | 3 --- .../whenEnumOptimization/kt14802.kt | 3 --- .../caoWithAdaptationForSam.kt.txt | 2 +- .../caoWithAdaptationForSam.txt | 2 +- .../ir/irText/expressions/elvis.kt.txt | 4 ++-- .../testData/ir/irText/expressions/elvis.txt | 10 ++++---- .../nullableAnyAsIntToDouble.kt.txt | 8 +------ .../nullableAnyAsIntToDouble.txt | 15 ++---------- .../expressions/implicitCastToNonNull.kt.txt | 4 ++-- .../expressions/implicitCastToNonNull.txt | 4 ++-- .../sam/genericSamSmartcast.kt.txt | 2 +- .../expressions/sam/genericSamSmartcast.txt | 3 ++- ...mConversionInGenericConstructorCall.kt.txt | 2 +- .../samConversionInGenericConstructorCall.txt | 2 +- ...nversionInGenericConstructorCall_NI.kt.txt | 2 +- ...mConversionInGenericConstructorCall_NI.txt | 2 +- .../sam/samConversionToGeneric.kt.txt | 4 ++-- .../sam/samConversionToGeneric.txt | 4 ++-- .../smartCastsWithDestructuring.kt.txt | 6 ++--- .../smartCastsWithDestructuring.txt | 11 +++++---- .../smartCastOnFakeOverrideReceiver.kt.txt | 4 ++-- .../types/smartCastOnFakeOverrideReceiver.txt | 4 ++-- 24 files changed, 59 insertions(+), 69 deletions(-) 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: