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 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)
|
||||
}
|
||||
|
||||
+9
-9
@@ -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 {
|
||||
|
||||
+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 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user