From 86c37deaee93d42a6388bb393e3e3d358f9b55a0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 13 Nov 2015 18:33:58 +0300 Subject: [PATCH] Overriden setter now cannot weaken visibility #KT-3369 Fixed --- .../kotlin/resolve/OverrideResolver.java | 7 +++++ .../tests/OverridenSetterVisibility.kt | 29 +++++++++++++++++++ .../tests/OverridenSetterVisibility.txt | 27 +++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++ 4 files changed, 69 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt create mode 100644 compiler/testData/diagnostics/tests/OverridenSetterVisibility.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java index d007a673826..765793ad69c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java @@ -917,6 +917,13 @@ public class OverrideResolver { private void checkVisibility(@NotNull TopDownAnalysisContext c) { for (Map.Entry entry : c.getMembers().entrySet()) { checkVisibilityForMember(entry.getKey(), entry.getValue()); + if (entry.getKey() instanceof KtProperty && entry.getValue() instanceof PropertyDescriptor) { + KtPropertyAccessor setter = ((KtProperty) entry.getKey()).getSetter(); + PropertySetterDescriptor setterDescriptor = ((PropertyDescriptor) entry.getValue()).getSetter(); + if (setter != null && setterDescriptor != null) { + checkVisibilityForMember(setter, setterDescriptor); + } + } } } diff --git a/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt new file mode 100644 index 00000000000..bd2c6ad393b --- /dev/null +++ b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt @@ -0,0 +1,29 @@ +public interface ITest { + public var prop : Int + get() = 12 + set(value) {} +} + +abstract class ATest { + protected open var prop2 : Int + get() = 13 + set(value) {} +} + +class Test: ATest(), ITest { + override var prop : Int + get() = 12 + private set(value) {} + + override var prop2 : Int + get() = 14 + internal set(value) {} +} + +fun main(args: Array) { + val test = Test() + test.prop = 12 + + val itest: ITest = test + itest.prop = 12 // No error here +} diff --git a/compiler/testData/diagnostics/tests/OverridenSetterVisibility.txt b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.txt new file mode 100644 index 00000000000..a5c1b6557f2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/OverridenSetterVisibility.txt @@ -0,0 +1,27 @@ +package + +public fun main(/*0*/ args: kotlin.Array): kotlin.Unit + +public abstract class ATest { + public constructor ATest() + protected open var prop2: kotlin.Int + 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 interface ITest { + public open var prop: kotlin.Int + 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 Test : ATest, ITest { + public constructor Test() + public open override /*1*/ var prop: kotlin.Int + protected open override /*1*/ var prop2: kotlin.Int + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 73d55a62980..0f835af3065 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -433,6 +433,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("OverridenSetterVisibility.kt") + public void testOverridenSetterVisibility() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/OverridenSetterVisibility.kt"); + doTest(fileName); + } + @TestMetadata("OverridingVarByVal.kt") public void testOverridingVarByVal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/OverridingVarByVal.kt");