| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package internal_annotation |
| |
| @Target(AnnotationTarget.CLASS) |
| internal annotation class Annotation( |
| @get:JvmName("f1") |
| val field1: Int = 0, |
| @get:JvmName("f2") |
| val field2: String = "", |
| @get:JvmName("f3") |
| val field3: IntArray = [], |
| @get:JvmName("f4") |
| val field4: Array<String> = [] |
| ) |
| |
| @JvmName("foo") |
| internal fun Base.foo(): StackTraceElement? { |
| val anno = getMyAnnotation() ?: return null |
| // Note that only Annotation.f(1|2) will be live. |
| return StackTraceElement(anno.field2, anno.field2, anno.field2, anno.field1) |
| } |
| |
| // To prevent Annotation.f(3|4) from being stripped out by kotlinc |
| internal fun Base.getUnusedFields(): Array<String>? { |
| val anno = getMyAnnotation() ?: return null |
| val res = arrayListOf<String>() |
| for ((i, idx) in anno.field3.withIndex()) { |
| if (idx == i % 8) { |
| res.add(anno.field4[i]) |
| } |
| } |
| return res.toTypedArray() |
| } |
| |
| private fun Base.getMyAnnotation(): Annotation? = |
| javaClass.getAnnotation(Annotation::class.java) |