[IR] Fix incorrect position of reporting with fake overrides inside actual

^KT-60668
^KT-60936
This commit is contained in:
Roman Efremov
2023-07-26 16:23:31 +02:00
committed by Space Team
parent 58a30d524c
commit f1ea6545eb
3 changed files with 21 additions and 8 deletions
@@ -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<IrClass>().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<IrClass>().lastOrNull()
}
}
@@ -25,7 +25,7 @@ actual class FakeOverrideExpect : A() {
}
abstract class Intermediate : I {
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>override fun noAnnotationOnActual() {}<!>
override fun noAnnotationOnActual() {}
}
actual class <!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>FakeOverrideActual<!> : Intermediate(), I
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>actual class <!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>FakeOverrideActual<!> : Intermediate(), I<!>
@@ -14,11 +14,11 @@ expect class WithoutAnn {
// MODULE: m1-jvm()()(m1-common)
// FILE: jvm.kt
abstract class Parent<T> {
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>open fun foo(p: T) {}<!>
open fun foo(p: T) {}
}
abstract class Intermediate : Parent<String>()
actual class <!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>WithAnn<!> : Intermediate()
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>actual class <!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>WithAnn<!> : Intermediate()<!>
actual class WithoutAnn : Intermediate()