Prohibit @JvmField for private properties

This commit is contained in:
Pavel V. Talanov
2015-10-12 16:12:28 +03:00
committed by Michael Bogdanov
parent f7164c5bfd
commit d8be99a378
3 changed files with 12 additions and 1 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm.checkers
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetDeclaration
@@ -36,6 +37,7 @@ class JvmFieldApplicabilityChecker : DeclarationChecker {
enum class Problem(val errorMessage: String) { enum class Problem(val errorMessage: String) {
NOT_A_PROPERTY("JvmField can only be applied to a property"), NOT_A_PROPERTY("JvmField can only be applied to a property"),
NOT_FINAL("JvmField can only be applied to final property"), NOT_FINAL("JvmField can only be applied to final property"),
PRIVATE("JvmField has no effect on a private property"),
CUSTOM_ACCESSOR("JvmField cannot be applied to a property with a custom accessor"), CUSTOM_ACCESSOR("JvmField cannot be applied to a property with a custom accessor"),
NO_BACKING_FIELD("JvmField can only be applied to a property with backing field"), NO_BACKING_FIELD("JvmField can only be applied to a property with backing field"),
OVERRIDES("JvmField cannot be applied to a property that overrides some other property"), OVERRIDES("JvmField cannot be applied to a property that overrides some other property"),
@@ -56,6 +58,7 @@ class JvmFieldApplicabilityChecker : DeclarationChecker {
val problem = when { val problem = when {
descriptor !is PropertyDescriptor -> NOT_A_PROPERTY descriptor !is PropertyDescriptor -> NOT_A_PROPERTY
descriptor.modality.isOverridable -> NOT_FINAL descriptor.modality.isOverridable -> NOT_FINAL
Visibilities.isPrivate(descriptor.visibility) -> PRIVATE
!descriptor.hasBackingField(bindingContext) -> NO_BACKING_FIELD !descriptor.hasBackingField(bindingContext) -> NO_BACKING_FIELD
descriptor.hasCustomAccessor() -> CUSTOM_ACCESSOR descriptor.hasCustomAccessor() -> CUSTOM_ACCESSOR
descriptor.overriddenDescriptors.isNotEmpty() -> OVERRIDES descriptor.overriddenDescriptors.isNotEmpty() -> OVERRIDES
@@ -35,6 +35,9 @@ abstract class C : I{
<!INAPPLICABLE_JVM_FIELD!>@JvmField<!> <!INAPPLICABLE_JVM_FIELD!>@JvmField<!>
final override val ai = 3 final override val ai = 3
<!INAPPLICABLE_JVM_FIELD!>@JvmField<!>
private val private = 3
} }
interface I { interface I {
@@ -72,3 +75,6 @@ object O {
@JvmField @JvmField
val c = 3 val c = 3
} }
<!INAPPLICABLE_JVM_FIELD!>@JvmField<!>
private val private = 3
@@ -2,6 +2,7 @@ package
@kotlin.jvm.JvmField() public const val Const: kotlin.Int = 4 @kotlin.jvm.JvmField() public const val Const: kotlin.Int = 4
@kotlin.jvm.JvmField() public var i: kotlin.Int @kotlin.jvm.JvmField() public var i: kotlin.Int
@kotlin.jvm.JvmField() private val private: kotlin.Int = 3
@kotlin.jvm.JvmField() public fun foo(): kotlin.Unit @kotlin.jvm.JvmField() public fun foo(): kotlin.Unit
@kotlin.jvm.JvmField() public abstract class C : I { @kotlin.jvm.JvmField() public abstract class C : I {
@@ -14,6 +15,7 @@ package
@kotlin.jvm.JvmField() public final val customGetter: kotlin.String = "" @kotlin.jvm.JvmField() public final val customGetter: kotlin.String = ""
@kotlin.jvm.JvmField() public final var customSetter: kotlin.String @kotlin.jvm.JvmField() public final var customSetter: kotlin.String
@kotlin.jvm.JvmField() public final val noBackingField: kotlin.String @kotlin.jvm.JvmField() public final val noBackingField: kotlin.String
@kotlin.jvm.JvmField() private final val private: kotlin.Int = 3
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@kotlin.jvm.JvmField() private final fun foo(/*0*/ s: kotlin.String = ...): kotlin.Unit @kotlin.jvm.JvmField() private final fun foo(/*0*/ s: kotlin.String = ...): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int