Accessor visibilities are now forbidden for abstract properties
This commit is contained in:
@@ -328,6 +328,7 @@ public interface Errors {
|
||||
DiagnosticFactory0<PsiElement> REDUNDANT_MODIFIER_IN_GETTER = DiagnosticFactory0.create(WARNING);
|
||||
DiagnosticFactory0<PsiElement> GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> PRIVATE_SETTER_ON_NON_PRIVATE_LATE_INIT_VAR = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory2<JetTypeReference, JetType, JetType> WRONG_GETTER_RETURN_TYPE = DiagnosticFactory2.create(ERROR);
|
||||
|
||||
DiagnosticFactory0<JetModifierListOwner>
|
||||
|
||||
+1
@@ -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");
|
||||
|
||||
@@ -813,7 +813,10 @@ public class DeclarationsChecker {
|
||||
Map<JetModifierKeywordToken, PsiElement> 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);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
abstract class My {
|
||||
abstract var x: Int
|
||||
<!REDUNDANT_MODIFIER_IN_GETTER!>public<!> get
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
|
||||
abstract val y: Int
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>protected<!> get
|
||||
|
||||
abstract protected var z: Int
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>internal<!> get
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>public<!> set
|
||||
|
||||
abstract internal val w: Int
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>protected<!> get
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -9,8 +9,8 @@ abstract class MyAbstractClass() {
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var b: Int<!> private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; private set
|
||||
abstract var b2: Int <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED!>var c: Int<!> set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@ class MyClass() {
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var b: Int<!> private set
|
||||
var b1: Int = 0; private set
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var b2: Int private set
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var b3: Int = 0; private set
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var b2: Int <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var b3: Int = 0; <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED!>var c: Int<!> set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
|
||||
+3
-3
@@ -7,10 +7,10 @@ interface MyTrait {
|
||||
<!ABSTRACT_MODIFIER_IN_INTERFACE!>abstract<!> val a2: Int
|
||||
<!ABSTRACT_MODIFIER_IN_INTERFACE!>abstract<!> val a3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>1<!>
|
||||
|
||||
var b: Int private set
|
||||
var b: Int <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
var b1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; private set
|
||||
<!ABSTRACT_MODIFIER_IN_INTERFACE!>abstract<!> var b2: Int private set
|
||||
<!ABSTRACT_MODIFIER_IN_INTERFACE!>abstract<!> var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; private set
|
||||
<!ABSTRACT_MODIFIER_IN_INTERFACE!>abstract<!> var b2: Int <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
<!ABSTRACT_MODIFIER_IN_INTERFACE!>abstract<!> var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
|
||||
<!BACKING_FIELD_IN_INTERFACE!>var c: Int<!> set(v: Int) { field = v }
|
||||
<!BACKING_FIELD_IN_INTERFACE!>var c1: Int<!> = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; set(v: Int) { field = v }
|
||||
|
||||
@@ -11,8 +11,8 @@ enum class MyEnum() {
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var b: Int<!> private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; private set
|
||||
abstract var b2: Int <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED!>var c: Int<!> set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
|
||||
@@ -5,11 +5,11 @@ interface Test<in I, out O> {
|
||||
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> val private_val: I
|
||||
|
||||
var interlan_private_set: <!TYPE_VARIANCE_CONFLICT!>O<!>
|
||||
private set
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
public var public_private_set: <!TYPE_VARIANCE_CONFLICT!>O<!>
|
||||
private set
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> var protected_private_set: <!TYPE_VARIANCE_CONFLICT!>O<!>
|
||||
private set
|
||||
<!ACCESSOR_VISIBILITY_FOR_ABSTRACT_PROPERTY!>private<!> set
|
||||
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> var private_private_set: O
|
||||
private set
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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)
|
||||
|
||||
Vendored
+9
-9
@@ -10,8 +10,8 @@ class MyClass() {
|
||||
|
||||
<error>var b: Int</error> private set
|
||||
var b1: Int = 0; private set
|
||||
<error>abstract</error> var b2: Int private set
|
||||
<error>abstract</error> var b3: Int = 0; private set
|
||||
<error>abstract</error> var b2: Int <error>private</error> set
|
||||
<error>abstract</error> var b3: Int = 0; <error>private</error> set
|
||||
|
||||
<error>var c: Int</error> set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
@@ -41,8 +41,8 @@ abstract class MyAbstractClass() {
|
||||
|
||||
<error>var b: Int</error> private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = <error>0</error>; private set
|
||||
abstract var b2: Int <error>private</error> set
|
||||
abstract var b3: Int = <error>0</error>; <error>private</error> set
|
||||
|
||||
<error>var c: Int</error> set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
@@ -70,10 +70,10 @@ interface MyTrait {
|
||||
<warning>abstract</warning> val a2: Int
|
||||
<warning>abstract</warning> val a3: Int = <error>1</error>
|
||||
|
||||
var b: Int private set
|
||||
var b: Int <error>private</error> set
|
||||
var b1: Int = <error>0</error>; private set
|
||||
<warning>abstract</warning> var b2: Int private set
|
||||
<warning>abstract</warning> var b3: Int = <error>0</error>; private set
|
||||
<warning>abstract</warning> var b2: Int <error>private</error> set
|
||||
<warning>abstract</warning> var b3: Int = <error>0</error>; <error>private</error> set
|
||||
|
||||
<error>var c: Int</error> set(v: Int) { field = v }
|
||||
<error>var c1: Int</error> = <error>0</error>; set(v: Int) { field = v }
|
||||
@@ -104,8 +104,8 @@ enum class MyEnum() {
|
||||
|
||||
<error>var b: Int</error> private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = <error>0</error>; private set
|
||||
abstract var b2: Int <error>private</error> set
|
||||
abstract var b3: Int = <error>0</error>; <error>private</error> set
|
||||
|
||||
<error>var c: Int</error> set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
|
||||
Reference in New Issue
Block a user