FIR2IR: optimize override binding for Fir2IrLazySimpleFunction

This commit is contained in:
Mikhail Glukhikh
2021-02-20 12:55:29 +03:00
parent 5bdea9652b
commit cf830887ec
2 changed files with 24 additions and 2 deletions
@@ -124,6 +124,25 @@ class FakeOverrideGenerator(
return result
}
internal fun calcBaseSymbolsForFakeOverrideFunction(
klass: FirClass<*>,
fakeOverride: IrSimpleFunction,
originalSymbol: FirNamedFunctionSymbol,
) {
val scope = klass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
val classLookupTag = klass.symbol.toLookupTag()
val baseFirSymbolsForFakeOverride =
if (originalSymbol.shouldHaveComputedBaseSymbolsForClass(classLookupTag)) {
computeBaseSymbols(originalSymbol, FirTypeScope::getDirectOverriddenFunctions, scope, classLookupTag)
} else {
listOf(originalSymbol)
}
baseFunctionSymbols[fakeOverride] = baseFirSymbolsForFakeOverride
}
private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean =
fir.origin.fromSupertypes && dispatchReceiverClassOrNull() == classLookupTag
private inline fun <reified D : FirCallableMemberDeclaration<D>, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded(
klass: FirClass<*>,
irClass: IrClass,
@@ -149,7 +168,7 @@ class FakeOverrideGenerator(
val baseSymbol = originalSymbol.unwrapSubstitutionAndIntersectionOverrides() as S
val (fakeOverrideFirDeclaration, baseFirSymbolsForFakeOverride) = when {
originalSymbol.fir.origin.fromSupertypes && originalSymbol.dispatchReceiverClassOrNull() == classLookupTag -> {
originalSymbol.shouldHaveComputedBaseSymbolsForClass(classLookupTag) -> {
// Substitution or intersection case
// We have already a FIR declaration for such fake override
originalDeclaration to computeBaseSymbols(originalSymbol, computeDirectOverridden, scope, classLookupTag)
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.initialSignatureAttr
import org.jetbrains.kotlin.fir.originalIfFakeOverride
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
@@ -70,7 +71,9 @@ class Fir2IrLazySimpleFunction(
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
val parent = parent
if (isFakeOverride && parent is Fir2IrLazyClass) {
parent.declarations
fakeOverrideGenerator.calcBaseSymbolsForFakeOverrideFunction(
firParent, this, fir.symbol.originalIfFakeOverride()!!
)
fakeOverrideGenerator.getOverriddenSymbolsForFakeOverride(this)?.let { return@lazyVar it }
}
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage, fakeOverrideGenerator)