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 a2b647875b8..0b06e39b0ad 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 @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.declarations.utils.getExplicitBackingField import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock @@ -92,6 +92,11 @@ internal object FirLazyBodiesCalculator { firProperty.replaceInitializer(newProperty.initializer) } + firProperty.getExplicitBackingField()?.takeIf { it.initializer is FirLazyExpression }?.let { backingField -> + val newInitializer = newProperty.getExplicitBackingField()?.initializer + backingField.replaceInitializer(newInitializer) + } + val delegate = firProperty.delegate as? FirWrappedDelegateExpression val delegateExpression = delegate?.expression if (delegateExpression is FirLazyExpression) { @@ -114,6 +119,7 @@ internal object FirLazyBodiesCalculator { || firProperty.setter?.body is FirLazyBlock || firProperty.initializer is FirLazyExpression || (firProperty.delegate as? FirWrappedDelegateExpression)?.expression is FirLazyExpression + || firProperty.getExplicitBackingField()?.initializer is FirLazyExpression } private object FirLazyBodiesCalculatorTransformer : FirTransformer>() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java index 2b4778dcaec..c338ba171d1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java @@ -165,6 +165,18 @@ public class FirLazyBodiesCalculatorTestGenerated extends AbstractFirLazyBodiesC runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt"); } + @Test + @TestMetadata("propertyWithBackingField.kt") + public void testPropertyWithBackingField() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt"); + } + + @Test + @TestMetadata("propertyWithBackingFieldDifferentTypes.kt") + public void testPropertyWithBackingFieldDifferentTypes() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt"); + } + @Test @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { diff --git a/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java b/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java index 5bc66151416..3f62ab6781c 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java +++ b/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java @@ -151,6 +151,16 @@ public class LightTree2FirConverterTestCaseGenerated extends AbstractLightTree2F runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt"); } + @TestMetadata("propertyWithBackingField.kt") + public void testPropertyWithBackingField() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt"); + } + + @TestMetadata("propertyWithBackingFieldDifferentTypes.kt") + public void testPropertyWithBackingFieldDifferentTypes() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt"); + } + @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.kt"); diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt new file mode 100644 index 00000000000..99c696ed252 --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt @@ -0,0 +1,8 @@ +fun resolveMe() { + receive(property) +} + +val property: Int + field: Int = 10 + +fun receive(s: Int) {} diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.lazyBodies.txt new file mode 100644 index 00000000000..12ff6e4e98a --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.lazyBodies.txt @@ -0,0 +1,6 @@ +FILE: propertyWithBackingField.kt + public? final? fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } + public? final? val property: Int + private : Int = LAZY_EXPRESSION + public? get(): Int + public? final? fun receive(s: Int): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.txt new file mode 100644 index 00000000000..87cd6c899c4 --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.txt @@ -0,0 +1,9 @@ +FILE: propertyWithBackingField.kt + public? final? fun resolveMe(): R|kotlin/Unit| { + receive#(property#) + } + public? final? val property: Int + private : Int = IntegerLiteral(10) + public? get(): Int + public? final? fun receive(s: Int): R|kotlin/Unit| { + } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt new file mode 100644 index 00000000000..994588efe0f --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt @@ -0,0 +1,8 @@ +fun resolveMe() { + receive(property) +} + +val property: Number + field: Int = 10 + +fun receive(s: Int) {} diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.lazyBodies.txt new file mode 100644 index 00000000000..c502932887f --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.lazyBodies.txt @@ -0,0 +1,6 @@ +FILE: propertyWithBackingFieldDifferentTypes.kt + public? final? fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } + public? final? val property: Number + private : Int = LAZY_EXPRESSION + public? get(): Number + public? final? fun receive(s: Int): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.txt new file mode 100644 index 00000000000..846007665c2 --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.txt @@ -0,0 +1,9 @@ +FILE: propertyWithBackingFieldDifferentTypes.kt + public? final? fun resolveMe(): R|kotlin/Unit| { + receive#(property#) + } + public? final? val property: Number + private : Int = IntegerLiteral(10) + public? get(): Number + public? final? fun receive(s: Int): R|kotlin/Unit| { + } diff --git a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java index 106490e03ce..aff7ecb75b4 100644 --- a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java +++ b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java @@ -151,6 +151,16 @@ public class RawFirBuilderLazyBodiesTestCaseGenerated extends AbstractRawFirBuil runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt"); } + @TestMetadata("propertyWithBackingField.kt") + public void testPropertyWithBackingField() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt"); + } + + @TestMetadata("propertyWithBackingFieldDifferentTypes.kt") + public void testPropertyWithBackingFieldDifferentTypes() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt"); + } + @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.kt"); diff --git a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java index 2c769a086d4..971d3e88e16 100644 --- a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java +++ b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java @@ -151,6 +151,16 @@ public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCas runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt"); } + @TestMetadata("propertyWithBackingField.kt") + public void testPropertyWithBackingField() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt"); + } + + @TestMetadata("propertyWithBackingFieldDifferentTypes.kt") + public void testPropertyWithBackingFieldDifferentTypes() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt"); + } + @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.kt"); diff --git a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java index 9cff0390e8a..ede1c7c3d1d 100644 --- a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java +++ b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java @@ -165,6 +165,18 @@ public class FirVisualizerForRawFirDataGenerated extends AbstractFirVisualizerTe runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt"); } + @Test + @TestMetadata("propertyWithBackingField.kt") + public void testPropertyWithBackingField() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt"); + } + + @Test + @TestMetadata("propertyWithBackingFieldDifferentTypes.kt") + public void testPropertyWithBackingFieldDifferentTypes() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt"); + } + @Test @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception { diff --git a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java index 22d1d85bc88..c9a5a066f98 100644 --- a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java +++ b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java @@ -165,6 +165,18 @@ public class PsiVisualizerForRawFirDataGenerated extends AbstractPsiVisualizerTe runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt"); } + @Test + @TestMetadata("propertyWithBackingField.kt") + public void testPropertyWithBackingField() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt"); + } + + @Test + @TestMetadata("propertyWithBackingFieldDifferentTypes.kt") + public void testPropertyWithBackingFieldDifferentTypes() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt"); + } + @Test @TestMetadata("simpleClass.kt") public void testSimpleClass() throws Exception {