diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt index 317cc3eb0c6..318321e4287 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt @@ -112,6 +112,10 @@ class FirJavaField @FirImplementationDetail constructor( return this } + override fun replaceInitializer(newInitializer: FirExpression?) { + initializer = newInitializer + } + override fun transformTypeParameters(transformer: FirTransformer, data: D): FirField { typeParameters.transformInplace(transformer, data) return this 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 d8f23901add..497ed79ab6e 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 @@ -1194,9 +1194,15 @@ class RawFirBuilder( val propertyType = typeReference.toFirOrImplicitType() val propertyName = nameAsSafeName val isVar = isVar - val propertyInitializer = if (hasInitializer()) { - { initializer }.toFirExpression("Should have initializer") - } else null + val propertyInitializer = when { + !hasInitializer() -> null + lazyBodiesMode -> buildLazyExpression { + source = initializer?.toFirSourceElement() + } + else -> { + { initializer }.toFirExpression("Should have initializer") + } + } val delegateExpression by lazy { delegate?.expression } val propertySource = toFirSourceElement() diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt index b7766eb109a..64bec678f9f 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt @@ -51,5 +51,5 @@ FILE: annotation.kt } @base() public? final? fun foo(@base() y: @base() Int): Int { LAZY_BLOCK } - @base() public? final? val z: = IntegerLiteral(0) + @base() public? final? val z: = LAZY_EXPRESSION public? get(): 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 cc7128cace8..7fdfe8883b6 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 @@ -44,11 +44,5 @@ FILE: constructorInObject.kt } } - public? final? val anonObject: = object : R|kotlin/Any| { - public? constructor(): R|| { - super() - } - - } - + public? final? val anonObject: = LAZY_EXPRESSION public? get(): diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.lazyBodies.txt index 47194821a14..2c7e49b7cd4 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.lazyBodies.txt @@ -4,7 +4,7 @@ FILE: propertyAccessorsContractDescription.kt super() } - public? final? var myInt: Int = IntegerLiteral(0) + public? final? var myInt: Int = LAZY_EXPRESSION public? get(): Int [Contract description] < returnsNotNull#() @@ -18,7 +18,7 @@ FILE: propertyAccessorsContractDescription.kt super() } - public? final? var anotherInt: Int = IntegerLiteral(0) + public? final? var anotherInt: Int = LAZY_EXPRESSION public? get(): Int [Contract description] < returnsNotNull#() @@ -36,7 +36,7 @@ FILE: propertyAccessorsContractDescription.kt super() } - public? final? var someInt: Int = IntegerLiteral(0) + public? final? var someInt: Int = LAZY_EXPRESSION public? get(): Int [Contract description] < returnsNotNull#() diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.lazyBodies.txt index 93c3e8b469e..24e5a6dedcf 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.lazyBodies.txt @@ -1,7 +1,7 @@ FILE: contractDescription.kt public? final? fun test_1(): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun test_2(): R|kotlin/Unit| { LAZY_BLOCK } - public? final? var test_3: Int = IntegerLiteral(1) + public? final? var test_3: Int = LAZY_EXPRESSION public? get(): Int { LAZY_BLOCK } public? set(value: Int): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun test_4(): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt index a7f034702bf..eaddd535657 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt @@ -52,7 +52,7 @@ FILE: enums.kt } - public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#)) + public? final? val g: Double = LAZY_EXPRESSION public? get(): Double public? abstract fun sayHello(): R|kotlin/Unit| @@ -62,7 +62,7 @@ FILE: enums.kt super() } - public? final? const val G: = Double(6.67E-11) + public? final? const val G: = LAZY_EXPRESSION public? get(): } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.lazyBodies.txt index 07e22009056..3a34e54de60 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.lazyBodies.txt @@ -15,5 +15,5 @@ FILE: expectActual.kt } public? final? actual fun foo(): { LAZY_BLOCK } - public? final? actual val x: = IntegerLiteral(42) + public? final? actual val x: = LAZY_EXPRESSION public? get(): diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.lazyBodies.txt index ed8b14e3162..3287f2e9bbe 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.lazyBodies.txt @@ -11,7 +11,7 @@ FILE: simpleClass.kt super<>() } - private final? val baz: = IntegerLiteral(42) + private final? val baz: = LAZY_EXPRESSION private get(): public? open? override fun foo(x: Int, y: String): String { LAZY_BLOCK } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.lazyBodies.txt index 066ceaaeb17..d49f63d3ce9 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.lazyBodies.txt @@ -1,5 +1,5 @@ FILE: arrayAccess.kt - public? final? val p: = IntegerLiteral(0) + public? final? val p: = LAZY_EXPRESSION public? get(): public? final? fun foo(): { LAZY_BLOCK } public? final? class Wrapper : R|kotlin/Any| { diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/callableReferences.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/callableReferences.lazyBodies.txt index 3b3653dfbd7..18ec82e243f 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/callableReferences.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/callableReferences.lazyBodies.txt @@ -6,25 +6,25 @@ FILE: callableReferences.kt public? final? fun foo(): R|kotlin/Unit| { LAZY_BLOCK } - public? final? val bar: = IntegerLiteral(0) + public? final? val bar: = LAZY_EXPRESSION public? get(): } public? final? fun A.qux(): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun baz(): R|kotlin/Unit| { LAZY_BLOCK } - public? final? val test1: = A#()::foo# + public? final? val test1: = LAZY_EXPRESSION public? get(): - public? final? val test2: = A#()::bar# + public? final? val test2: = LAZY_EXPRESSION public? get(): - public? final? val test3: = A#()::qux# + public? final? val test3: = LAZY_EXPRESSION public? get(): - public? final? val test4: = A#::foo# + public? final? val test4: = LAZY_EXPRESSION public? get(): - public? final? val test5: = A#::bar# + public? final? val test5: = LAZY_EXPRESSION public? get(): - public? final? val test6: = A#::qux# + public? final? val test6: = LAZY_EXPRESSION public? get(): - public? final? val test7: = ::baz# + public? final? val test7: = LAZY_EXPRESSION public? get(): - public? final? val test8: = A#?::foo# + public? final? val test8: = LAZY_EXPRESSION public? get(): diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambda.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambda.lazyBodies.txt index b87bd642bc6..19adef109f1 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambda.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambda.lazyBodies.txt @@ -21,13 +21,7 @@ FILE: lambda.kt public? final? fun foo(): Int { LAZY_BLOCK } public? final? fun bar(): Int { LAZY_BLOCK } public? final? fun test(list: List): R|kotlin/Unit| { LAZY_BLOCK } - public? final? val simple: = fun .(): { - ^ Unit - } - + public? final? val simple: = LAZY_EXPRESSION public? get(): - public? final? val another: = fun .(): { - IntegerLiteral(42) - } - + public? final? val another: = LAZY_EXPRESSION public? get(): diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt index 5016310348f..c90a4dc95ac 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirEnumEntry.kt @@ -51,6 +51,8 @@ abstract class FirEnumEntry : FirVariable(), FirCallableMemberDecl abstract override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) + abstract override fun replaceInitializer(newInitializer: FirExpression?) + abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirEnumEntry abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirEnumEntry diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorProperty.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorProperty.kt index b24fbf28a95..5110b8f2faa 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorProperty.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirErrorProperty.kt @@ -51,6 +51,8 @@ abstract class FirErrorProperty : FirVariable(), FirDiagnostic abstract override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) + abstract override fun replaceInitializer(newInitializer: FirExpression?) + abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirErrorProperty abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirErrorProperty diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirField.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirField.kt index 24c5705a8bb..991542c898d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirField.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirField.kt @@ -51,6 +51,8 @@ abstract class FirField : FirVariable(), FirTypeParametersOwner, FirCa abstract override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) + abstract override fun replaceInitializer(newInitializer: FirExpression?) + abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirField abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirField diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt index 504324aeb91..1e339d96b55 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirProperty.kt @@ -56,6 +56,8 @@ abstract class FirProperty : FirVariable(), FirTypeParametersOwner, abstract override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) + abstract override fun replaceInitializer(newInitializer: FirExpression?) + abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirProperty diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt index 465a49835f7..3d57a8e095e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirValueParameter.kt @@ -53,6 +53,8 @@ abstract class FirValueParameter : FirVariable(), FirControlF abstract override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) + abstract override fun replaceInitializer(newInitializer: FirExpression?) + abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirValueParameter diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirVariable.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirVariable.kt index 1051964985c..538913ae668 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirVariable.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirVariable.kt @@ -49,6 +49,8 @@ abstract class FirVariable> : FirPureAbstractElement(), FirCa abstract override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) + abstract fun replaceInitializer(newInitializer: FirExpression?) + abstract override fun transformReturnTypeRef(transformer: FirTransformer, data: D): FirVariable abstract override fun transformReceiverTypeRef(transformer: FirTransformer, data: D): FirVariable diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt index 9269c163cec..9e071dcdb41 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt @@ -133,6 +133,10 @@ internal class FirDefaultSetterValueParameter( receiverTypeRef = newReceiverTypeRef } + override fun replaceInitializer(newInitializer: FirExpression?) { + initializer = newInitializer + } + override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { controlFlowGraphReference = newControlFlowGraphReference } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt index e654fc45a53..edbaf81878c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt @@ -128,4 +128,8 @@ internal class FirEnumEntryImpl( } override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {} + + override fun replaceInitializer(newInitializer: FirExpression?) { + initializer = newInitializer + } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt index 262df618bb2..deb81d0fdc7 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirErrorPropertyImpl.kt @@ -117,4 +117,6 @@ internal class FirErrorPropertyImpl( } override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {} + + override fun replaceInitializer(newInitializer: FirExpression?) {} } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt index 7cb4c4030fd..b8303e6a7b0 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFieldImpl.kt @@ -125,4 +125,6 @@ internal class FirFieldImpl( } override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {} + + override fun replaceInitializer(newInitializer: FirExpression?) {} } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt index 97f30e49811..ed8211a96b3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyImpl.kt @@ -151,6 +151,10 @@ internal class FirPropertyImpl( receiverTypeRef = newReceiverTypeRef } + override fun replaceInitializer(newInitializer: FirExpression?) { + initializer = newInitializer + } + override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { controlFlowGraphReference = newControlFlowGraphReference } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt index c98c5d47117..21beb4f08a6 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt @@ -117,6 +117,8 @@ open class FirValueParameterImpl @FirImplementationDetail constructor( override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {} + override fun replaceInitializer(newInitializer: FirExpression?) {} + override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { controlFlowGraphReference = newControlFlowGraphReference } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt index 2ec6f000636..39071d28e9c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/synthetic/FirSyntheticProperty.kt @@ -141,4 +141,8 @@ class FirSyntheticProperty( override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { throw AssertionError("Mutation of synthetic property isn't supported") } + + override fun replaceInitializer(newInitializer: FirExpression?) { + throw AssertionError("Mutation of synthetic property isn't supported") + } } \ No newline at end of file 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 b1ce5dcf9fe..ac99a70324b 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 @@ -368,7 +368,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild parentArg(callableDeclaration, "F", "F") +name +symbol("FirVariableSymbol", "F") - +initializer.withTransform() + +initializer.withTransform().withReplace() +field("delegate", expression, nullable = true).withTransform() +field("delegateFieldSymbol", delegateFieldSymbolType, "F", nullable = true) generateBooleanFields("var", "val") diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt index 45e8c4a8f04..529f8d22178 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/ElementUtils.kt @@ -92,4 +92,8 @@ fun Field.withTransform(needTransformInOtherChildren: Boolean = false): Field = this.needTransformInOtherChildren = needTransformInOtherChildren } +fun Field.withReplace(): Field = copy().apply { + withReplace = true +} + fun FieldSet.withTransform(): FieldSet = this.map { it.withTransform() } \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyBodiesCalculator.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyBodiesCalculator.kt index 5511312b927..bd500b5914d 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyBodiesCalculator.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyBodiesCalculator.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock +import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirTransformer @@ -48,7 +49,7 @@ internal object FirLazyBodiesCalculator { } fun calculateLazyBodyForProperty(firProperty: FirProperty) { - if (firProperty.getter?.body !is FirLazyBlock && firProperty.setter?.body !is FirLazyBlock) return + if (!needCalculatingLazyBodyForProperty(firProperty)) return val rawFirBuilder = createRawFirBuilder(firProperty) val newProperty = rawFirBuilder.buildPropertyWithBody(firProperty.psi as KtProperty) @@ -63,9 +64,17 @@ internal object FirLazyBodiesCalculator { setter.replaceBody(newSetter.body) setter.replaceContractDescription(newSetter.contractDescription) } + if (firProperty.initializer is FirLazyExpression) { + firProperty.replaceInitializer(newProperty.initializer) + } } } + fun needCalculatingLazyBodyForProperty(firProperty: FirProperty): Boolean = + firProperty.getter?.body is FirLazyBlock + || firProperty.setter?.body is FirLazyBlock + || firProperty.initializer is FirLazyExpression + private fun createRawFirBuilder(firDeclaration: FirDeclaration): RawFirBuilder { val scopeProvider = firDeclaration.session.firIdeProvider.kotlinScopeProvider @@ -98,8 +107,9 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer() { } override fun transformProperty(property: FirProperty, data: Nothing?): CompositeTransformResult { - if (property.getter?.body is FirLazyBlock || property.setter?.body is FirLazyBlock) { + if (FirLazyBodiesCalculator.needCalculatingLazyBodyForProperty(property)) { FirLazyBodiesCalculator.calculateLazyBodyForProperty(property) + return property.compose() } return super.transformProperty(property, data) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/classMembers.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/classMembers.txt index b72e29609b4..cb9d229675e 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/classMembers.txt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/classMembers.txt @@ -8,6 +8,9 @@ FILE: classMembers.kt this@R|/A|.R|/A.receive|(this@R|/A|.R|/A.functionWithLazyBody|()) } + public final [STATUS] val x: R|kotlin/Int| = LAZY_EXPRESSION + public get(): R|kotlin/Int| { LAZY_BLOCK } + public final [STATUS] fun receive(value: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } public final [STATUS] fun functionWithLazyBody(): R|kotlin/String| { LAZY_BLOCK } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithGetterAndSetter.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithGetterAndSetter.txt index ff072b83c8b..fab22f04a03 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithGetterAndSetter.txt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithGetterAndSetter.txt @@ -4,6 +4,6 @@ FILE: propertyWithGetterAndSetter.kt R|/withGetterAndSetter| = Int(123) } public final [STATUS] fun receive(value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK } - public final [STATUS] var withGetterAndSetter: R|kotlin/Int| = IntegerLiteral(42) + public final [STATUS] var withGetterAndSetter: R|kotlin/Int| = LAZY_EXPRESSION public get(): R|kotlin/Int| { LAZY_BLOCK } public set(value: R|kotlin/Int|): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.kt new file mode 100644 index 00000000000..ab004f562e6 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.kt @@ -0,0 +1,5 @@ +fun resolveMe() { + receive(property) +} + +val property: Int = 10 \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.txt new file mode 100644 index 00000000000..247d1b02a92 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.txt @@ -0,0 +1,6 @@ +FILE: propertyWithInitializer.kt + public final [BODY_RESOLVE] fun resolveMe(): R|kotlin/Unit| { + #(R|/property|) + } + public final [STATUS] val property: R|kotlin/Int| = LAZY_EXPRESSION + public get(): R|kotlin/Int| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyDeclarationResolveTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyDeclarationResolveTestGenerated.java index 1639a1bc68b..a48f359a3e0 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyDeclarationResolveTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyDeclarationResolveTestGenerated.java @@ -43,6 +43,11 @@ public class FirLazyDeclarationResolveTestGenerated extends AbstractFirLazyDecla runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithGetterAndSetter.kt"); } + @TestMetadata("propertyWithInitializer.kt") + public void testPropertyWithInitializer() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/propertyWithInitializer.kt"); + } + @TestMetadata("secondaryConstructor.kt") public void testSecondaryConstructor() throws Exception { runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/lazyResolve/secondaryConstructor.kt");