[IR] Fix incorrect position of reporting with fake overrides inside actual
^KT-60668 ^KT-60936
This commit is contained in:
committed by
Space Team
parent
58a30d524c
commit
f1ea6545eb
+17
-4
@@ -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()
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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<!>
|
||||
|
||||
+2
-2
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user