Files
kotlin-fork/compiler/testData/codegen/box/annotations/annotationsOnNonExistentAccessors.kt
T
Alexander Udalov 06ce0cb0f0 Fix deserialization of default property accessor flags
In MemberDeserializer.loadProperty, we incorrectly passed 0 to
getAnnotations when loading annotations on property accessors in case
the protobuf field getter_flags/setter_flags was not present. The
correct behavior, as described in metadata.proto, was to pass a special
"default accessor flags" value, constructed from the main property
flags. Otherwise in case there were annotations both on the property and
on the accessor (as in PropertyAndAccessor.kt) and the accessor was
otherwise default, we would assume that it had no annotations and would
not load them in compiler and reflection

 #KT-25499 In Progress
2018-09-07 11:49:41 +03:00

171 lines
4.0 KiB
Kotlin
Vendored

// WITH_REFLECT
// IGNORE_BACKEND: JVM_IR, JS_IR, JS, NATIVE
// Please make sure that this test is consistent with the diagnostic test "annotationsTargetingNonExistentAccessor.kt"
import kotlin.reflect.KAnnotatedElement
import kotlin.reflect.KProperty
annotation class Ann
annotation class AnnRepeat
fun check(element: KAnnotatedElement, annotationExists: Boolean) {
require(element.annotations.isNotEmpty() == annotationExists) { "Fail: $element" }
}
class PrivateProperties(
@get:Ann private val y0: Int,
@get:Ann private vararg val y1: String
) {
@get:Ann
private val x1 = ""
@set:Ann
private var x2 = ""
@setparam:Ann
private var x3 = ""
@setparam:[Ann AnnRepeat]
private var x4 = ""
@get:Ann
internal val x5 = ""
@get:Ann
protected val x6 = ""
@get:Ann
private val x7: String = ""
@AnnRepeat get
@get:Ann
@set:Ann
private var x8: String = ""
get() { return "" }
@get:Ann
@set:Ann
private var x9: String = ""
get() { return "" }
set(f) { field = f }
fun test() {
check(::y0.getter, annotationExists = false)
check(::y1.getter, annotationExists = false)
check(::x1.getter, annotationExists = false)
check(::x2.setter, annotationExists = false)
check(::x3.setter.parameters.first(), annotationExists = false)
check(::x4.setter.parameters.first(), annotationExists = false)
check(::x5.getter, annotationExists = true)
check(::x6.getter, annotationExists = true)
check(::x7.getter, annotationExists = false)
check(::x8.getter, annotationExists = true)
check(::x8.setter, annotationExists = false)
check(::x9.getter, annotationExists = true)
check(::x9.setter, annotationExists = true)
}
}
private class EffetivelyPrivate private constructor(
@get:Ann val x0: Int,
@get:Ann protected val x1: Int,
@get:Ann internal val x2: Int
) {
companion object {
fun test() {
EffetivelyPrivate(0, 0, 0).test()
}
}
private class Nested {
@get:Ann
val fofo = 0
}
fun test() {
check(::x0.getter, annotationExists = true)
check(::x1.getter, annotationExists = true)
check(::x2.getter, annotationExists = true)
check(Nested::fofo.getter, annotationExists = true)
}
}
class Statics {
@get:Ann
lateinit var y0: String
@get:Ann
private lateinit var y1: String
companion object {
@JvmField
@get:Ann
val x0 = ""
@get:Ann
const val x1 = ""
@JvmStatic
@AnnRepeat
@get:Ann
@set:Ann
@setparam:Ann
var x2 = ""
@JvmStatic
@get:Ann
private val x3 = ""
@get:Ann
val x4 = ""
}
fun test() {
check(::y0.getter, annotationExists = true)
check(::y1.getter, annotationExists = false)
check(::x0.getter, annotationExists = false)
check(::x1.getter, annotationExists = false)
check(::x2.getter, annotationExists = true)
check(::x2.setter, annotationExists = true)
check(::x2.setter.parameters.first(), annotationExists = false /* TODO */)
check(::x3.getter, annotationExists = false)
check(::x4.getter, annotationExists = true)
}
}
class Delegate {
@get:Ann
@set:Ann
@setparam:Ann
private var delegate by CustomDelegate()
fun test() {
check(::delegate.getter, annotationExists = true)
check(::delegate.setter, annotationExists = true)
check(::delegate.setter.parameters.first(), annotationExists = true)
}
class CustomDelegate {
operator fun getValue(thisRef: Any?, prop: KProperty<*>): String = prop.name
operator fun setValue(delegate: Delegate, property: KProperty<*>, s: String) {
}
}
}
fun box(): String {
PrivateProperties(0, "").test()
EffetivelyPrivate.test()
Statics().test()
Delegate().test()
return "OK"
}