From 873550b0bb45e8a6f265c78ddb867d75477cac2d Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 3 Nov 2015 14:54:57 +0300 Subject: [PATCH] lateinit setter now must have the same visibility as its property visibility --- .../org/jetbrains/kotlin/diagnostics/Errors.java | 2 +- .../rendering/DefaultErrorMessages.java | 2 +- .../kotlin/resolve/DeclarationsChecker.java | 11 ++++++----- compiler/testData/diagnostics/tests/LateInit.kt | 2 +- .../testData/diagnostics/tests/LateInitSetter.kt | 16 +++++++++++----- .../diagnostics/tests/LateInitSetter.txt | 2 ++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 +- 7 files changed, 23 insertions(+), 14 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 2e7aef978e6..a1de06e566a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -337,7 +337,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 SETTER_VISIBILITY_DIFFERS_FROM_LATEINIT_VISIBILITY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY = DiagnosticFactory0.create(ERROR); DiagnosticFactory2 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 WRONG_SETTER_RETURN_TYPE = DiagnosticFactory0.create(ERROR); 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 44cb34c12c8..0ee0704478d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -208,7 +208,7 @@ public class DefaultErrorMessages { MAP.put(INAPPLICABLE_LATEINIT_MODIFIER, "''lateinit'' modifier {0}", STRING); 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(SETTER_VISIBILITY_DIFFERS_FROM_LATEINIT_VISIBILITY, "Setter visibility must be the same as lateinit property visibility"); 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"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java index c4c2339cf14..beb5addfe4c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java @@ -837,13 +837,14 @@ public class DeclarationsChecker { reportVisibilityModifierDiagnostics(tokens.values(), Errors.REDUNDANT_MODIFIER_IN_GETTER); } } - else if (accessorDescriptor.getVisibility() == Visibilities.PRIVATE - && propertyDescriptor.getVisibility() != Visibilities.PRIVATE) { - if (propertyDescriptor.getModality() == Modality.ABSTRACT) { + else { + if (propertyDescriptor.getModality() == Modality.ABSTRACT + && accessorDescriptor.getVisibility() == Visibilities.PRIVATE + && propertyDescriptor.getVisibility() != Visibilities.PRIVATE) { 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); + else if (propertyDescriptor.isLateInit() && accessorDescriptor.getVisibility() != propertyDescriptor.getVisibility()) { + reportVisibilityModifierDiagnostics(tokens.values(), Errors.SETTER_VISIBILITY_DIFFERS_FROM_LATEINIT_VISIBILITY); } } } diff --git a/compiler/testData/diagnostics/tests/LateInit.kt b/compiler/testData/diagnostics/tests/LateInit.kt index 2c8dde40cba..bf6b1e3138c 100644 --- a/compiler/testData/diagnostics/tests/LateInit.kt +++ b/compiler/testData/diagnostics/tests/LateInit.kt @@ -16,7 +16,7 @@ public abstract class A(la public lateinit var e: String get - private set + private set fun a() { lateinit var a: String diff --git a/compiler/testData/diagnostics/tests/LateInitSetter.kt b/compiler/testData/diagnostics/tests/LateInitSetter.kt index 6d1ad1374c1..be5b48f12bd 100644 --- a/compiler/testData/diagnostics/tests/LateInitSetter.kt +++ b/compiler/testData/diagnostics/tests/LateInitSetter.kt @@ -1,16 +1,22 @@ class My { lateinit var x: String - private set + private set lateinit var y: String - // Ok, non-private setter - internal set + internal set lateinit protected var z: String - private set + private set lateinit private var w: String - // Ok, private var + // Ok, private var / private set private set + + lateinit protected var v: String + public set + + lateinit public var u: String + // Ok, public var / public set + public set } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/LateInitSetter.txt b/compiler/testData/diagnostics/tests/LateInitSetter.txt index da7eb07ecf4..9798e20400d 100644 --- a/compiler/testData/diagnostics/tests/LateInitSetter.txt +++ b/compiler/testData/diagnostics/tests/LateInitSetter.txt @@ -2,6 +2,8 @@ package public final class My { public constructor My() + public final lateinit var u: kotlin.String + protected final lateinit var v: kotlin.String private final lateinit var w: kotlin.String public final lateinit var x: kotlin.String public final lateinit var y: kotlin.String diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 457ecfa827f..7330b57f93f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -114,7 +114,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) + SETTER_VISIBILITY_DIFFERS_FROM_LATEINIT_VISIBILITY.registerFactory(removeModifierFactory) ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY.registerFactory(removeModifierFactory) REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory) WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory)