[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 =
|
val incompatibility =
|
||||||
AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectSymbol, actualSymbol, context) ?: continue
|
AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectSymbol, actualSymbol, context) ?: continue
|
||||||
|
|
||||||
val reportOn = getTypealiasSymbolIfActualizedViaTypealias(expectSymbol) ?: actualSymbol
|
val reportOn = getTypealiasSymbolIfActualizedViaTypealias(expectSymbol)
|
||||||
|
?: getContainingActualClassIfFakeOverride(actualSymbol)
|
||||||
|
?: actualSymbol
|
||||||
diagnosticsReporter.reportActualAnnotationsNotMatchExpect(
|
diagnosticsReporter.reportActualAnnotationsNotMatchExpect(
|
||||||
incompatibility.expectSymbol as IrSymbol,
|
incompatibility.expectSymbol as IrSymbol,
|
||||||
incompatibility.actualSymbol as IrSymbol,
|
incompatibility.actualSymbol as IrSymbol,
|
||||||
@@ -60,10 +62,21 @@ internal class IrExpectActualAnnotationMatchingChecker(
|
|||||||
get() = (owner as IrDeclaration).isFakeOverride
|
get() = (owner as IrDeclaration).isFakeOverride
|
||||||
|
|
||||||
private fun getTypealiasSymbolIfActualizedViaTypealias(expectSymbol: IrSymbol): IrTypeAliasSymbol? {
|
private fun getTypealiasSymbolIfActualizedViaTypealias(expectSymbol: IrSymbol): IrTypeAliasSymbol? {
|
||||||
val expectDeclaration = expectSymbol.owner as IrDeclaration
|
val topLevelExpectClass = getContainingTopLevelClass(expectSymbol) ?: return null
|
||||||
val parentsWithSelf = sequenceOf(expectDeclaration) + expectDeclaration.parents
|
|
||||||
val topLevelExpectClass = parentsWithSelf.filterIsInstance<IrClass>().lastOrNull() ?: return null
|
|
||||||
val classId = topLevelExpectClass.classIdOrFail
|
val classId = topLevelExpectClass.classIdOrFail
|
||||||
return classActualizationInfo.actualTypeAliases[classId]
|
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 {
|
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)
|
// MODULE: m1-jvm()()(m1-common)
|
||||||
// FILE: jvm.kt
|
// FILE: jvm.kt
|
||||||
abstract class Parent<T> {
|
abstract class Parent<T> {
|
||||||
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>open fun foo(p: T) {}<!>
|
open fun foo(p: T) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class Intermediate : Parent<String>()
|
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()
|
actual class WithoutAnn : Intermediate()
|
||||||
|
|||||||
Reference in New Issue
Block a user