Compatibility validator update

This commit is contained in:
Mikhael Bogdanov
2016-11-30 14:30:36 +01:00
parent 95a47e56f7
commit 58263c46cc
3 changed files with 14 additions and 14 deletions
@@ -35,8 +35,8 @@ fun getBinaryAPI(classStreams: Sequence<InputStream>, visibilityMap: Map<String,
val supertypes = listOf(superName) - "java/lang/Object" + interfaces.sorted()
val memberSignatures = (
fields.map { with(it) { FieldBinarySignature(name, desc, isInlineExposed(), AccessFlags(access)) } } +
methods.map { with(it) { MethodBinarySignature(name, desc, isInlineExposed(), AccessFlags(access)) } }
fields.map { with(it) { FieldBinarySignature(name, desc, isPublishedApi(), AccessFlags(access)) } } +
methods.map { with(it) { MethodBinarySignature(name, desc, isPublishedApi(), AccessFlags(access)) } }
).filter {
it.isEffectivelyPublic(classAccess, classVisibility)
}
@@ -35,11 +35,11 @@ interface MemberBinarySignature {
val name: String
val desc: String
val access: AccessFlags
val isInlineExposed: Boolean
val isPublishedApi: Boolean
fun isEffectivelyPublic(classAccess: AccessFlags, classVisibility: ClassVisibility?)
= access.isPublic && !(access.isProtected && classAccess.isFinal)
&& (findMemberVisibility(classVisibility)?.isPublic(isInlineExposed) ?: true)
&& (findMemberVisibility(classVisibility)?.isPublic(isPublishedApi) ?: true)
fun findMemberVisibility(classVisibility: ClassVisibility?)
= classVisibility?.members?.get(MemberSignature(name, desc))
@@ -50,7 +50,7 @@ interface MemberBinarySignature {
data class MethodBinarySignature(
override val name: String,
override val desc: String,
override val isInlineExposed: Boolean,
override val isPublishedApi: Boolean,
override val access: AccessFlags) : MemberBinarySignature {
override val signature: String
get() = "${access.getModifierString()} fun $name $desc"
@@ -65,7 +65,7 @@ data class MethodBinarySignature(
data class FieldBinarySignature(
override val name: String,
override val desc: String,
override val isInlineExposed: Boolean,
override val isPublishedApi: Boolean,
override val access: AccessFlags) : MemberBinarySignature {
override val signature: String
get() = "${access.getModifierString()} field $name $desc"
@@ -116,7 +116,7 @@ fun ClassNode.isEffectivelyPublic(classVisibility: ClassVisibility?) =
isPublic(access)
&& !isLocal()
&& !isWhenMappings()
&& (classVisibility?.isPublic(isInlineExposed()) ?: true)
&& (classVisibility?.isPublic(isPublishedApi()) ?: true)
val ClassNode.innerClassNode: InnerClassNode? get() = innerClasses.singleOrNull { it.name == name }
@@ -128,10 +128,10 @@ val ClassNode.effectiveAccess: Int get() = innerClassNode?.access ?: access
val ClassNode.outerClassName: String? get() = innerClassNode?.outerName
const val inlineExposedAnnotationName = "kotlin/PublishedApi"
fun ClassNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
fun MethodNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
fun FieldNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
const val publishedApiAnnotationName = "kotlin/PublishedApi"
fun ClassNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null
fun MethodNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null
fun FieldNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null
private object KotlinClassKind {
@@ -8,9 +8,9 @@ data class ClassVisibility(val name: String, val visibility: String?, val member
data class MemberVisibility(val member: MemberSignature, val declaration: String?, val visibility: String?)
data class MemberSignature(val name: String, val desc: String)
private fun isPublic(visibility: String?, isInlineExposed: Boolean) = visibility == null || visibility == "public" || visibility == "protected" || (isInlineExposed && visibility == "internal")
fun ClassVisibility.isPublic(isInlineExposed: Boolean) = isPublic(visibility, isInlineExposed)
fun MemberVisibility.isPublic(isInlineExposed: Boolean) = isPublic(visibility, isInlineExposed)
private fun isPublic(visibility: String?, isPublishedApi: Boolean) = visibility == null || visibility == "public" || visibility == "protected" || (isPublishedApi && visibility == "internal")
fun ClassVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi)
fun MemberVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi)
fun MemberVisibility.isLateInit() = declaration != null && "lateinit var " in declaration