diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt index c45b16b3654..7d50a36dd6f 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.tools -import kotlinx.metadata.Flag -import kotlinx.metadata.Flags -import kotlinx.metadata.KmDeclarationContainer -import kotlinx.metadata.flagsOf +import kotlinx.metadata.* import kotlinx.metadata.jvm.* import org.objectweb.asm.tree.ClassNode @@ -42,9 +39,9 @@ fun KotlinClassMetadata.toClassVisibility(classNode: ClassNode): ClassVisibility var _facadeClassName: String? = null val members = mutableListOf() - fun addMember(signature: JvmMemberSignature?, flags: Flags) { + fun addMember(signature: JvmMemberSignature?, flags: Flags, isReified: Boolean) { if (signature != null) { - members.add(MemberVisibility(signature, flags)) + members.add(MemberVisibility(signature, flags, isReified)) } } @@ -54,7 +51,7 @@ fun KotlinClassMetadata.toClassVisibility(classNode: ClassNode): ClassVisibility flags = klass.flags for (constructor in klass.constructors) { - addMember(constructor.signature, constructor.flags) + addMember(constructor.signature, constructor.flags, isReified = false) } } is KotlinClassMetadata.FileFacade -> @@ -65,20 +62,23 @@ fun KotlinClassMetadata.toClassVisibility(classNode: ClassNode): ClassVisibility } if (container != null) { + fun List.containsReified() = any { Flag.TypeParameter.IS_REIFIED(it.flags) } + for (function in container.functions) { - addMember(function.signature, function.flags) + addMember(function.signature, function.flags, function.typeParameters.containsReified()) } for (property in container.properties) { - addMember(property.getterSignature, property.getterFlags) - addMember(property.setterSignature, property.setterFlags) + val isReified = property.typeParameters.containsReified() + addMember(property.getterSignature, property.getterFlags, isReified) + addMember(property.setterSignature, property.setterFlags, isReified) val fieldVisibility = when { Flag.Property.IS_LATEINIT(property.flags) -> property.setterFlags property.getterSignature == null && property.setterSignature == null -> property.flags // JvmField or const case else -> flagsOf(Flag.IS_PRIVATE) } - addMember(property.fieldSignature, fieldVisibility) + addMember(property.fieldSignature, fieldVisibility, isReified = false) } } diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt index d54f8703bb7..4a295fec92f 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt @@ -26,7 +26,7 @@ fun ClassVisibility.findMember(signature: JvmMemberSignature): MemberVisibility? members[signature] ?: partVisibilities.mapNotNull { it.members[signature] }.firstOrNull() -data class MemberVisibility(val member: JvmMemberSignature, val visibility: Flags?) +data class MemberVisibility(val member: JvmMemberSignature, val visibility: Flags?, val isReified: Boolean) private fun isPublic(visibility: Flags?, isPublishedApi: Boolean) = visibility == null @@ -35,8 +35,9 @@ private fun isPublic(visibility: Flags?, isPublishedApi: Boolean) = || (isPublishedApi && Flag.IS_INTERNAL(visibility)) fun ClassVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi) -fun MemberVisibility.isPublic(isPublishedApi: Boolean) = isPublic(visibility, isPublishedApi) - +fun MemberVisibility.isPublic(isPublishedApi: Boolean) = + // Assuming isReified implies inline + !isReified && isPublic(visibility, isPublishedApi)