From 420fbad73d211dccbe8bcf94d8bb486bb83bcd19 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 2 Nov 2023 12:27:30 +0200 Subject: [PATCH] [FIR2IR] Properly insert implicit casts to extension receiver in case of intersection smartcast type ^KT-62863 Fixed --- .../fir/backend/Fir2IrImplicitCastInserter.kt | 76 +++++++++++----- .../kotlin/fir/backend/Fir2IrVisitor.kt | 51 ++++++----- .../generators/CallAndReferenceGenerator.kt | 2 +- .../FirLightTreeJvmIrTextTestGenerated.java | 12 +++ .../ir/FirPsiJvmIrTextTestGenerated.java | 12 +++ ...ricReceiverOnExtensionWithSmartcast.ir.txt | 30 +++++++ ...genericReceiverOnExtensionWithSmartcast.kt | 14 +++ ...ricReceiverOnExtensionWithSmartcast.kt.txt | 18 ++++ ...eceiverOnExtensionWithSmartcast.sig.kt.txt | 17 ++++ ...xtensionReceiverWithSameConstructor.ir.txt | 90 +++++++++++++++++++ ...ForExtensionReceiverWithSameConstructor.kt | 41 +++++++++ ...xtensionReceiverWithSameConstructor.kt.txt | 40 +++++++++ ...sionReceiverWithSameConstructor.sig.kt.txt | 47 ++++++++++ .../expressions/smartCastAside2.fir.ir.txt | 74 ++++++++------- .../expressions/smartCastAside2.fir.kt.txt | 12 +-- .../smartCastsWithDestructuring.fir.ir.txt | 5 +- .../smartCastsWithDestructuring.fir.kt.txt | 4 +- .../ir/ClassicJvmIrTextTestGenerated.java | 12 +++ .../klib/KlibIrTextTestCaseGenerated.java | 10 +++ .../FirLightTreeJsIrTextTestGenerated.java | 12 +++ .../test/fir/FirPsiJsIrTextTestGenerated.java | 12 +++ .../test/ir/ClassicJsIrTextTestGenerated.java | 12 +++ .../ClassicNativeIrTextTestGenerated.java | 12 +++ ...FirLightTreeNativeIrTextTestGenerated.java | 12 +++ .../FirPsiNativeIrTextTestGenerated.java | 12 +++ 25 files changed, 548 insertions(+), 91 deletions(-) create mode 100644 compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.ir.txt create mode 100644 compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt create mode 100644 compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt.txt create mode 100644 compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.sig.kt.txt create mode 100644 compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.ir.txt create mode 100644 compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt create mode 100644 compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt.txt create mode 100644 compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.sig.kt.txt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt index 51984b6fe95..dad862c7419 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrImplicitCastInserter.kt @@ -6,13 +6,15 @@ package org.jetbrains.kotlin.fir.backend import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression -import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.ir.IrBuiltIns @@ -279,28 +281,64 @@ class Fir2IrImplicitCastInserter( } } - internal fun implicitCastFromDispatchReceiver( - original: IrExpression, - coneKotlinType: ConeKotlinType, - calleeReference: FirReference?, + internal fun implicitCastFromReceivers( + originalIrReceiver: IrExpression, + receiver: FirExpression, + selector: FirQualifiedAccessExpression, typeOrigin: ConversionTypeOrigin, ): IrExpression { - val referencedDeclaration = calleeReference?.toResolvedCallableSymbol()?.unwrapCallRepresentative()?.fir + return implicitCastFromReceiverForIntersectionTypeOrNull( + originalIrReceiver, + receiver, + selector, + typeOrigin + ) ?: implicitCastOrExpression(originalIrReceiver, receiver.resolvedType) + } - val dispatchReceiverType = - referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType - ?: return implicitCastOrExpression(original, coneKotlinType) + private fun implicitCastFromReceiverForIntersectionTypeOrNull( + originalIrReceiver: IrExpression, + receiver: FirExpression, + selector: FirQualifiedAccessExpression, + typeOrigin: ConversionTypeOrigin, + ): IrExpression? { + val receiverExpressionType = receiver.resolvedType as? ConeIntersectionType ?: return null + val referencedDeclaration = selector.calleeReference.toResolvedCallableSymbol()?.unwrapCallRepresentative()?.fir - val starProjectedDispatchReceiver = dispatchReceiverType.replaceArgumentsWithStarProjections() - - val castType = coneKotlinType as? ConeIntersectionType - castType?.intersectedTypes?.forEach { componentType -> - if (AbstractTypeChecker.isSubtypeOf(session.typeContext, componentType, starProjectedDispatchReceiver)) { - return implicitCastOrExpression(original, componentType, typeOrigin) + val receiverType = with(selector) { + when { + receiver === dispatchReceiver -> { + val dispatchReceiverType = referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType ?: return null + dispatchReceiverType.replaceArgumentsWithStarProjections() + } + receiver === extensionReceiver -> { + val extensionReceiverType = referencedDeclaration?.receiverParameter?.typeRef?.coneType ?: return null + val substitutor = createSubstitutorFromTypeArguments(selector, referencedDeclaration) + substitutor.substituteOrSelf(extensionReceiverType) + } + else -> return null } } - return implicitCastOrExpression(original, coneKotlinType, typeOrigin) + for (componentType in receiverExpressionType.intersectedTypes) { + if (AbstractTypeChecker.isSubtypeOf(session.typeContext, componentType, receiverType)) { + return implicitCastOrExpression(originalIrReceiver, componentType, typeOrigin) + } + } + return null + } + + private fun createSubstitutorFromTypeArguments( + qualifiedAccessExpression: FirQualifiedAccessExpression, + callableDeclaration: FirCallableDeclaration, + ): ConeSubstitutor { + if (qualifiedAccessExpression.typeArguments.isEmpty() || callableDeclaration.typeParameters.isEmpty()) return ConeSubstitutor.Empty + val map = buildMap { + for ((parameter, argument) in callableDeclaration.typeParameters.zip(qualifiedAccessExpression.typeArguments)) { + val argumentType = argument.toConeTypeProjection().type ?: continue + put(parameter.symbol, argumentType) + } + } + return ConeSubstitutorByMap(map, session) } private fun implicitCastOrExpression( @@ -309,12 +347,6 @@ class Fir2IrImplicitCastInserter( return implicitCastOrExpression(original, castType.toIrType(typeOrigin)) } - private fun implicitCastOrExpression( - original: IrExpression, castType: FirTypeRef, typeOrigin: ConversionTypeOrigin = ConversionTypeOrigin.DEFAULT - ): IrExpression { - return implicitCastOrExpression(original, castType.toIrType(typeOrigin)) - } - companion object { internal fun implicitCastOrExpression(original: IrExpression, castType: IrType): IrExpression { val originalNotNull = original.type.makeNotNull() diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index a2d800daf17..60c1d4c3d4b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -573,7 +573,10 @@ class Fir2IrVisitor( functionCall: FirFunctionCall, dynamicOperator: IrDynamicOperator? ): IrExpression { - val explicitReceiverExpression = convertToIrReceiverExpression(functionCall.explicitReceiver, functionCall.calleeReference) + val explicitReceiverExpression = convertToIrReceiverExpression( + functionCall.explicitReceiver, + functionCall + ) return callGenerator.convertToIrCall( functionCall, functionCall.resolvedType, @@ -653,7 +656,7 @@ class Fir2IrVisitor( qualifiedAccessExpression: FirQualifiedAccessExpression, ): IrExpression = whileAnalysing(session, qualifiedAccessExpression) { val explicitReceiverExpression = convertToIrReceiverExpression( - qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.calleeReference + qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression ) return callGenerator.convertToIrCall( qualifiedAccessExpression, qualifiedAccessExpression.resolvedType, explicitReceiverExpression @@ -849,7 +852,7 @@ class Fir2IrVisitor( private fun convertCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, isDelegate: Boolean): IrElement { val explicitReceiverExpression = convertToIrReceiverExpression( - callableReferenceAccess.explicitReceiver, callableReferenceAccess.calleeReference, callableReferenceAccess + callableReferenceAccess.explicitReceiver, callableReferenceAccess ) return callGenerator.convertToIrCallableReference( callableReferenceAccess, @@ -862,9 +865,11 @@ class Fir2IrVisitor( variableAssignment: FirVariableAssignment, data: Any? ): IrElement = whileAnalysing(session, variableAssignment) { - val explicitReceiverExpression = convertToIrReceiverExpression( - variableAssignment.explicitReceiver, variableAssignment.calleeReference - ) + val explicitReceiverExpression = variableAssignment.explicitReceiver?.let { receiverExpression -> + convertToIrReceiverExpression( + receiverExpression, variableAssignment.unwrapLValue()!! + ) + } return callGenerator.convertToIrSetCall(variableAssignment, explicitReceiverExpression) } @@ -923,31 +928,31 @@ class Fir2IrVisitor( } internal fun convertToIrReceiverExpression( - expression: FirExpression?, - calleeReference: FirReference?, - callableReferenceAccess: FirCallableReferenceAccess? = null + receiver: FirExpression?, + selector: FirQualifiedAccessExpression, ): IrExpression? { - return when (expression) { + val selectorCalleeReference = selector.calleeReference + return when (receiver) { null -> return null - is FirResolvedQualifier -> callGenerator.convertToGetObject(expression, callableReferenceAccess) + is FirResolvedQualifier -> callGenerator.convertToGetObject(receiver, selector as? FirCallableReferenceAccess) is FirFunctionCall, is FirThisReceiverExpression, is FirCallableReferenceAccess, is FirSmartCastExpression -> - convertToIrExpression(expression) - else -> if (expression is FirQualifiedAccessExpression && expression.explicitReceiver == null) { - val variableAsFunctionMode = calleeReference is FirResolvedNamedReference && - calleeReference.name != OperatorNameConventions.INVOKE && - (calleeReference.resolvedSymbol as? FirCallableSymbol)?.callableId?.callableName == OperatorNameConventions.INVOKE + convertToIrExpression(receiver) + else -> if (receiver is FirQualifiedAccessExpression && receiver.explicitReceiver == null) { + val variableAsFunctionMode = selectorCalleeReference is FirResolvedNamedReference && + selectorCalleeReference.name != OperatorNameConventions.INVOKE && + (selectorCalleeReference.resolvedSymbol as? FirCallableSymbol)?.callableId?.callableName == OperatorNameConventions.INVOKE callGenerator.convertToIrCall( - expression, expression.resolvedType, explicitReceiverExpression = null, + receiver, receiver.resolvedType, explicitReceiverExpression = null, variableAsFunctionMode = variableAsFunctionMode ) } else { - convertToIrExpression(expression) + convertToIrExpression(receiver) } }?.run { - if (expression is FirQualifiedAccessExpression && expression.calleeReference is FirSuperReference) return@run this + if (receiver is FirQualifiedAccessExpression && receiver.calleeReference is FirSuperReference) return@run this - implicitCastInserter.implicitCastFromDispatchReceiver( - this, expression.resolvedType, calleeReference, + implicitCastInserter.implicitCastFromReceivers( + this, receiver, selector, conversionScope.defaultConversionTypeOrigin() ) } @@ -1056,7 +1061,7 @@ class Fir2IrVisitor( val originalVararg = arrayAccess.resolvedArgumentMapping?.keys?.filterIsInstance()?.firstOrNull() (callGenerator.convertToIrCall( arrayAccess, arrayAccess.resolvedType, - convertToIrReceiverExpression(receiverValue, arrayAccess.calleeReference), + convertToIrReceiverExpression(receiverValue, arrayAccess), noArguments = true ) as IrDynamicOperatorExpression).apply { originalVararg?.arguments?.forEach { @@ -1075,7 +1080,7 @@ class Fir2IrVisitor( callGenerator.convertToIrCall( qualifiedAccess, qualifiedAccess.resolvedType, - convertToIrReceiverExpression(receiverExpression, qualifiedAccess.calleeReference), + convertToIrReceiverExpression(receiverExpression, qualifiedAccess), ) } return callGenerator.convertToIrCall( diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index c2eaf960c7f..ca93bf23d1f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -1249,7 +1249,7 @@ class CallAndReferenceGenerator( } return firReceiver - ?.let { visitor.convertToIrReceiverExpression(it, calleeReference, this as? FirCallableReferenceAccess) } + ?.let { visitor.convertToIrReceiverExpression(it, this) } ?: explicitReceiverExpression } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java index bd91d00a373..776c2ceb5f5 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirLightTreeJvmIrTextTestGenerated.java @@ -1576,6 +1576,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1642,6 +1648,12 @@ public class FirLightTreeJvmIrTextTestGenerated extends AbstractFirLightTreeJvmI runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("javaSyntheticGenericPropretyAccess.kt") public void testJavaSyntheticGenericPropretyAccess() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java index cf95375d8f0..009bc4cdb9f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/FirPsiJvmIrTextTestGenerated.java @@ -1576,6 +1576,12 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest { runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1642,6 +1648,12 @@ public class FirPsiJvmIrTextTestGenerated extends AbstractFirPsiJvmIrTextTest { runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("javaSyntheticGenericPropretyAccess.kt") public void testJavaSyntheticGenericPropretyAccess() throws Exception { diff --git a/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.ir.txt b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.ir.txt new file mode 100644 index 00000000000..9da98135f64 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.ir.txt @@ -0,0 +1,30 @@ +FILE fqName: fileName:/genericReceiverOnExtensionWithSmartcast.kt + FUN name:bar visibility:public modality:FINAL ($receiver:F of .bar) returnType:kotlin.Unit + TYPE_PARAMETER name:F index:0 variance: superTypes:[kotlin.CharSequence] reified:false + $receiver: VALUE_PARAMETER name: type:F of .bar + BLOCK_BODY + FUN name:test_1 visibility:public modality:FINAL (x:kotlin.Any) returnType:kotlin.Unit [inline] + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.CharSequence] reified:true + VALUE_PARAMETER name:x index:0 type:kotlin.Any + BLOCK_BODY + WHEN type=kotlin.Unit origin=IF + BRANCH + if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=T of .test_1 + GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null + then: BLOCK type=kotlin.Unit origin=null + CALL 'public final fun bar (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + : T of .test_1 + $receiver: TYPE_OP type=T of .test_1 origin=IMPLICIT_CAST typeOperand=T of .test_1 + GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null + FUN name:test_2 visibility:public modality:FINAL <> (x:kotlin.Any?) returnType:kotlin.Unit + VALUE_PARAMETER name:x index:0 type:kotlin.Any? + BLOCK_BODY + WHEN type=kotlin.Unit origin=IF + BRANCH + if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.CharSequence + GET_VAR 'x: kotlin.Any? declared in .test_2' type=kotlin.Any? origin=null + then: BLOCK type=kotlin.Unit origin=null + CALL 'public final fun bar (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + : kotlin.CharSequence + $receiver: TYPE_OP type=kotlin.CharSequence origin=IMPLICIT_CAST typeOperand=kotlin.CharSequence + GET_VAR 'x: kotlin.Any? declared in .test_2' type=kotlin.Any? origin=null diff --git a/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt new file mode 100644 index 00000000000..e5eaa6fe2aa --- /dev/null +++ b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt @@ -0,0 +1,14 @@ +// FIR_IDENTICAL +fun F.bar() {} + +inline fun test_1(x: Any) { + if (x is T) { + x.bar() + } +} + +fun test_2(x: Any?) { + if (x is CharSequence) { + x.bar() + } +} diff --git a/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt.txt b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt.txt new file mode 100644 index 00000000000..d6570bf44dd --- /dev/null +++ b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt.txt @@ -0,0 +1,18 @@ +fun F.bar() { +} + +inline fun test_1(x: Any) { + when { + x is T -> { // BLOCK + x /*as T */.bar() + } + } +} + +fun test_2(x: Any?) { + when { + x is CharSequence -> { // BLOCK + x /*as CharSequence */.bar() + } + } +} diff --git a/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.sig.kt.txt b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.sig.kt.txt new file mode 100644 index 00000000000..800f4dab544 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.sig.kt.txt @@ -0,0 +1,17 @@ +// CHECK: +// Mangled name: #bar@0:0(){0§} +// Public signature: /bar|8964320427600610167[0] +// Public signature debug description: bar@0:0(){0§} +fun F.bar(): Unit + +// CHECK: +// Mangled name: #test_1(kotlin.Any){0§} +// Public signature: /test_1|-9076880516293570076[0] +// Public signature debug description: test_1(kotlin.Any){0§} +inline fun test_1(x: Any): Unit + +// CHECK: +// Mangled name: #test_2(kotlin.Any?){} +// Public signature: /test_2|-2820233899677445404[0] +// Public signature debug description: test_2(kotlin.Any?){} +fun test_2(x: Any?): Unit diff --git a/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.ir.txt b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.ir.txt new file mode 100644 index 00000000000..fb504e9a8a5 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.ir.txt @@ -0,0 +1,90 @@ +FILE fqName: fileName:/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt + CLASS CLASS name:Bar modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Bar.Bar> + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] reified:false + CONSTRUCTOR visibility:public <> () returnType:.Bar.Bar> [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Bar modality:FINAL visibility:public superTypes:[kotlin.Any]' + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:specificExt visibility:public modality:FINAL <> ($receiver:.Bar) returnType:kotlin.Unit + $receiver: VALUE_PARAMETER name: type:.Bar + BLOCK_BODY + FUN name:test_1_1 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Unit + VALUE_PARAMETER name:x index:0 type:kotlin.Any + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1_1' type=kotlin.Any origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1_1' type=kotlin.Any origin=null + CALL 'public final fun specificExt (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1_1' type=kotlin.Any origin=null + FUN name:test_1_2 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Unit + VALUE_PARAMETER name:x index:0 type:kotlin.Any + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1_2' type=kotlin.Any origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1_2' type=kotlin.Any origin=null + CALL 'public final fun specificExt (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1_2' type=kotlin.Any origin=null + FUN name:parameterizedExt visibility:public modality:FINAL ($receiver:.Bar.parameterizedExt>) returnType:kotlin.Unit + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] reified:false + $receiver: VALUE_PARAMETER name: type:.Bar.parameterizedExt> + BLOCK_BODY + FUN name:test_2_1 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Unit + VALUE_PARAMETER name:x index:0 type:kotlin.Any + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_1' type=kotlin.Any origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_1' type=kotlin.Any origin=null + CALL 'public final fun parameterizedExt (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + : kotlin.String + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_1' type=kotlin.Any origin=null + CALL 'public final fun parameterizedExt (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + : kotlin.Int + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_1' type=kotlin.Any origin=null + FUN name:test_2_2 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Unit + VALUE_PARAMETER name:x index:0 type:kotlin.Any + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_2' type=kotlin.Any origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + TYPE_OP type=.Bar origin=CAST typeOperand=.Bar + TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_2' type=kotlin.Any origin=null + CALL 'public final fun parameterizedExt (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + : kotlin.String + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_2' type=kotlin.Any origin=null + CALL 'public final fun parameterizedExt (): kotlin.Unit declared in ' type=kotlin.Unit origin=null + : kotlin.Int + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_2_2' type=kotlin.Any origin=null diff --git a/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt new file mode 100644 index 00000000000..36aff96f7c6 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt @@ -0,0 +1,41 @@ +// FIR_IDENTICAL +// IGNORE_BACKEND_K1: ANY +// Reason: K1 can't resolve calls in test_2_1 and test_2_2 functions +// SKIP_KLIB_TEST +// Reason: AbstractKlibIrTextTestCase doen't support IGNORE_BACKEND_K1 directive +// ISSUE: KT-62863 +class Bar + +fun Bar.specificExt() {} + +fun test_1_1(x: Any) { + x as Bar + x as Bar + + x.specificExt() +} + +fun test_1_2(x: Any) { + x as Bar + x as Bar + + x.specificExt() +} + +fun Bar.parameterizedExt() {} + +fun test_2_1(x: Any) { + x as Bar + x as Bar + + x.parameterizedExt() + x.parameterizedExt() +} + +fun test_2_2(x: Any) { + x as Bar + x as Bar + + x.parameterizedExt() + x.parameterizedExt() +} diff --git a/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt.txt b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt.txt new file mode 100644 index 00000000000..4adee5590f6 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt.txt @@ -0,0 +1,40 @@ +class Bar { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + +} + +fun Bar.specificExt() { +} + +fun test_1_1(x: Any) { + x as Bar /*~> Unit */ + x /*as Bar */ as Bar /*~> Unit */ + x /*as Bar */.specificExt() +} + +fun test_1_2(x: Any) { + x as Bar /*~> Unit */ + x /*as Bar */ as Bar /*~> Unit */ + x /*as Bar */.specificExt() +} + +fun Bar.parameterizedExt() { +} + +fun test_2_1(x: Any) { + x as Bar /*~> Unit */ + x /*as Bar */ as Bar /*~> Unit */ + x /*as Bar */.parameterizedExt() + x /*as Bar */.parameterizedExt() +} + +fun test_2_2(x: Any) { + x as Bar /*~> Unit */ + x /*as Bar */ as Bar /*~> Unit */ + x /*as Bar */.parameterizedExt() + x /*as Bar */.parameterizedExt() +} diff --git a/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.sig.kt.txt b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.sig.kt.txt new file mode 100644 index 00000000000..6d4733f107e --- /dev/null +++ b/compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.sig.kt.txt @@ -0,0 +1,47 @@ +// CHECK: +// Mangled name: Bar +// Public signature: /Bar|null[0] +class Bar { + // CHECK: + // Mangled name: Bar#(){} + // Public signature: /Bar.|-5645683436151566731[0] + // Public signature debug description: (){} + constructor() /* primary */ + +} + +// CHECK: +// Mangled name: #parameterizedExt@Bar<0:0>(){0§} +// Public signature: /parameterizedExt|238116600414962466[0] +// Public signature debug description: parameterizedExt@Bar<0:0>(){0§} +fun Bar.parameterizedExt(): Unit + +// CHECK: +// Mangled name: #specificExt@Bar(){} +// Public signature: /specificExt|-1310832403295072487[0] +// Public signature debug description: specificExt@Bar(){} +fun Bar.specificExt(): Unit + +// CHECK: +// Mangled name: #test_1_1(kotlin.Any){} +// Public signature: /test_1_1|7398425926544174899[0] +// Public signature debug description: test_1_1(kotlin.Any){} +fun test_1_1(x: Any): Unit + +// CHECK: +// Mangled name: #test_1_2(kotlin.Any){} +// Public signature: /test_1_2|7281604678448694217[0] +// Public signature debug description: test_1_2(kotlin.Any){} +fun test_1_2(x: Any): Unit + +// CHECK: +// Mangled name: #test_2_1(kotlin.Any){} +// Public signature: /test_2_1|605030431757647889[0] +// Public signature debug description: test_2_1(kotlin.Any){} +fun test_2_1(x: Any): Unit + +// CHECK: +// Mangled name: #test_2_2(kotlin.Any){} +// Public signature: /test_2_2|-2792936422375173693[0] +// Public signature debug description: test_2_2(kotlin.Any){} +fun test_2_2(x: Any): Unit diff --git a/compiler/testData/ir/irText/expressions/smartCastAside2.fir.ir.txt b/compiler/testData/ir/irText/expressions/smartCastAside2.fir.ir.txt index 3a5dd481d58..0376e309d62 100644 --- a/compiler/testData/ir/irText/expressions/smartCastAside2.fir.ir.txt +++ b/compiler/testData/ir/irText/expressions/smartCastAside2.fir.ir.txt @@ -72,10 +72,12 @@ FILE fqName: fileName:/smartCastAside2.kt GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null CALL 'public final fun extFoo (): kotlin.Unit declared in ' type=kotlin.Unit origin=null : kotlin.Any - $receiver: GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null + $receiver: TYPE_OP type=.Foo origin=IMPLICIT_CAST typeOperand=.Foo + GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null CALL 'public final fun extBar (): kotlin.Unit declared in ' type=kotlin.Unit origin=null : kotlin.Any - $receiver: GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + GET_VAR 'x: kotlin.Any declared in .test_1' type=kotlin.Any origin=null FUN name:test_2 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Unit VALUE_PARAMETER name:x index:0 type:kotlin.Any BLOCK_BODY @@ -98,14 +100,16 @@ FILE fqName: fileName:/smartCastAside2.kt arg0: GET_VAR 'x: kotlin.Any declared in .test_2' type=kotlin.Any origin=null CALL 'public final fun extFoo (): kotlin.Unit declared in ' type=kotlin.Unit origin=null : kotlin.Any - $receiver: CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=kotlin.Any origin=EXCLEXCL - : kotlin.Any - arg0: GET_VAR 'x: kotlin.Any declared in .test_2' type=kotlin.Any origin=null + $receiver: TYPE_OP type=.Foo origin=IMPLICIT_CAST typeOperand=.Foo + CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=kotlin.Any origin=EXCLEXCL + : kotlin.Any + arg0: GET_VAR 'x: kotlin.Any declared in .test_2' type=kotlin.Any origin=null CALL 'public final fun extBar (): kotlin.Unit declared in ' type=kotlin.Unit origin=null : kotlin.Any - $receiver: CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=kotlin.Any origin=EXCLEXCL - : kotlin.Any - arg0: GET_VAR 'x: kotlin.Any declared in .test_2' type=kotlin.Any origin=null + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=kotlin.Any origin=EXCLEXCL + : kotlin.Any + arg0: GET_VAR 'x: kotlin.Any declared in .test_2' type=kotlin.Any origin=null FUN name:test_3 visibility:public modality:FINAL <> (x:kotlin.Any) returnType:kotlin.Unit VALUE_PARAMETER name:x index:0 type:kotlin.Any BLOCK_BODY @@ -148,31 +152,33 @@ FILE fqName: fileName:/smartCastAside2.kt then: GET_VAR 'val tmp_1: kotlin.Any declared in .test_3' type=kotlin.Any origin=null CALL 'public final fun extFoo (): kotlin.Unit declared in ' type=kotlin.Unit origin=null : kotlin.Any - $receiver: BLOCK type=kotlin.Any origin=ELVIS - VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.Any [val] - GET_VAR 'x: kotlin.Any declared in .test_3' type=kotlin.Any origin=null - WHEN type=kotlin.Any 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 declared in .test_3' type=kotlin.Any origin=null - arg1: CONST Null type=kotlin.Nothing? value=null - then: CALL 'public final fun materialize (): K of .materialize declared in ' type=kotlin.Any origin=null - : kotlin.Any - BRANCH - if: CONST Boolean type=kotlin.Boolean value=true - then: GET_VAR 'val tmp_2: kotlin.Any declared in .test_3' type=kotlin.Any origin=null + $receiver: TYPE_OP type=.Foo origin=IMPLICIT_CAST typeOperand=.Foo + BLOCK type=kotlin.Any origin=ELVIS + VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.Any [val] + GET_VAR 'x: kotlin.Any declared in .test_3' type=kotlin.Any origin=null + WHEN type=kotlin.Any 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 declared in .test_3' type=kotlin.Any origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CALL 'public final fun materialize (): K of .materialize declared in ' type=kotlin.Any origin=null + : kotlin.Any + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: GET_VAR 'val tmp_2: kotlin.Any declared in .test_3' type=kotlin.Any origin=null CALL 'public final fun extBar (): kotlin.Unit declared in ' type=kotlin.Unit origin=null : kotlin.Any - $receiver: BLOCK type=kotlin.Any origin=ELVIS - VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:kotlin.Any [val] - GET_VAR 'x: kotlin.Any declared in .test_3' type=kotlin.Any origin=null - WHEN type=kotlin.Any 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_3: kotlin.Any declared in .test_3' type=kotlin.Any origin=null - arg1: CONST Null type=kotlin.Nothing? value=null - then: CALL 'public final fun materialize (): K of .materialize declared in ' type=kotlin.Any origin=null - : kotlin.Any - BRANCH - if: CONST Boolean type=kotlin.Boolean value=true - then: GET_VAR 'val tmp_3: kotlin.Any declared in .test_3' type=kotlin.Any origin=null + $receiver: TYPE_OP type=.Bar origin=IMPLICIT_CAST typeOperand=.Bar + BLOCK type=kotlin.Any origin=ELVIS + VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:kotlin.Any [val] + GET_VAR 'x: kotlin.Any declared in .test_3' type=kotlin.Any origin=null + WHEN type=kotlin.Any 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_3: kotlin.Any declared in .test_3' type=kotlin.Any origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CALL 'public final fun materialize (): K of .materialize declared in ' type=kotlin.Any origin=null + : kotlin.Any + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: GET_VAR 'val tmp_3: kotlin.Any declared in .test_3' type=kotlin.Any origin=null diff --git a/compiler/testData/ir/irText/expressions/smartCastAside2.fir.kt.txt b/compiler/testData/ir/irText/expressions/smartCastAside2.fir.kt.txt index 1d940b35972..fb161941e6f 100644 --- a/compiler/testData/ir/irText/expressions/smartCastAside2.fir.kt.txt +++ b/compiler/testData/ir/irText/expressions/smartCastAside2.fir.kt.txt @@ -29,8 +29,8 @@ fun test_1(x: Any) { x /*as Bar */ as Foo /*~> Unit */ x /*as Foo */.foo() x /*as Bar */.bar() - x.extFoo() - x.extBar() + x /*as Foo */.extFoo() + x /*as Bar */.extBar() } fun test_2(x: Any) { @@ -38,8 +38,8 @@ fun test_2(x: Any) { x /*as Bar */ as Foo? /*~> Unit */ CHECK_NOT_NULL(arg0 = x) /*as Foo */.foo() CHECK_NOT_NULL(arg0 = x) /*as Bar */.bar() - CHECK_NOT_NULL(arg0 = x).extFoo() - CHECK_NOT_NULL(arg0 = x).extBar() + CHECK_NOT_NULL(arg0 = x) /*as Foo */.extFoo() + CHECK_NOT_NULL(arg0 = x) /*as Bar */.extBar() } fun test_3(x: Any) { @@ -65,13 +65,13 @@ fun test_3(x: Any) { EQEQ(arg0 = tmp_2, arg1 = null) -> materialize() else -> tmp_2 } - }.extFoo() + } /*as Foo */.extFoo() { // BLOCK val tmp_3: Any = x when { EQEQ(arg0 = tmp_3, arg1 = null) -> materialize() else -> tmp_3 } - }.extBar() + } /*as Bar */.extBar() } diff --git a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.ir.txt b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.ir.txt index 6369726206a..20426d10a7c 100644 --- a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.ir.txt +++ b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.ir.txt @@ -53,9 +53,8 @@ FILE fqName: fileName:/smartCastsWithDestructuring.kt 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 declared in ' type=kotlin.Int origin=COMPONENT_N(index=1) - $receiver: TYPE_OP type=kotlin.Any origin=IMPLICIT_CAST typeOperand=kotlin.Any - GET_VAR 'val tmp_0: .I1 declared in .test' type=.I1 origin=null + $receiver: GET_VAR 'val tmp_0: .I1 declared in .test' type=.I1 origin=null VAR name:c2 type:kotlin.String [val] CALL 'public final fun component2 (): kotlin.String declared in ' type=kotlin.String origin=COMPONENT_N(index=2) - $receiver: TYPE_OP type=kotlin.Any origin=IMPLICIT_CAST typeOperand=kotlin.Any + $receiver: TYPE_OP type=.I2 origin=IMPLICIT_CAST typeOperand=.I2 GET_VAR 'val tmp_0: .I1 declared in .test' type=.I1 origin=null diff --git a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.kt.txt b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.kt.txt index 5782d914ef5..220ba40444b 100644 --- a/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.kt.txt +++ b/compiler/testData/ir/irText/expressions/smartCastsWithDestructuring.fir.kt.txt @@ -19,6 +19,6 @@ fun test(x: I1) { x !is I2 -> return Unit } val tmp_0: I1 = x /*as Any */ - val c1: Int = tmp_0 /*as Any */.component1() - val c2: String = tmp_0 /*as Any */.component2() + val c1: Int = tmp_0.component1() + val c2: String = tmp_0 /*as I2 */.component2() } diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java index b81c9d0ad7a..e167fec38dd 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/ClassicJvmIrTextTestGenerated.java @@ -1576,6 +1576,12 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1642,6 +1648,12 @@ public class ClassicJvmIrTextTestGenerated extends AbstractClassicJvmIrTextTest runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("javaSyntheticGenericPropretyAccess.kt") public void testJavaSyntheticGenericPropretyAccess() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java index c1cfcc9f610..a4f3e629a29 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibIrTextTestCaseGenerated.java @@ -1268,6 +1268,11 @@ public class KlibIrTextTestCaseGenerated extends AbstractKlibIrTextTestCase { runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @TestMetadata("identity.kt") public void testIdentity() throws Exception { runTest("compiler/testData/ir/irText/expressions/identity.kt"); @@ -1308,6 +1313,11 @@ public class KlibIrTextTestCaseGenerated extends AbstractKlibIrTextTestCase { runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @TestMetadata("kt16905.kt") public void testKt16905() throws Exception { runTest("compiler/testData/ir/irText/expressions/kt16905.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java index fff2fe04aab..845a228cd2b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsIrTextTestGenerated.java @@ -1438,6 +1438,12 @@ public class FirLightTreeJsIrTextTestGenerated extends AbstractFirLightTreeJsIrT runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1486,6 +1492,12 @@ public class FirLightTreeJsIrTextTestGenerated extends AbstractFirLightTreeJsIrT runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("kt16905.kt") public void testKt16905() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java index 8c4fbf3528b..6ff79363e80 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsIrTextTestGenerated.java @@ -1438,6 +1438,12 @@ public class FirPsiJsIrTextTestGenerated extends AbstractFirPsiJsIrTextTest { runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1486,6 +1492,12 @@ public class FirPsiJsIrTextTestGenerated extends AbstractFirPsiJsIrTextTest { runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("kt16905.kt") public void testKt16905() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java index efdde6805a9..5998db6eaf4 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/ClassicJsIrTextTestGenerated.java @@ -1438,6 +1438,12 @@ public class ClassicJsIrTextTestGenerated extends AbstractClassicJsIrTextTest { runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1486,6 +1492,12 @@ public class ClassicJsIrTextTestGenerated extends AbstractClassicJsIrTextTest { runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("kt16905.kt") public void testKt16905() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/ClassicNativeIrTextTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/ClassicNativeIrTextTestGenerated.java index 5c6d167cb3e..f5f2c4f31c4 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/ClassicNativeIrTextTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/ClassicNativeIrTextTestGenerated.java @@ -1438,6 +1438,12 @@ public class ClassicNativeIrTextTestGenerated extends AbstractClassicNativeIrTex runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1486,6 +1492,12 @@ public class ClassicNativeIrTextTestGenerated extends AbstractClassicNativeIrTex runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("kt16905.kt") public void testKt16905() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirLightTreeNativeIrTextTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirLightTreeNativeIrTextTestGenerated.java index 2be8c9e0581..fcf19682f55 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirLightTreeNativeIrTextTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirLightTreeNativeIrTextTestGenerated.java @@ -1438,6 +1438,12 @@ public class FirLightTreeNativeIrTextTestGenerated extends AbstractFirLightTreeN runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1486,6 +1492,12 @@ public class FirLightTreeNativeIrTextTestGenerated extends AbstractFirLightTreeN runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("kt16905.kt") public void testKt16905() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirPsiNativeIrTextTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirPsiNativeIrTextTestGenerated.java index 38fd2af1d66..0e98620ff4d 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirPsiNativeIrTextTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/irtext/FirPsiNativeIrTextTestGenerated.java @@ -1438,6 +1438,12 @@ public class FirPsiNativeIrTextTestGenerated extends AbstractFirPsiNativeIrTextT runTest("compiler/testData/ir/irText/expressions/genericPropertyRef.kt"); } + @Test + @TestMetadata("genericReceiverOnExtensionWithSmartcast.kt") + public void testGenericReceiverOnExtensionWithSmartcast() throws Exception { + runTest("compiler/testData/ir/irText/expressions/genericReceiverOnExtensionWithSmartcast.kt"); + } + @Test @TestMetadata("identity.kt") public void testIdentity() throws Exception { @@ -1486,6 +1492,12 @@ public class FirPsiNativeIrTextTestGenerated extends AbstractFirPsiNativeIrTextT runTest("compiler/testData/ir/irText/expressions/interfaceThisRef.kt"); } + @Test + @TestMetadata("intersectedSmartcastForExtensionReceiverWithSameConstructor.kt") + public void testIntersectedSmartcastForExtensionReceiverWithSameConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/intersectedSmartcastForExtensionReceiverWithSameConstructor.kt"); + } + @Test @TestMetadata("kt16905.kt") public void testKt16905() throws Exception {