diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt index ee5c7437324..067dec7349b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt @@ -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 + ): FirAnonymousInitializer { + if (anonymousInitializer.body is FirLazyBlock) { + val designation = FirDeclarationDesignation(data, anonymousInitializer) + FirLazyBodiesCalculator.calculateLazyBodyForAnonymousInitializer(designation) + } + return anonymousInitializer + } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt index 732e83d8c22..d47288c78b3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt @@ -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? = 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 ) { - 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) } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index f1d761ed521..c83b0d3ec1e 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1083,12 +1083,6 @@ open class RawFirBuilder( } } - override fun visitClassInitializer(initializer: KtClassInitializer, data: Unit?): FirElement { - return disabledLazyMode { - super.visitClassInitializer(initializer, data) - } - } - private fun convertContextReceivers(receivers: List): List { return receivers.map { contextReceiverElement -> buildContextReceiver { @@ -1746,7 +1740,7 @@ open class RawFirBuilder( source = initializer.toFirSourceElement() moduleData = baseModuleData origin = FirDeclarationOrigin.Source - body = initializer.body.toFirBlock() + body = buildOrLazyBlock { initializer.body.toFirBlock() } } } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt index 9f9547201e0..410d67a1b7f 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt @@ -4,8 +4,7 @@ FILE: constructorInObject.kt super() } - init { - } + init { LAZY_BLOCK } } public? final? enum class B : R|kotlin/Enum| { diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt index e9de670402f..6f5133c03a3 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt @@ -4,77 +4,6 @@ FILE: enums3.kt super() } - init { - local final? enum class Planet : R|kotlin/Enum| { - private constructor(m: Double, r: Double): R|C.Planet| { - super|>() - } - - public? final? val m: Double = R|/m| - public? get(): Double - - internal final? val r: Double = R|/r| - internal get(): Double - - public final static enum entry MERCURY: R|C.Planet| = object : R|C.Planet| { - private constructor(): R|| { - super(Double(1.0), Double(2.0)) - } - - public? open? override fun sayHello(): R|kotlin/Unit| { - println#(String(Hello!!!)) - } - - } - - public final static enum entry VENERA: R|C.Planet| = object : R|C.Planet| { - private constructor(): R|| { - super(Double(3.0), Double(4.0)) - } - - public? open? override fun sayHello(): R|kotlin/Unit| { - println#(String(Ola!!!)) - } - - } - - public final static enum entry EARTH: R|C.Planet| = object : R|C.Planet| { - private constructor(): R|| { - super(Double(5.0), Double(6.0)) - } - - public? open? override fun sayHello(): R|kotlin/Unit| { - println#(String(Privet!!!)) - } - - } - - public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#)) - public? get(): Double - - public? abstract fun sayHello(): R|kotlin/Unit| - - local final? companion object Companion : R|kotlin/Any| { - private constructor(): R|C.Planet.Companion| { - super() - } - - public? final? const val G: = Double(6.67E-11) - public? get(): - - } - - public final static fun values(): R|kotlin/Array| { - } - - public final static fun valueOf(value: R|kotlin/String|): R|C.Planet| { - } - - public final static val entries: R|kotlin/enums/EnumEntries| - public get(): R|kotlin/enums/EnumEntries| - - } - - } + init { LAZY_BLOCK } } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.lazyBodies.txt index 42e3e12fde8..d7a48452376 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.lazyBodies.txt @@ -4,21 +4,7 @@ FILE: initBlockWithDeclarations.kt super() } - init { - local final? class classInInit : R|kotlin/Any| { - public? constructor(): R|X.classInInit| { - super() - } - - public? final? fun funInClassInInit(): R|kotlin/Unit| { - } - - } - - local final? fun funInInit(): R|kotlin/Unit| { - } - - } + init { LAZY_BLOCK } } public? final? object : R|kotlin/Any| { @@ -26,20 +12,6 @@ FILE: initBlockWithDeclarations.kt super() } - init { - local final? class classInInit : R|kotlin/Any| { - public? constructor(): R|.classInInit| { - super() - } - - public? final? fun funInClassInInit(): R|kotlin/Unit| { - } - - } - - local final? fun funInInit(): R|kotlin/Unit| { - } - - } + init { LAZY_BLOCK } } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/init.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/init.lazyBodies.txt index 3c557658477..78995de4031 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/init.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/init.lazyBodies.txt @@ -7,8 +7,6 @@ FILE: init.kt public? final? val x: Int public? get(): Int - init { - this#.x# = x# - } + init { LAZY_BLOCK } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousInitializer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousInitializer.kt index ada3504d27d..af31199ed5b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousInitializer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirAnonymousInitializer.kt @@ -40,5 +40,7 @@ abstract class FirAnonymousInitializer : FirDeclaration(), FirControlFlowGraphOw abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) + abstract fun replaceBody(newBody: FirBlock?) + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirAnonymousInitializer } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousInitializerImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousInitializerImpl.kt index e2c7a131801..e3df161d581 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousInitializerImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirAnonymousInitializerImpl.kt @@ -63,4 +63,8 @@ internal class FirAnonymousInitializerImpl( override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { controlFlowGraphReference = newControlFlowGraphReference } + + override fun replaceBody(newBody: FirBlock?) { + body = newBody + } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index ad23a883459..0b8b5519efb 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -437,7 +437,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild } anonymousInitializer.configure { - +body(nullable = true) + +body(nullable = true, withReplace = true) +symbol("FirAnonymousInitializerSymbol") }