[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:
+25
-4
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user