Protected in allowed in companion objects but forbidden in other objects, relevant test fixes
This commit is contained in:
@@ -99,7 +99,7 @@ public object ModifierCheckerCore {
|
|||||||
INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS),
|
INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS),
|
||||||
OVERRIDE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
|
OVERRIDE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
|
||||||
INTERFACE, ENUM_CLASS, ENUM_ENTRY),
|
INTERFACE, ENUM_CLASS, ENUM_ENTRY),
|
||||||
PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, OBJECT),
|
PROTECTED_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, COMPANION_OBJECT),
|
||||||
INTERNAL_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
|
INTERNAL_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
|
||||||
ENUM_CLASS, ENUM_ENTRY, FILE),
|
ENUM_CLASS, ENUM_ENTRY, FILE),
|
||||||
PRIVATE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
|
PRIVATE_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, OBJECT, OBJECT_LITERAL,
|
||||||
@@ -109,10 +109,7 @@ public object ModifierCheckerCore {
|
|||||||
ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, FILE)
|
ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, FILE)
|
||||||
)
|
)
|
||||||
|
|
||||||
val deprecatedParentTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>(
|
val deprecatedParentTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>()
|
||||||
// Deprecated in M15
|
|
||||||
PROTECTED_KEYWORD to EnumSet.of(OBJECT)
|
|
||||||
)
|
|
||||||
|
|
||||||
// First modifier in pair should be also first in declaration
|
// First modifier in pair should be also first in declaration
|
||||||
private val mutualCompatibility = buildCompatibilityMap()
|
private val mutualCompatibility = buildCompatibilityMap()
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ public const val publicConst: Int = 3
|
|||||||
|
|
||||||
public object A {
|
public object A {
|
||||||
private const val privateConst: Int = 1
|
private const val privateConst: Int = 1
|
||||||
protected const val protectedConst: Int = 2
|
|
||||||
public const val publicConst: Int = 3
|
public const val publicConst: Int = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +38,7 @@ fun check(clazz: Class<*>, expectProtected: Boolean = true) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
check(A::class.java)
|
check(A::class.java, false)
|
||||||
check(B::class.java)
|
check(B::class.java)
|
||||||
check(Class.forName("XYZ"), false)
|
check(Class.forName("XYZ"), false)
|
||||||
|
|
||||||
|
|||||||
@@ -46,14 +46,12 @@ class AWithCompanion {
|
|||||||
object Object {
|
object Object {
|
||||||
@JvmField public val publicField = "OK";
|
@JvmField public val publicField = "OK";
|
||||||
@JvmField internal val internalField = "OK";
|
@JvmField internal val internalField = "OK";
|
||||||
@JvmField protected val protectedfield = "OK";
|
|
||||||
|
|
||||||
operator fun get(name: String) = Object::class.members.single { it.name == name } as KProperty<*>
|
operator fun get(name: String) = Object::class.members.single { it.name == name } as KProperty<*>
|
||||||
|
|
||||||
fun testVisibilities() {
|
fun testVisibilities() {
|
||||||
checkVisibility(this["publicField"].javaField!!, Modifier.PUBLIC)
|
checkVisibility(this["publicField"].javaField!!, Modifier.PUBLIC)
|
||||||
checkVisibility(this["internalField"].javaField!!, Modifier.PUBLIC)
|
checkVisibility(this["internalField"].javaField!!, Modifier.PUBLIC)
|
||||||
checkVisibility(this["protectedfield"].javaField!!, Modifier.PROTECTED)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ class My(protected val x: Int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object Your {
|
object Your {
|
||||||
<!DEPRECATED_MODIFIER_CONTAINING_DECLARATION!>protected<!> fun foo() = 3
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> fun foo() = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
annotation class His(<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> val x: Int)
|
annotation class His(<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> val x: Int)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ open class A {
|
|||||||
val internal_val = 1
|
val internal_val = 1
|
||||||
public val public_val: Int = 2
|
public val public_val: Int = 2
|
||||||
private val private_val = 3
|
private val private_val = 3
|
||||||
<!DEPRECATED_MODIFIER_CONTAINING_DECLARATION!>protected<!> val protected_val: Int = 5
|
protected val protected_val: Int = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
fun fromClass() {
|
fun fromClass() {
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ package test
|
|||||||
const private val topLevel = 1
|
const private val topLevel = 1
|
||||||
|
|
||||||
object A {
|
object A {
|
||||||
const protected val inObject = 2
|
const internal val inObject = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
class B {
|
class B {
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ private const val topLevel: kotlin.Int = 1
|
|||||||
|
|
||||||
public object A {
|
public object A {
|
||||||
/*primary*/ private constructor A()
|
/*primary*/ private constructor A()
|
||||||
protected const final val inObject: kotlin.Int = 2
|
internal const final val inObject: kotlin.Int = 2
|
||||||
protected final fun <get-inObject>(): kotlin.Int
|
internal final fun <get-inObject>(): kotlin.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class B {
|
public final class B {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import java.util.*
|
|||||||
// NOTE: this enum must have the same entries with kotlin.annotation.AnnotationTarget,
|
// NOTE: this enum must have the same entries with kotlin.annotation.AnnotationTarget,
|
||||||
// and may also have some additional entries
|
// and may also have some additional entries
|
||||||
public enum class KotlinTarget(val description: String, val isDefault: Boolean = true) {
|
public enum class KotlinTarget(val description: String, val isDefault: Boolean = true) {
|
||||||
CLASS("class"), // includes CLASS_ONLY, OBJECT, OBJECT_LITERAL, INTERFACE, *_CLASS but not ENUM_ENTRY
|
CLASS("class"), // includes CLASS_ONLY, OBJECT, COMPANION_OBJECT, OBJECT_LITERAL, INTERFACE, *_CLASS but not ENUM_ENTRY
|
||||||
ANNOTATION_CLASS("annotation class"),
|
ANNOTATION_CLASS("annotation class"),
|
||||||
TYPE_PARAMETER("type parameter", false),
|
TYPE_PARAMETER("type parameter", false),
|
||||||
PROPERTY("property"), // includes *_PROPERTY, PROPERTY_PARAMETER, ENUM_ENTRY
|
PROPERTY("property"), // includes *_PROPERTY, PROPERTY_PARAMETER, ENUM_ENTRY
|
||||||
@@ -44,7 +44,8 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean =
|
|||||||
PROPERTY_PARAMETER("property constructor parameter", false),
|
PROPERTY_PARAMETER("property constructor parameter", false),
|
||||||
|
|
||||||
CLASS_ONLY("class", false), // includes only top level classes and nested classes (but not enums, objects, interfaces, inner or local classes)
|
CLASS_ONLY("class", false), // includes only top level classes and nested classes (but not enums, objects, interfaces, inner or local classes)
|
||||||
OBJECT("object", false), // does not include OBJECT_LITERAL
|
OBJECT("object", false), // does not include OBJECT_LITERAL but DOES include COMPANION_OBJECT
|
||||||
|
COMPANION_OBJECT("companion object", false),
|
||||||
INTERFACE("interface", false),
|
INTERFACE("interface", false),
|
||||||
ENUM_CLASS("enum class", false),
|
ENUM_CLASS("enum class", false),
|
||||||
ENUM_ENTRY("enum entry", false),
|
ENUM_ENTRY("enum entry", false),
|
||||||
@@ -94,7 +95,13 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean =
|
|||||||
else {
|
else {
|
||||||
listOf(CLASS_ONLY, CLASS)
|
listOf(CLASS_ONLY, CLASS)
|
||||||
}
|
}
|
||||||
ClassKind.OBJECT -> listOf(OBJECT, CLASS)
|
ClassKind.OBJECT ->
|
||||||
|
if (descriptor.isCompanionObject) {
|
||||||
|
listOf(COMPANION_OBJECT, OBJECT, CLASS)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
listOf(OBJECT, CLASS)
|
||||||
|
}
|
||||||
ClassKind.INTERFACE -> listOf(INTERFACE, CLASS)
|
ClassKind.INTERFACE -> listOf(INTERFACE, CLASS)
|
||||||
ClassKind.ENUM_CLASS ->
|
ClassKind.ENUM_CLASS ->
|
||||||
if (DescriptorUtils.isLocal(descriptor)) {
|
if (DescriptorUtils.isLocal(descriptor)) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// ERROR: Modifier 'protected' is not applicable inside 'object'
|
||||||
internal object Outer {
|
internal object Outer {
|
||||||
private class Nested1() {
|
private class Nested1() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user