diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index 080ba1179b5..a6b3ef93df5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -205,10 +205,6 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb updateLastScope { storeVariable(variable) } } - fun storeBackingField(property: FirProperty) { - updateLastScope { storeBackingField(property) } - } - override fun saveContextForAnonymousFunction(anonymousFunction: FirAnonymousFunction) { localContextForAnonymousFunctions[anonymousFunction.symbol] = FirLocalContext(localScopes, implicitReceiverStack.snapshot()) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index eecc6ce3d5f..21840d3345e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -114,7 +114,9 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) storeVariableReturnType(property) } withLocalScopeCleanup { - addLocalScope(FirLocalScope().storeBackingField(property)) + if (property.receiverTypeRef == null) { + addLocalScope(FirLocalScope().storeBackingField(property)) + } property.transformAccessors() } } diff --git a/compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.kt b/compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.kt new file mode 100644 index 00000000000..e080a1c5c45 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.kt @@ -0,0 +1,11 @@ +interface B { + fun foo(): Int +} + +class A { + val String.x: Int get() { + return field.foo() + } + + val String.field: B get() = TODO() +} diff --git a/compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.txt b/compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.txt new file mode 100644 index 00000000000..0aedafd4cbe --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.txt @@ -0,0 +1,21 @@ +FILE: noBackingFieldForExtension.kt + public abstract interface B : R|kotlin/Any| { + public abstract fun foo(): R|kotlin/Int| + + } + public final class A : R|kotlin/Any| { + public constructor(): R|A| { + super() + } + + public final val R|kotlin/String|.x: R|kotlin/Int| + public get(): R|kotlin/Int| { + ^ (this@R|/A|, this@R|/A.x|).R|/A.field|.R|/B.foo|() + } + + public final val R|kotlin/String|.field: R|B| + public get(): R|B| { + ^ R|kotlin/TODO|() + } + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 34571679e31..354bbca7202 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -1463,6 +1463,24 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { } } + @TestMetadata("compiler/fir/resolve/testData/resolve/properties") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Properties extends AbstractFirDiagnosticsTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInProperties() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/resolve/testData/resolve/properties"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @TestMetadata("noBackingFieldForExtension.kt") + public void testNoBackingFieldForExtension() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.kt"); + } + } + @TestMetadata("compiler/fir/resolve/testData/resolve/references") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index 75e15fbf89b..8f365f8e410 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -1463,6 +1463,24 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos } } + @TestMetadata("compiler/fir/resolve/testData/resolve/properties") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Properties extends AbstractFirDiagnosticsWithLightTreeTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInProperties() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/resolve/testData/resolve/properties"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @TestMetadata("noBackingFieldForExtension.kt") + public void testNoBackingFieldForExtension() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/properties/noBackingFieldForExtension.kt"); + } + } + @TestMetadata("compiler/fir/resolve/testData/resolve/references") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/testData/diagnostics/tests/backingField/ExtensionProperty.fir.kt b/compiler/testData/diagnostics/tests/backingField/ExtensionProperty.fir.kt index c66c6691dcf..f74a893bd70 100644 --- a/compiler/testData/diagnostics/tests/backingField/ExtensionProperty.fir.kt +++ b/compiler/testData/diagnostics/tests/backingField/ExtensionProperty.fir.kt @@ -8,10 +8,10 @@ val String.foo: Int val String.bar: Int = 13 // Error - get() = field + get() = field class My { val String.x: Int = 7 // Error - get() = field -} \ No newline at end of file + get() = field +}