diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index aa601a45f43..bb06ac47521 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -57,6 +57,7 @@ class Fir2IrConverter( val irClass = registerClassAndNestedClasses(regularClass, parent) processClassAndNestedClassHeaders(regularClass) processClassMembers(regularClass, irClass) + bindFakeOverridesInClass(irClass) } fun processRegisteredLocalClassAndNestedClasses(regularClass: FirRegularClass, irClass: IrClass) { @@ -205,6 +206,25 @@ class Fir2IrConverter( return irClass } + fun bindFakeOverridesInFile(file: FirFile) { + val irFile = declarationStorage.getIrFile(file) + for (irDeclaration in irFile.declarations) { + if (irDeclaration is IrClass) { + bindFakeOverridesInClass(irDeclaration) + } + } + } + + fun bindFakeOverridesInClass(klass: IrClass) { + fakeOverrideGenerator.bindOverriddenSymbols(klass.declarations) + delegatedMemberGenerator.bindDelegatedMembersOverriddenSymbols(klass) + for (irDeclaration in klass.declarations) { + if (irDeclaration is IrClass) { + bindFakeOverridesInClass(irDeclaration) + } + } + } + private fun delegatedMembers(irClass: IrClass): List { return irClass.declarations.filter { it.origin == IrDeclarationOrigin.DELEGATED_MEMBER @@ -379,6 +399,9 @@ class Fir2IrConverter( for (firFile in allFirFiles) { converter.processFileAndClassMembers(firFile) } + for (firFile in allFirFiles) { + converter.bindFakeOverridesInFile(firFile) + } for (firFile in allFirFiles) { firFile.accept(fir2irVisitor, null) 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 6cb180a2aea..f652d77f5f4 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 @@ -116,6 +116,7 @@ class Fir2IrVisitor( classifierStorage.putEnumEntryClassInScope(enumEntry, correspondingClass) val anonymousObject = (enumEntry.initializer as FirAnonymousObjectExpression).anonymousObject converter.processAnonymousObjectMembers(anonymousObject, correspondingClass) + converter.bindFakeOverridesInClass(correspondingClass) conversionScope.withParent(correspondingClass) { conversionScope.withContainingFirClass(anonymousObject) { memberGenerator.convertClassContent(correspondingClass, anonymousObject) @@ -180,6 +181,7 @@ class Fir2IrVisitor( val irAnonymousObject = classifierStorage.getCachedIrClass(anonymousObject)?.apply { this.parent = irParent } ?: classifierStorage.createIrAnonymousObject(anonymousObject, irParent = irParent) converter.processAnonymousObjectMembers(anonymousObject, irAnonymousObject) + converter.bindFakeOverridesInClass(irAnonymousObject) conversionScope.withParent(irAnonymousObject) { conversionScope.withContainingFirClass(anonymousObject) { memberGenerator.convertClassContent(irAnonymousObject, anonymousObject) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index d167c209d90..1c443910504 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -68,8 +68,6 @@ internal class ClassMemberGenerator( convertFunctionContent(irPrimaryConstructor, primaryConstructor, containingClass = klass) } } - fakeOverrideGenerator.bindOverriddenSymbols(irClass.declarations) - components.delegatedMemberGenerator.bindDelegatedMembersOverriddenSymbols(irClass) allDeclarations.forEach { declaration -> when { diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceDefaultImplStubs.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceDefaultImplStubs.kt index 3f2afe05dc5..9af9e905a0f 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceDefaultImplStubs.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceDefaultImplStubs.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND_FIR: JVM_IR // FILE: test.kt fun box(): String { diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceJvmDefaultImplStubs.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceJvmDefaultImplStubs.kt index c6e344b8c4b..c531ce8ef97 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceJvmDefaultImplStubs.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/interfaceJvmDefaultImplStubs.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND_FIR: JVM_IR // !JVM_DEFAULT_MODE: enable // JVM_TARGET: 1.8 // FILE: test.kt diff --git a/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.fir.ir.txt b/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.fir.ir.txt index 9d22b7d67e4..9610a0e7e23 100644 --- a/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.fir.ir.txt +++ b/compiler/testData/ir/irText/types/smartCastOnFakeOverrideReceiver.fir.ir.txt @@ -30,7 +30,7 @@ FILE fqName: fileName:/smartCastOnFakeOverrideReceiver.kt BRANCH if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=.B GET_VAR 'x: kotlin.Any declared in .A.testA1' type=kotlin.Any origin=null - then: CALL 'public final fun f (): kotlin.Int declared in .A' type=kotlin.Int origin=null + then: CALL 'public final fun f (): kotlin.Int [fake_override] declared in .B' type=kotlin.Int origin=null $this: TYPE_OP type=.B origin=IMPLICIT_CAST typeOperand=.B GET_VAR 'x: kotlin.Any declared in .A.testA1' type=kotlin.Any origin=null BRANCH @@ -45,7 +45,7 @@ FILE fqName: fileName:/smartCastOnFakeOverrideReceiver.kt BRANCH if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=.B GET_VAR 'x: kotlin.Any declared in .A.testA2' type=kotlin.Any origin=null - then: CALL 'public final fun (): kotlin.Int declared in .A' type=kotlin.Int origin=GET_PROPERTY + then: CALL 'public final fun (): kotlin.Int [fake_override] declared in .B' type=kotlin.Int origin=GET_PROPERTY $this: TYPE_OP type=.B origin=IMPLICIT_CAST typeOperand=.B GET_VAR 'x: kotlin.Any declared in .A.testA2' type=kotlin.Any origin=null BRANCH