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 37048d2711a..019e322a834 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 @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.defaultType +import org.jetbrains.kotlin.ir.util.parentClassOrNull import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtBinaryExpression @@ -330,6 +331,17 @@ class Fir2IrVisitor( return callGenerator.convertToIrCall(qualifiedAccessExpression, qualifiedAccessExpression.typeRef, explicitReceiverExpression) } + // Note that this mimics psi2ir [StatementGenerator#isThisForClassPhysicallyAvailable]. + private fun isThisForClassPhysicallyAvailable(irClass: IrClass): Boolean { + var lastClass = conversionScope.lastClass() + while (lastClass != null) { + if (irClass == lastClass) return true + if (!lastClass.isInner) return false + lastClass = lastClass.parentClassOrNull + } + return false + } + override fun visitThisReceiverExpression(thisReceiverExpression: FirThisReceiverExpression, data: Any?): IrElement { val calleeReference = thisReceiverExpression.calleeReference val boundSymbol = calleeReference.boundSymbol @@ -337,11 +349,9 @@ class Fir2IrVisitor( // Object case val firClass = boundSymbol.fir as FirClass val irClass = classifierStorage.getCachedIrClass(firClass)!! - if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.classKind == ClassKind.OBJECT) { - if (irClass != conversionScope.lastClass()) { - return thisReceiverExpression.convertWithOffsets { startOffset, endOffset -> - IrGetObjectValueImpl(startOffset, endOffset, irClass.defaultType, irClass.symbol) - } + if (firClass.classKind == ClassKind.OBJECT && !isThisForClassPhysicallyAvailable(irClass)) { + return thisReceiverExpression.convertWithOffsets { startOffset, endOffset -> + IrGetObjectValueImpl(startOffset, endOffset, irClass.defaultType, irClass.symbol) } } diff --git a/compiler/testData/codegen/box/dataClasses/copy/copyInObjectNestedDataClass.kt b/compiler/testData/codegen/box/dataClasses/copy/copyInObjectNestedDataClass.kt index 915fb69f7ab..935389c50cb 100644 --- a/compiler/testData/codegen/box/dataClasses/copy/copyInObjectNestedDataClass.kt +++ b/compiler/testData/codegen/box/dataClasses/copy/copyInObjectNestedDataClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR class Bar(val name: String) abstract class Foo { diff --git a/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt b/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt index 1953b87b6d5..4c12585119f 100644 --- a/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt +++ b/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class A { X { val x = "OK" diff --git a/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass2.kt b/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass2.kt index 231fa4f22e9..958b0be830f 100644 --- a/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass2.kt +++ b/compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass2.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class A { X { val k = "K" diff --git a/compiler/testData/codegen/box/enum/innerClassInEnumEntryClass.kt b/compiler/testData/codegen/box/enum/innerClassInEnumEntryClass.kt index 868d95d1e4a..154e0a4539f 100644 --- a/compiler/testData/codegen/box/enum/innerClassInEnumEntryClass.kt +++ b/compiler/testData/codegen/box/enum/innerClassInEnumEntryClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class A { X { val x = "OK" diff --git a/compiler/testData/codegen/box/enum/innerClassMethodInEnumEntryClass.kt b/compiler/testData/codegen/box/enum/innerClassMethodInEnumEntryClass.kt index cbc042fe0d3..8e561ccd6d1 100644 --- a/compiler/testData/codegen/box/enum/innerClassMethodInEnumEntryClass.kt +++ b/compiler/testData/codegen/box/enum/innerClassMethodInEnumEntryClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class A { X { val x = "OK" diff --git a/compiler/testData/codegen/box/enum/kt7257_anonObjectInit.kt b/compiler/testData/codegen/box/enum/kt7257_anonObjectInit.kt index 5d94b58c85e..2cc9963d5c6 100644 --- a/compiler/testData/codegen/box/enum/kt7257_anonObjectInit.kt +++ b/compiler/testData/codegen/box/enum/kt7257_anonObjectInit.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class X { B { val value2 = "K" diff --git a/compiler/testData/codegen/box/enum/kt7257_anonObjectMethod.kt b/compiler/testData/codegen/box/enum/kt7257_anonObjectMethod.kt index 1f3e05f80f2..4f5e5ce5bda 100644 --- a/compiler/testData/codegen/box/enum/kt7257_anonObjectMethod.kt +++ b/compiler/testData/codegen/box/enum/kt7257_anonObjectMethod.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class X { B { val value2 = "K" diff --git a/compiler/testData/codegen/box/enum/kt7257_boundReference1.kt b/compiler/testData/codegen/box/enum/kt7257_boundReference1.kt index 5201df6b0df..02297ec3f33 100644 --- a/compiler/testData/codegen/box/enum/kt7257_boundReference1.kt +++ b/compiler/testData/codegen/box/enum/kt7257_boundReference1.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class X { B { val k = "K" diff --git a/compiler/testData/codegen/box/enum/kt9711_2.kt b/compiler/testData/codegen/box/enum/kt9711_2.kt index 6d5890d20d3..dcad91e092b 100644 --- a/compiler/testData/codegen/box/enum/kt9711_2.kt +++ b/compiler/testData/codegen/box/enum/kt9711_2.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class IssueState { FIXED { diff --git a/compiler/testData/codegen/box/ir/serializationRegressions/innerClassInEnumEntryClass.kt b/compiler/testData/codegen/box/ir/serializationRegressions/innerClassInEnumEntryClass.kt index 6d68ca2bc19..af6389de744 100644 --- a/compiler/testData/codegen/box/ir/serializationRegressions/innerClassInEnumEntryClass.kt +++ b/compiler/testData/codegen/box/ir/serializationRegressions/innerClassInEnumEntryClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // MODULE: lib // FILE: lib.kt diff --git a/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.fir.txt b/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.fir.txt index fe5321470b6..e5baa3eb6ba 100644 --- a/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.fir.txt +++ b/compiler/testData/ir/irText/expressions/enumEntryReferenceFromEnumEntryClass.fir.txt @@ -76,18 +76,18 @@ FILE fqName: fileName:/enumEntryReferenceFromEnumEntryClass.kt ANONYMOUS_INITIALIZER isStatic=false BLOCK_BODY CALL 'public final fun (: kotlin.Int): kotlin.Unit declared in .MyEnum.Z' type=kotlin.Unit origin=EQ - $this: GET_OBJECT 'CLASS ENUM_ENTRY name:Z modality:FINAL visibility:private superTypes:[.MyEnum]' type=.MyEnum.Z + $this: GET_VAR ': .MyEnum.Z declared in .MyEnum.Z' type=.MyEnum.Z origin=null : CONST Int type=kotlin.Int value=1 CALL 'public final fun foo (): kotlin.Unit declared in .MyEnum.Z' type=kotlin.Unit origin=null - $this: GET_OBJECT 'CLASS ENUM_ENTRY name:Z modality:FINAL visibility:private superTypes:[.MyEnum]' type=.MyEnum.Z + $this: GET_VAR ': .MyEnum.Z declared in .MyEnum.Z' type=.MyEnum.Z origin=null FUN name:test visibility:public modality:FINAL <> ($this:.MyEnum.Z.anObject.) returnType:kotlin.Unit $this: VALUE_PARAMETER name: type:.MyEnum.Z.anObject. BLOCK_BODY CALL 'public final fun (: kotlin.Int): kotlin.Unit declared in .MyEnum.Z' type=kotlin.Unit origin=EQ - $this: GET_OBJECT 'CLASS ENUM_ENTRY name:Z modality:FINAL visibility:private superTypes:[.MyEnum]' type=.MyEnum.Z + $this: GET_VAR ': .MyEnum.Z declared in .MyEnum.Z' type=.MyEnum.Z origin=null : CONST Int type=kotlin.Int value=1 CALL 'public final fun foo (): kotlin.Unit declared in .MyEnum.Z' type=kotlin.Unit origin=null - $this: GET_OBJECT 'CLASS ENUM_ENTRY name:Z modality:FINAL visibility:private superTypes:[.MyEnum]' type=.MyEnum.Z + $this: GET_VAR ': .MyEnum.Z declared in .MyEnum.Z' type=.MyEnum.Z origin=null 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 [operator] declared in kotlin.Any diff --git a/compiler/testData/ir/irText/singletons/enumEntry.fir.txt b/compiler/testData/ir/irText/singletons/enumEntry.fir.txt index ccde07f684c..751fe1a2ddf 100644 --- a/compiler/testData/ir/irText/singletons/enumEntry.fir.txt +++ b/compiler/testData/ir/irText/singletons/enumEntry.fir.txt @@ -29,7 +29,7 @@ FILE fqName: fileName:/enumEntry.kt $this: VALUE_PARAMETER name: type:.Z.ENTRY.A BLOCK_BODY CALL 'public final fun test (): kotlin.Unit declared in .Z.ENTRY' type=kotlin.Unit origin=null - $this: GET_OBJECT 'CLASS ENUM_ENTRY name:ENTRY modality:FINAL visibility:private superTypes:[.Z]' type=.Z.ENTRY + $this: GET_VAR ': .Z.ENTRY declared in .Z.ENTRY' type=.Z.ENTRY origin=null 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 [operator] declared in kotlin.Any