[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()
}
}