[FIR] Make anonymous initializer lazy in RawFirBuilder

Fourth step for KT-52615

Merge-request: KT-MR-7798
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2022-11-25 11:41:44 +00:00
committed by Space Team
parent a454d42e65
commit d585f068dd
10 changed files with 43 additions and 124 deletions
@@ -21,10 +21,7 @@ import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtSecondaryConstructor
import org.jetbrains.kotlin.psi.*
internal object FirLazyBodiesCalculator {
fun calculateLazyBodiesInside(designation: FirDeclarationDesignation) {
@@ -133,6 +130,20 @@ internal object FirLazyBodiesCalculator {
}
}
fun calculateLazyBodyForAnonymousInitializer(designation: FirDeclarationDesignation) {
val initializer = designation.declaration as FirAnonymousInitializer
require(initializer.body is FirLazyBlock)
val newInitializer = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind(
session = initializer.moduleData.session,
scopeProvider = initializer.moduleData.session.kotlinScopeProvider,
designation = designation,
rootNonLocalDeclaration = initializer.psi as KtAnonymousInitializer,
) as FirAnonymousInitializer
initializer.apply {
replaceBody(newInitializer.body)
}
}
fun needCalculatingLazyBodyForProperty(firProperty: FirProperty): Boolean =
firProperty.getter?.body is FirLazyBlock
|| firProperty.setter?.body is FirLazyBlock
@@ -202,4 +213,14 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
}
return enumEntry
}
override fun transformAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer, data: PersistentList<FirDeclaration>
): FirAnonymousInitializer {
if (anonymousInitializer.body is FirLazyBlock) {
val designation = FirDeclarationDesignation(data, anonymousInitializer)
FirLazyBodiesCalculator.calculateLazyBodyForAnonymousInitializer(designation)
}
return anonymousInitializer
}
}
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
internal class RawFirNonLocalDeclarationBuilder private constructor(
session: FirSession,
baseScopeProvider: FirScopeProvider,
private val originalDeclaration: FirTypeParameterRefsOwner,
private val originalDeclarationIfParamertized: FirTypeParameterRefsOwner?,
private val declarationToBuild: KtDeclaration,
private val functionsToRebind: Set<FirFunction>? = null,
private val replacementApplier: RawFirReplacement.Applier? = null
@@ -45,7 +45,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
val builder = RawFirNonLocalDeclarationBuilder(
session = session,
baseScopeProvider = scopeProvider,
originalDeclaration = designation.declaration as FirTypeParameterRefsOwner,
originalDeclarationIfParamertized = designation.declaration as? FirTypeParameterRefsOwner,
declarationToBuild = rootNonLocalDeclaration,
replacementApplier = replacementApplier
)
@@ -70,7 +70,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
val builder = RawFirNonLocalDeclarationBuilder(
session = session,
baseScopeProvider = scopeProvider,
originalDeclaration = designation.declaration as FirTypeParameterRefsOwner,
originalDeclarationIfParamertized = designation.declaration as? FirTypeParameterRefsOwner,
declarationToBuild = rootNonLocalDeclaration,
functionsToRebind = functionsToRebind,
)
@@ -89,8 +89,8 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
declarationSource: KtSourceElement?,
currentFirTypeParameters: List<FirTypeParameterRef>
) {
if (declarationSource?.psi == originalDeclaration.psi) {
super.addCapturedTypeParameters(status, declarationSource, originalDeclaration.typeParameters)
if (originalDeclarationIfParamertized != null && declarationSource?.psi == originalDeclarationIfParamertized.psi) {
super.addCapturedTypeParameters(status, declarationSource, originalDeclarationIfParamertized.typeParameters)
} else {
super.addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters)
}