[FIR2IR] Use deepest matching symbol on fake override calls

This commit is contained in:
simon.ogorodnik
2020-04-09 22:33:36 +03:00
parent d55c6550bb
commit 7a1ecabe0a
@@ -108,9 +108,7 @@ fun FirReference.toSymbol(
is FirResolvedNamedReference -> {
when (val resolvedSymbol = resolvedSymbol) {
is FirCallableSymbol<*> -> {
val originalCallableSymbol =
resolvedSymbol.overriddenSymbol?.takeIf { it.callableId == resolvedSymbol.callableId } ?: resolvedSymbol
originalCallableSymbol.toSymbol(declarationStorage, preferGetter)
resolvedSymbol.deepestMatchingOverriddenSymbol().toSymbol(declarationStorage, preferGetter)
}
is FirClassifierSymbol<*> -> {
resolvedSymbol.toSymbol(session, classifierStorage)
@@ -249,6 +247,11 @@ internal tailrec fun FirCallableSymbol<*>.deepestOverriddenSymbol(): FirCallable
return overriddenSymbol.deepestOverriddenSymbol()
}
internal tailrec fun FirCallableSymbol<*>.deepestMatchingOverriddenSymbol(root: FirCallableSymbol<*> = this): FirCallableSymbol<*> {
val overriddenSymbol = overriddenSymbol?.takeIf { it.callableId == root.callableId } ?: return this
return overriddenSymbol.deepestMatchingOverriddenSymbol(this)
}
private val nameToOperationConventionOrigin = mutableMapOf(
OperatorNameConventions.PLUS to IrStatementOrigin.PLUS,
OperatorNameConventions.MINUS to IrStatementOrigin.MINUS,