From e121ba549ebd81a389033f3c40fbd7b7df34d1da Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 9 Oct 2015 16:47:35 +0300 Subject: [PATCH] Accessor visibilities are now forbidden for abstract properties --- .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + .../kotlin/resolve/DeclarationsChecker.java | 5 ++++- .../diagnostics/tests/AbstractAccessor.kt | 15 +++++++++++++++ .../diagnostics/tests/AbstractAccessor.txt | 12 ++++++++++++ .../tests/AbstractInAbstractClass.kt | 4 ++-- .../diagnostics/tests/AbstractInClass.kt | 4 ++-- .../diagnostics/tests/AbstractInTrait.kt | 6 +++--- .../diagnostics/tests/enum/AbstractInEnum.kt | 4 ++-- .../diagnostics/tests/variance/Visibility.kt | 6 +++--- .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 1 + idea/testData/checker/Abstract.kt | 18 +++++++++--------- 13 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/AbstractAccessor.kt create mode 100644 compiler/testData/diagnostics/tests/AbstractAccessor.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 9bd87fffe39..8737e370ce9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -328,6 +328,7 @@ public interface Errors { DiagnosticFactory0 REDUNDANT_MODIFIER_IN_GETTER = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 PRIVATE_SETTER_ON_NON_PRIVATE_LATE_INIT_VAR = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY = DiagnosticFactory0.create(ERROR); DiagnosticFactory2 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 700be23ac76..e82cc79fa45 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -222,6 +222,7 @@ public class DefaultErrorMessages { MAP.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, "Getter visibility must be the same as property visibility"); MAP.put(PRIVATE_SETTER_ON_NON_PRIVATE_LATE_INIT_VAR, "Private setter is not allowed on non-private lateinit property"); + MAP.put(ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY, "Accessor visibilities are not allowed for abstract variables"); MAP.put(BACKING_FIELD_IN_INTERFACE, "Property in an interface cannot have a backing field"); MAP.put(MUST_BE_INITIALIZED, "Property must be initialized"); MAP.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java index 3d4c6f46496..fed82d8591a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java @@ -813,7 +813,10 @@ public class DeclarationsChecker { Map tokens = modifiersChecker.getTokensCorrespondingToModifiers(accessorModifierList, Sets .newHashSet(JetTokens.PUBLIC_KEYWORD, JetTokens.PROTECTED_KEYWORD, JetTokens.PRIVATE_KEYWORD, JetTokens.INTERNAL_KEYWORD)); - if (accessor.isGetter()) { + if (propertyDescriptor.getModality() == Modality.ABSTRACT && accessorDescriptor.getVisibility() != propertyDescriptor.getVisibility()) { + reportVisibilityModifierDiagnostics(tokens.values(), Errors.ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY); + } + else if (accessor.isGetter()) { if (accessorDescriptor.getVisibility() != propertyDescriptor.getVisibility()) { reportVisibilityModifierDiagnostics(tokens.values(), Errors.GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY); } diff --git a/compiler/testData/diagnostics/tests/AbstractAccessor.kt b/compiler/testData/diagnostics/tests/AbstractAccessor.kt new file mode 100644 index 00000000000..6fe6b9bd456 --- /dev/null +++ b/compiler/testData/diagnostics/tests/AbstractAccessor.kt @@ -0,0 +1,15 @@ +abstract class My { + abstract var x: Int + public get + private set + + abstract val y: Int + protected get + + abstract protected var z: Int + internal get + public set + + abstract internal val w: Int + protected get +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/AbstractAccessor.txt b/compiler/testData/diagnostics/tests/AbstractAccessor.txt new file mode 100644 index 00000000000..78abac494ac --- /dev/null +++ b/compiler/testData/diagnostics/tests/AbstractAccessor.txt @@ -0,0 +1,12 @@ +package + +public abstract class My { + public constructor My() + internal abstract val w: kotlin.Int + public abstract var x: kotlin.Int + public abstract val y: kotlin.Int + protected abstract var z: 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 +} diff --git a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt index abd15fcb96f..34301530245 100644 --- a/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt +++ b/compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt @@ -9,8 +9,8 @@ abstract class MyAbstractClass() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } diff --git a/compiler/testData/diagnostics/tests/AbstractInClass.kt b/compiler/testData/diagnostics/tests/AbstractInClass.kt index 0399873e4c1..05937b56ddc 100644 --- a/compiler/testData/diagnostics/tests/AbstractInClass.kt +++ b/compiler/testData/diagnostics/tests/AbstractInClass.kt @@ -9,8 +9,8 @@ class MyClass() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } diff --git a/compiler/testData/diagnostics/tests/AbstractInTrait.kt b/compiler/testData/diagnostics/tests/AbstractInTrait.kt index 18dc11a0e35..e7501e54b5e 100644 --- a/compiler/testData/diagnostics/tests/AbstractInTrait.kt +++ b/compiler/testData/diagnostics/tests/AbstractInTrait.kt @@ -7,10 +7,10 @@ interface MyTrait { abstract val a2: Int abstract val a3: Int = 1 - var b: Int private set + var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } diff --git a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt index 9e6df95b0db..3763013c314 100644 --- a/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt +++ b/compiler/testData/diagnostics/tests/enum/AbstractInEnum.kt @@ -11,8 +11,8 @@ enum class MyEnum() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } diff --git a/compiler/testData/diagnostics/tests/variance/Visibility.kt b/compiler/testData/diagnostics/tests/variance/Visibility.kt index d416983bd7e..4e3c013a5ea 100644 --- a/compiler/testData/diagnostics/tests/variance/Visibility.kt +++ b/compiler/testData/diagnostics/tests/variance/Visibility.kt @@ -5,11 +5,11 @@ interface Test { private val private_val: I var interlan_private_set: O - private set + private set public var public_private_set: O - private set + private set protected var protected_private_set: O - private set + private set private var private_private_set: O private set diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 6282c1b1867..981c60b020a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -39,6 +39,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("AbstractAccessor.kt") + public void testAbstractAccessor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/AbstractAccessor.kt"); + doTest(fileName); + } + @TestMetadata("AbstractInAbstractClass.kt") public void testAbstractInAbstractClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/AbstractInAbstractClass.kt"); diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index fa083240643..c3c3abd67d6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -117,6 +117,7 @@ public class QuickFixRegistrar : QuickFixContributor { val removeModifierFactory = RemoveModifierFix.createRemoveModifierFactory() GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory) PRIVATE_SETTER_ON_NON_PRIVATE_LATE_INIT_VAR.registerFactory(removeModifierFactory) + ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY.registerFactory(removeModifierFactory) REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory) WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory) REDUNDANT_MODIFIER_FOR_TARGET.registerFactory(removeModifierFactory) diff --git a/idea/testData/checker/Abstract.kt b/idea/testData/checker/Abstract.kt index c6f05487255..812ab11c211 100644 --- a/idea/testData/checker/Abstract.kt +++ b/idea/testData/checker/Abstract.kt @@ -10,8 +10,8 @@ class MyClass() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } @@ -41,8 +41,8 @@ abstract class MyAbstractClass() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } @@ -70,10 +70,10 @@ interface MyTrait { abstract val a2: Int abstract val a3: Int = 1 - var b: Int private set + var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v } @@ -104,8 +104,8 @@ enum class MyEnum() { var b: Int private set var b1: Int = 0; private set - abstract var b2: Int private set - abstract var b3: Int = 0; private set + abstract var b2: Int private set + abstract var b3: Int = 0; private set var c: Int set(v: Int) { field = v } var c1: Int = 0; set(v: Int) { field = v }