From 98e0771ffaa43a09f087e4faee186b9595f9799a Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 23 Oct 2015 17:38:25 +0300 Subject: [PATCH] Abstract var setter visibilities: now only private setters are forbidden --- .../rendering/DefaultErrorMessages.java | 2 +- .../kotlin/resolve/DeclarationsChecker.java | 15 ++++++++------- .../diagnostics/tests/AbstractAccessor.kt | 11 +++++++---- .../diagnostics/tests/AbstractAccessor.txt | 1 + 4 files changed, 17 insertions(+), 12 deletions(-) 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 2a4389a7310..7b6a224c5bd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -209,7 +209,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 properties"); + MAP.put(ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY, "Private accessor visibilities are not allowed for abstract properties"); 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 505f327a721..4c8f75855a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java @@ -829,10 +829,7 @@ public class DeclarationsChecker { Map tokens = modifiersChecker.getTokensCorrespondingToModifiers(accessorModifierList, Sets .newHashSet(KtTokens.PUBLIC_KEYWORD, KtTokens.PROTECTED_KEYWORD, KtTokens.PRIVATE_KEYWORD, KtTokens.INTERNAL_KEYWORD)); - if (propertyDescriptor.getModality() == Modality.ABSTRACT && accessorDescriptor.getVisibility() != propertyDescriptor.getVisibility()) { - reportVisibilityModifierDiagnostics(tokens.values(), Errors.ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY); - } - else if (accessor.isGetter()) { + if (accessor.isGetter()) { if (accessorDescriptor.getVisibility() != propertyDescriptor.getVisibility()) { reportVisibilityModifierDiagnostics(tokens.values(), Errors.GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY); } @@ -841,9 +838,13 @@ public class DeclarationsChecker { } } else if (accessorDescriptor.getVisibility() == Visibilities.PRIVATE - && propertyDescriptor.getVisibility() != Visibilities.PRIVATE - && propertyDescriptor.isLateInit()) { - reportVisibilityModifierDiagnostics(tokens.values(), Errors.PRIVATE_SETTER_ON_NON_PRIVATE_LATE_INIT_VAR); + && propertyDescriptor.getVisibility() != Visibilities.PRIVATE) { + if (propertyDescriptor.getModality() == Modality.ABSTRACT) { + reportVisibilityModifierDiagnostics(tokens.values(), Errors.ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY); + } + else if (propertyDescriptor.isLateInit()) { + reportVisibilityModifierDiagnostics(tokens.values(), Errors.PRIVATE_SETTER_ON_NON_PRIVATE_LATE_INIT_VAR); + } } } } diff --git a/compiler/testData/diagnostics/tests/AbstractAccessor.kt b/compiler/testData/diagnostics/tests/AbstractAccessor.kt index 6fe6b9bd456..255f4b98444 100644 --- a/compiler/testData/diagnostics/tests/AbstractAccessor.kt +++ b/compiler/testData/diagnostics/tests/AbstractAccessor.kt @@ -4,12 +4,15 @@ abstract class My { private set abstract val y: Int - protected get + protected get abstract protected var z: Int - internal get - public set + internal get + private set abstract internal val w: Int - protected get + protected get + + abstract var u: Int + protected set } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/AbstractAccessor.txt b/compiler/testData/diagnostics/tests/AbstractAccessor.txt index 78abac494ac..931032e8823 100644 --- a/compiler/testData/diagnostics/tests/AbstractAccessor.txt +++ b/compiler/testData/diagnostics/tests/AbstractAccessor.txt @@ -2,6 +2,7 @@ package public abstract class My { public constructor My() + public abstract var u: kotlin.Int internal abstract val w: kotlin.Int public abstract var x: kotlin.Int public abstract val y: kotlin.Int