FIR2IR: optimize override binding for Fir2IrLazySimpleFunction
This commit is contained in:
+20
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user