From f1ea6545eb0f5f77f17ec7bfa4fbfd88916277d4 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Wed, 26 Jul 2023 16:23:31 +0200 Subject: [PATCH] [IR] Fix incorrect position of reporting with fake overrides inside actual ^KT-60668 ^KT-60936 --- ...IrExpectActualAnnotationMatchingChecker.kt | 21 +++++++++++++++---- .../annotationMatching/fakeOverrides.fir.kt | 4 ++-- .../substitutionOverrideInTwoClasses.fir.kt | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt index 104fb3e53e5..d950b38e94a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualAnnotationMatchingChecker.kt @@ -46,7 +46,9 @@ internal class IrExpectActualAnnotationMatchingChecker( val incompatibility = AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectSymbol, actualSymbol, context) ?: continue - val reportOn = getTypealiasSymbolIfActualizedViaTypealias(expectSymbol) ?: actualSymbol + val reportOn = getTypealiasSymbolIfActualizedViaTypealias(expectSymbol) + ?: getContainingActualClassIfFakeOverride(actualSymbol) + ?: actualSymbol diagnosticsReporter.reportActualAnnotationsNotMatchExpect( incompatibility.expectSymbol as IrSymbol, incompatibility.actualSymbol as IrSymbol, @@ -60,10 +62,21 @@ internal class IrExpectActualAnnotationMatchingChecker( get() = (owner as IrDeclaration).isFakeOverride private fun getTypealiasSymbolIfActualizedViaTypealias(expectSymbol: IrSymbol): IrTypeAliasSymbol? { - val expectDeclaration = expectSymbol.owner as IrDeclaration - val parentsWithSelf = sequenceOf(expectDeclaration) + expectDeclaration.parents - val topLevelExpectClass = parentsWithSelf.filterIsInstance().lastOrNull() ?: return null + val topLevelExpectClass = getContainingTopLevelClass(expectSymbol) ?: return null val classId = topLevelExpectClass.classIdOrFail return classActualizationInfo.actualTypeAliases[classId] } + + private fun getContainingActualClassIfFakeOverride(actualSymbol: IrSymbol): IrSymbol? { + if (!actualSymbol.isFakeOverride) { + return null + } + return getContainingTopLevelClass(actualSymbol)?.symbol + } + + private fun getContainingTopLevelClass(symbol: IrSymbol): IrClass? { + val declaration = symbol.owner as IrDeclaration + val parentsWithSelf = sequenceOf(declaration) + declaration.parents + return parentsWithSelf.filterIsInstance().lastOrNull() + } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.fir.kt index 90a6eb2ffee..e53379cda2d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/fakeOverrides.fir.kt @@ -25,7 +25,7 @@ actual class FakeOverrideExpect : A() { } abstract class Intermediate : I { - override fun noAnnotationOnActual() {} + override fun noAnnotationOnActual() {} } -actual class FakeOverrideActual : Intermediate(), I +actual class FakeOverrideActual : Intermediate(), I diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/substitutionOverrideInTwoClasses.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/substitutionOverrideInTwoClasses.fir.kt index de586324a11..9dce5ad1acd 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/substitutionOverrideInTwoClasses.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/substitutionOverrideInTwoClasses.fir.kt @@ -14,11 +14,11 @@ expect class WithoutAnn { // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt abstract class Parent { - open fun foo(p: T) {} + open fun foo(p: T) {} } abstract class Intermediate : Parent() -actual class WithAnn : Intermediate() +actual class WithAnn : Intermediate() actual class WithoutAnn : Intermediate()