From 78fa8814c47fc0b6d59e0c70c7ab095b11dccfd5 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 21 Dec 2020 12:51:59 -0800 Subject: [PATCH] FIR: unwrap f/overrides when determining mutability of property reference #KT-44010 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++ .../calls/CallableReferenceResolution.kt | 6 +- .../propertyFromAbstractSuperClass.kt | 36 +++++++++++ .../propertyFromAbstractSuperClass.txt | 59 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++ 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.kt create mode 100644 compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index ca3fc1a16c8..49046ad1589 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -3004,6 +3004,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/callableReference/property/memberFromTopLevel.kt"); } + @Test + @TestMetadata("propertyFromAbstractSuperClass.kt") + public void testPropertyFromAbstractSuperClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.kt"); + } + @Test @TestMetadata("protectedVarFromClass.kt") public void testProtectedVarFromClass() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt index 697b5c25814..3fcf7709d64 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt @@ -401,6 +401,8 @@ private fun createKPropertyType( private fun FirVariable<*>.canBeMutableReference(candidate: Candidate): Boolean { if (!isVar) return false if (this is FirField) return true - return source?.kind == FirFakeSourceElementKind.PropertyFromParameter || - (setter is FirMemberDeclaration && candidate.callInfo.session.visibilityChecker.isVisible(setter!!, candidate)) + val original = this.unwrapFakeOverrides() + return original.source?.kind == FirFakeSourceElementKind.PropertyFromParameter || + (original.setter is FirMemberDeclaration && + candidate.callInfo.session.visibilityChecker.isVisible(original.setter!!, candidate)) } diff --git a/compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.kt b/compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.kt new file mode 100644 index 00000000000..a414a73665c --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.kt @@ -0,0 +1,36 @@ +// FIR_IDENTICAL +import kotlin.reflect.KMutableProperty0 + +class Module + +class Context + +class Model( + private val value: KMutableProperty0, + private val context: Context +) + +abstract class Reference { + abstract var v : V +} + +class ModuleReference(m : Module) : Reference() { + override var v : Module = m +} + +abstract class SettingComponent( + val reference: Reference +) { + var value: V + get() = reference.v + set(value) { + reference.v = value + } +} + +class Component( + reference: Reference, + context: Context +) : SettingComponent(reference) { + private val model = Model(::value, context) +} diff --git a/compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.txt b/compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.txt new file mode 100644 index 00000000000..14963e7e4a4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.txt @@ -0,0 +1,59 @@ +package + +public final class Component : SettingComponent { + public constructor Component(/*0*/ reference: Reference, /*1*/ context: Context) + private final val model: Model + public final override /*1*/ /*fake_override*/ val reference: Reference + public final override /*1*/ /*fake_override*/ var value: Module + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Context { + public constructor Context() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Model { + public constructor Model(/*0*/ value: kotlin.reflect.KMutableProperty0, /*1*/ context: Context) + private final val context: Context + private final val value: kotlin.reflect.KMutableProperty0 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Module { + public constructor Module() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class ModuleReference : Reference { + public constructor ModuleReference(/*0*/ m: Module) + public open override /*1*/ var v: Module + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public abstract class Reference { + public constructor Reference() + public abstract var v: V + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public abstract class SettingComponent { + public constructor SettingComponent(/*0*/ reference: Reference) + public final val reference: Reference + public final var value: V + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 1e91b1800d0..0ee8b1da93d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -3010,6 +3010,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/callableReference/property/memberFromTopLevel.kt"); } + @Test + @TestMetadata("propertyFromAbstractSuperClass.kt") + public void testPropertyFromAbstractSuperClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/property/propertyFromAbstractSuperClass.kt"); + } + @Test @TestMetadata("protectedVarFromClass.kt") public void testProtectedVarFromClass() throws Exception {