binary-compatibility-validator, minor: refactor annotation utilities.
This commit is contained in:
+15
-15
@@ -129,9 +129,10 @@ val ClassNode.outerClassName: String? get() = innerClassNode?.outerName
|
|||||||
|
|
||||||
|
|
||||||
const val inlineExposedAnnotationName = "kotlin/internal/InlineExposed"
|
const val inlineExposedAnnotationName = "kotlin/internal/InlineExposed"
|
||||||
fun ClassNode.isInlineExposed() = hasAnnotation(inlineExposedAnnotationName, includeInvisible = true)
|
fun ClassNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
|
||||||
fun MethodNode.isInlineExposed() = hasAnnotation(inlineExposedAnnotationName, includeInvisible = true)
|
fun MethodNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
|
||||||
fun FieldNode.isInlineExposed() = hasAnnotation(inlineExposedAnnotationName, includeInvisible = true)
|
fun FieldNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
|
||||||
|
|
||||||
|
|
||||||
private object KotlinClassKind {
|
private object KotlinClassKind {
|
||||||
const val FILE = 2
|
const val FILE = 2
|
||||||
@@ -146,20 +147,13 @@ fun ClassNode.isDefaultImpls() = isInner() && name.endsWith("\$DefaultImpls") &&
|
|||||||
|
|
||||||
|
|
||||||
val ClassNode.kotlinClassKind: Int?
|
val ClassNode.kotlinClassKind: Int?
|
||||||
get() = visibleAnnotations
|
get() = findAnnotation("kotlin/Metadata", false)?.get("k") as Int?
|
||||||
?.filter { it.desc == "Lkotlin/Metadata;" }
|
|
||||||
?.map { (it.values.annotationValue("k") as? Int) }
|
|
||||||
?.firstOrNull()
|
|
||||||
|
|
||||||
fun ClassNode.hasAnnotation(annotationName: String, includeInvisible: Boolean = false) = hasAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
|
fun ClassNode.findAnnotation(annotationName: String, includeInvisible: Boolean = false) = findAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
|
||||||
fun MethodNode.hasAnnotation(annotationName: String, includeInvisible: Boolean = false) = hasAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
|
fun MethodNode.findAnnotation(annotationName: String, includeInvisible: Boolean = false) = findAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
|
||||||
fun FieldNode.hasAnnotation(annotationName: String, includeInvisible: Boolean = false) = hasAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
|
fun FieldNode.findAnnotation(annotationName: String, includeInvisible: Boolean = false) = findAnnotation(annotationName, visibleAnnotations, invisibleAnnotations, includeInvisible)
|
||||||
|
|
||||||
private fun hasAnnotation(annotationName: String, visibleAnnotations: List<AnnotationNode>?, invisibleAnnotations: List<AnnotationNode>?, includeInvisible: Boolean)
|
operator fun AnnotationNode.get(key: String): Any? = values.annotationValue(key)
|
||||||
= "L$annotationName;".let { desc ->
|
|
||||||
(visibleAnnotations?.any { it.desc == desc } ?: false)
|
|
||||||
|| (includeInvisible && (invisibleAnnotations?.any { it.desc == desc } ?: false))
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun List<Any>.annotationValue(key: String): Any? {
|
private fun List<Any>.annotationValue(key: String): Any? {
|
||||||
for (index in (0 .. size / 2 - 1)) {
|
for (index in (0 .. size / 2 - 1)) {
|
||||||
@@ -168,3 +162,9 @@ private fun List<Any>.annotationValue(key: String): Any? {
|
|||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun findAnnotation(annotationName: String, visibleAnnotations: List<AnnotationNode>?, invisibleAnnotations: List<AnnotationNode>?, includeInvisible: Boolean): AnnotationNode? =
|
||||||
|
visibleAnnotations?.firstOrNull { it.refersToName(annotationName) } ?:
|
||||||
|
if (includeInvisible) invisibleAnnotations?.firstOrNull { it.refersToName(annotationName) } else null
|
||||||
|
|
||||||
|
fun AnnotationNode.refersToName(name: String) = desc.startsWith('L') && desc.endsWith(';') && desc.regionMatches(1, name, 0, name.length)
|
||||||
Reference in New Issue
Block a user