import kotlin.reflect.KProperty @Retention(AnnotationRetention.SOURCE) @Repeatable annotation class RepeatableAnn annotation class Ann class CustomDelegate { operator fun getValue(thisRef: Any?, prop: KProperty<*>): String = prop.name } public class A(@param:Ann @Ann val x: Int, @param: RepeatableAnn @Ann val y: Int) { @field:Ann @property:Ann @RepeatableAnn @property:RepeatableAnn val a: Int = 0 @Ann @field:Ann @property:Ann val b: Int = 0 @field:RepeatableAnn @field:RepeatableAnn val c: Int = 0 @property:RepeatableAnn @RepeatableAnn val d: Int = 0 @property:RepeatableAnn @RepeatableAnn @delegate:RepeatableAnn val e: String by CustomDelegate() @property:Ann @delegate:Ann val f: String by CustomDelegate() // Ideally we should not have repeated anotation here and below // (because @Ann should go to the property and the second annotation to its related field) @Ann @delegate:Ann val g: String by CustomDelegate() @Ann @field:Ann val h: String = "" @property:Ann @field:Ann val i: String = "" }