Protected in allowed in companion objects but forbidden in other objects, relevant test fixes

This commit is contained in:
Mikhail Glukhikh
2015-11-20 15:34:56 +03:00
parent fdc7c75f5b
commit f81a5c06ea
9 changed files with 19 additions and 17 deletions
@@ -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)
} }
} }
+1 -1
View File
@@ -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
View File
@@ -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 {
+2 -2
View File
@@ -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() {