FIR2IR: optimize override binding for Fir2IrLazySimpleFunction
This commit is contained in:
+20
-1
@@ -124,6 +124,25 @@ class FakeOverrideGenerator(
|
|||||||
return result
|
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(
|
private inline fun <reified D : FirCallableMemberDeclaration<D>, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded(
|
||||||
klass: FirClass<*>,
|
klass: FirClass<*>,
|
||||||
irClass: IrClass,
|
irClass: IrClass,
|
||||||
@@ -149,7 +168,7 @@ class FakeOverrideGenerator(
|
|||||||
val baseSymbol = originalSymbol.unwrapSubstitutionAndIntersectionOverrides() as S
|
val baseSymbol = originalSymbol.unwrapSubstitutionAndIntersectionOverrides() as S
|
||||||
|
|
||||||
val (fakeOverrideFirDeclaration, baseFirSymbolsForFakeOverride) = when {
|
val (fakeOverrideFirDeclaration, baseFirSymbolsForFakeOverride) = when {
|
||||||
originalSymbol.fir.origin.fromSupertypes && originalSymbol.dispatchReceiverClassOrNull() == classLookupTag -> {
|
originalSymbol.shouldHaveComputedBaseSymbolsForClass(classLookupTag) -> {
|
||||||
// Substitution or intersection case
|
// Substitution or intersection case
|
||||||
// We have already a FIR declaration for such fake override
|
// We have already a FIR declaration for such fake override
|
||||||
originalDeclaration to computeBaseSymbols(originalSymbol, computeDirectOverridden, scope, classLookupTag)
|
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.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.initialSignatureAttr
|
import org.jetbrains.kotlin.fir.initialSignatureAttr
|
||||||
|
import org.jetbrains.kotlin.fir.originalIfFakeOverride
|
||||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
|
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
|
||||||
@@ -70,7 +71,9 @@ class Fir2IrLazySimpleFunction(
|
|||||||
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
|
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
|
||||||
val parent = parent
|
val parent = parent
|
||||||
if (isFakeOverride && parent is Fir2IrLazyClass) {
|
if (isFakeOverride && parent is Fir2IrLazyClass) {
|
||||||
parent.declarations
|
fakeOverrideGenerator.calcBaseSymbolsForFakeOverrideFunction(
|
||||||
|
firParent, this, fir.symbol.originalIfFakeOverride()!!
|
||||||
|
)
|
||||||
fakeOverrideGenerator.getOverriddenSymbolsForFakeOverride(this)?.let { return@lazyVar it }
|
fakeOverrideGenerator.getOverriddenSymbolsForFakeOverride(this)?.let { return@lazyVar it }
|
||||||
}
|
}
|
||||||
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage, fakeOverrideGenerator)
|
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage, fakeOverrideGenerator)
|
||||||
|
|||||||
Reference in New Issue
Block a user