Compatibility validator update
This commit is contained in:
+2
-2
@@ -35,8 +35,8 @@ fun getBinaryAPI(classStreams: Sequence<InputStream>, visibilityMap: Map<String,
|
|||||||
val supertypes = listOf(superName) - "java/lang/Object" + interfaces.sorted()
|
val supertypes = listOf(superName) - "java/lang/Object" + interfaces.sorted()
|
||||||
|
|
||||||
val memberSignatures = (
|
val memberSignatures = (
|
||||||
fields.map { with(it) { FieldBinarySignature(name, desc, isInlineExposed(), AccessFlags(access)) } } +
|
fields.map { with(it) { FieldBinarySignature(name, desc, isPublishedApi(), AccessFlags(access)) } } +
|
||||||
methods.map { with(it) { MethodBinarySignature(name, desc, isInlineExposed(), AccessFlags(access)) } }
|
methods.map { with(it) { MethodBinarySignature(name, desc, isPublishedApi(), AccessFlags(access)) } }
|
||||||
).filter {
|
).filter {
|
||||||
it.isEffectivelyPublic(classAccess, classVisibility)
|
it.isEffectivelyPublic(classAccess, classVisibility)
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-9
@@ -35,11 +35,11 @@ interface MemberBinarySignature {
|
|||||||
val name: String
|
val name: String
|
||||||
val desc: String
|
val desc: String
|
||||||
val access: AccessFlags
|
val access: AccessFlags
|
||||||
val isInlineExposed: Boolean
|
val isPublishedApi: Boolean
|
||||||
|
|
||||||
fun isEffectivelyPublic(classAccess: AccessFlags, classVisibility: ClassVisibility?)
|
fun isEffectivelyPublic(classAccess: AccessFlags, classVisibility: ClassVisibility?)
|
||||||
= access.isPublic && !(access.isProtected && classAccess.isFinal)
|
= access.isPublic && !(access.isProtected && classAccess.isFinal)
|
||||||
&& (findMemberVisibility(classVisibility)?.isPublic(isInlineExposed) ?: true)
|
&& (findMemberVisibility(classVisibility)?.isPublic(isPublishedApi) ?: true)
|
||||||
|
|
||||||
fun findMemberVisibility(classVisibility: ClassVisibility?)
|
fun findMemberVisibility(classVisibility: ClassVisibility?)
|
||||||
= classVisibility?.members?.get(MemberSignature(name, desc))
|
= classVisibility?.members?.get(MemberSignature(name, desc))
|
||||||
@@ -50,7 +50,7 @@ interface MemberBinarySignature {
|
|||||||
data class MethodBinarySignature(
|
data class MethodBinarySignature(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
override val desc: String,
|
override val desc: String,
|
||||||
override val isInlineExposed: Boolean,
|
override val isPublishedApi: Boolean,
|
||||||
override val access: AccessFlags) : MemberBinarySignature {
|
override val access: AccessFlags) : MemberBinarySignature {
|
||||||
override val signature: String
|
override val signature: String
|
||||||
get() = "${access.getModifierString()} fun $name $desc"
|
get() = "${access.getModifierString()} fun $name $desc"
|
||||||
@@ -65,7 +65,7 @@ data class MethodBinarySignature(
|
|||||||
data class FieldBinarySignature(
|
data class FieldBinarySignature(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
override val desc: String,
|
override val desc: String,
|
||||||
override val isInlineExposed: Boolean,
|
override val isPublishedApi: Boolean,
|
||||||
override val access: AccessFlags) : MemberBinarySignature {
|
override val access: AccessFlags) : MemberBinarySignature {
|
||||||
override val signature: String
|
override val signature: String
|
||||||
get() = "${access.getModifierString()} field $name $desc"
|
get() = "${access.getModifierString()} field $name $desc"
|
||||||
@@ -116,7 +116,7 @@ fun ClassNode.isEffectivelyPublic(classVisibility: ClassVisibility?) =
|
|||||||
isPublic(access)
|
isPublic(access)
|
||||||
&& !isLocal()
|
&& !isLocal()
|
||||||
&& !isWhenMappings()
|
&& !isWhenMappings()
|
||||||
&& (classVisibility?.isPublic(isInlineExposed()) ?: true)
|
&& (classVisibility?.isPublic(isPublishedApi()) ?: true)
|
||||||
|
|
||||||
|
|
||||||
val ClassNode.innerClassNode: InnerClassNode? get() = innerClasses.singleOrNull { it.name == name }
|
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
|
val ClassNode.outerClassName: String? get() = innerClassNode?.outerName
|
||||||
|
|
||||||
|
|
||||||
const val inlineExposedAnnotationName = "kotlin/PublishedApi"
|
const val publishedApiAnnotationName = "kotlin/PublishedApi"
|
||||||
fun ClassNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
|
fun ClassNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null
|
||||||
fun MethodNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
|
fun MethodNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null
|
||||||
fun FieldNode.isInlineExposed() = findAnnotation(inlineExposedAnnotationName, includeInvisible = true) != null
|
fun FieldNode.isPublishedApi() = findAnnotation(publishedApiAnnotationName, includeInvisible = true) != null
|
||||||
|
|
||||||
|
|
||||||
private object KotlinClassKind {
|
private object KotlinClassKind {
|
||||||
|
|||||||
+3
-3
@@ -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 MemberVisibility(val member: MemberSignature, val declaration: String?, val visibility: String?)
|
||||||
data class MemberSignature(val name: String, val desc: 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")
|
private fun isPublic(visibility: String?, isPublishedApi: Boolean) = visibility == null || visibility == "public" || visibility == "protected" || (isPublishedApi && visibility == "internal")
|
||||||
fun ClassVisibility.isPublic(isInlineExposed: Boolean) = isPublic(visibility, isInlineExposed)
|
fun ClassVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi)
|
||||||
fun MemberVisibility.isPublic(isInlineExposed: Boolean) = isPublic(visibility, isInlineExposed)
|
fun MemberVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi)
|
||||||
|
|
||||||
fun MemberVisibility.isLateInit() = declaration != null && "lateinit var " in declaration
|
fun MemberVisibility.isLateInit() = declaration != null && "lateinit var " in declaration
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user