Skip to content

Commit 6428c88

Browse files
authored
Update kotlin-metadata-jvm (#255)
* Use stable kotlin-metadata-jvm version * Fixed check for properties declared in a companion object * Use readLenient to be more lenient w.r.t. newer metadata versions
1 parent 040922e commit 6428c88

File tree

5 files changed

+56
-57
lines changed

5 files changed

+56
-57
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ androidGradlePlugin = "7.2.2"
1515
[libraries]
1616

1717
## region Application libraries
18-
kotlinx-metadata = { module = "org.jetbrains.kotlinx:kotlinx-metadata-jvm", version = "0.6.2" }
18+
kotlinx-metadata = { module = "org.jetbrains.kotlin:kotlin-metadata-jvm", version = "2.0.0" }
1919

2020
javaDiffUtils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "javaDiffUtils" }
2121

src/main/kotlin/api/AsmMetadataLoading.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package kotlinx.validation.api
77

8-
import kotlinx.metadata.jvm.*
8+
import kotlin.metadata.jvm.*
99
import org.objectweb.asm.*
1010
import org.objectweb.asm.tree.*
1111

src/main/kotlin/api/KotlinMetadataSignature.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package kotlinx.validation.api
77

8-
import kotlinx.metadata.jvm.*
8+
import kotlin.metadata.jvm.*
99
import kotlinx.validation.*
1010
import org.objectweb.asm.*
1111
import org.objectweb.asm.tree.*
@@ -30,7 +30,7 @@ public data class ClassBinarySignature internal constructor(
3030
internal interface MemberBinarySignature {
3131
val jvmMember: JvmMemberSignature
3232
val name: String get() = jvmMember.name
33-
val desc: String get() = jvmMember.desc
33+
val desc: String get() = jvmMember.descriptor
3434
val access: AccessFlags
3535
val isPublishedApi: Boolean
3636
val annotations: List<AnnotationNode>
@@ -172,14 +172,14 @@ internal fun FieldNode.isCompanionField(outerClassMetadata: KotlinClassMetadata?
172172
val metadata = outerClassMetadata ?: return false
173173
// Non-classes are not affected by the problem
174174
if (metadata !is KotlinClassMetadata.Class) return false
175-
return metadata.toKmClass().companionObject == name
175+
return metadata.kmClass.companionObject == name
176176
}
177177

178178
internal fun ClassNode.companionName(outerClassMetadata: KotlinClassMetadata?): String? {
179179
if (outerClassMetadata !is KotlinClassMetadata.Class) {
180180
// Happens when outerClassMetadata == KotlinClassMetadata$FileFacade for an example
181181
return null
182182
}
183-
val outerKClass = outerClassMetadata.toKmClass()
183+
val outerKClass = outerClassMetadata.kmClass
184184
return name + "$" + outerKClass.companionObject
185185
}

src/main/kotlin/api/KotlinMetadataVisibilities.kt

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,18 @@
55

66
package kotlinx.validation.api
77

8-
import kotlinx.metadata.*
9-
import kotlinx.metadata.jvm.*
10-
import kotlinx.metadata.jvm.KotlinClassMetadata.Companion.COMPATIBLE_METADATA_VERSION
8+
import kotlin.metadata.*
9+
import kotlin.metadata.jvm.*
1110
import org.objectweb.asm.tree.*
1211

1312
internal class ClassVisibility(
1413
val name: String,
15-
val flags: Flags?,
14+
val visibility: Visibility?,
15+
val classKind: ClassKind?,
1616
val members: Map<JvmMemberSignature, MemberVisibility>,
1717
val facadeClassName: String? = null
1818
) {
19-
val visibility get() = flags
20-
val isCompanion: Boolean get() = flags != null && Flag.Class.IS_COMPANION_OBJECT(flags)
21-
19+
val isCompanion: Boolean get() = classKind == ClassKind.COMPANION_OBJECT
2220
var companionVisibilities: ClassVisibility? = null
2321
val partVisibilities = mutableListOf<ClassVisibility>()
2422
}
@@ -29,7 +27,7 @@ internal fun ClassVisibility.findMember(signature: JvmMemberSignature): MemberVi
2927

3028
internal data class MemberVisibility(
3129
val member: JvmMemberSignature,
32-
val visibility: Flags?,
30+
val visibility: Visibility?,
3331
val isReified: Boolean,
3432
/*
3533
* This property includes both annotations on the member itself,
@@ -38,24 +36,25 @@ internal data class MemberVisibility(
3836
val propertyAnnotation: PropertyAnnotationHolders? = null
3937
)
4038

41-
private fun isPublic(visibility: Flags?, isPublishedApi: Boolean) =
39+
private fun isPublic(visibility: Visibility?, isPublishedApi: Boolean) =
4240
visibility == null
43-
|| Flag.IS_PUBLIC(visibility)
44-
|| Flag.IS_PROTECTED(visibility)
45-
|| (isPublishedApi && Flag.IS_INTERNAL(visibility))
41+
|| visibility == Visibility.PUBLIC
42+
|| visibility == Visibility.PROTECTED
43+
|| (isPublishedApi && visibility == Visibility.INTERNAL)
4644

4745
internal fun ClassVisibility.isPublic(isPublishedApi: Boolean) =
4846
isPublic(visibility, isPublishedApi)
4947

5048
internal fun MemberVisibility.isPublic(isPublishedApi: Boolean) =
51-
// Assuming isReified implies inline
52-
!isReified && isPublic(visibility, isPublishedApi)
49+
// Assuming isReified implies inline
50+
!isReified && isPublic(visibility, isPublishedApi)
5351

54-
internal fun MemberVisibility.isInternal(): Boolean = visibility != null && Flag.IS_INTERNAL(visibility)
52+
internal fun MemberVisibility.isInternal(): Boolean = visibility == Visibility.INTERNAL
5553

5654
internal val ClassNode.kotlinMetadata: KotlinClassMetadata?
5755
get() {
5856
val metadata = findAnnotation("kotlin/Metadata", false) ?: return null
57+
5958
@Suppress("UNCHECKED_CAST")
6059
val header = with(metadata) {
6160
Metadata(
@@ -68,15 +67,7 @@ internal val ClassNode.kotlinMetadata: KotlinClassMetadata?
6867
extraInt = get("xi") as Int?
6968
)
7069
}
71-
return KotlinClassMetadata.read(header)
72-
?: error(
73-
"""
74-
Incompatible version of Kotlin metadata.
75-
Maximal supported Kotlin metadata version: ${COMPATIBLE_METADATA_VERSION.joinToString(".")},
76-
$name Kotlin metadata version: ${header.metadataVersion.joinToString(".")}.
77-
As a workaround, it is possible to manually update 'kotlinx-metadata-jvm' version in your project.
78-
""".trimIndent()
79-
)
70+
return KotlinClassMetadata.readLenient(header)
8071
}
8172

8273

@@ -92,62 +83,72 @@ internal class PropertyAnnotationHolders(
9283
)
9384

9485
internal fun KotlinClassMetadata.toClassVisibility(classNode: ClassNode): ClassVisibility {
95-
var flags: Flags? = null
86+
var visibility: Visibility? = null
87+
var kind: ClassKind? = null
9688
var _facadeClassName: String? = null
9789
val members = mutableListOf<MemberVisibility>()
9890

9991
fun addMember(
10092
signature: JvmMemberSignature?,
101-
flags: Flags,
93+
visibility: Visibility?,
10294
isReified: Boolean,
10395
propertyAnnotation: PropertyAnnotationHolders? = null
10496
) {
10597
if (signature != null) {
106-
members.add(MemberVisibility(signature, flags, isReified, propertyAnnotation))
98+
members.add(MemberVisibility(signature, visibility, isReified, propertyAnnotation))
10799
}
108100
}
109101

110102
val container: KmDeclarationContainer? = when (this) {
111103
is KotlinClassMetadata.Class ->
112-
toKmClass().also { klass ->
113-
flags = klass.flags
104+
kmClass.also { klass ->
105+
visibility = klass.visibility
106+
kind = klass.kind
114107

115108
for (constructor in klass.constructors) {
116-
addMember(constructor.signature, constructor.flags, isReified = false)
109+
addMember(constructor.signature, constructor.visibility, isReified = false)
117110
}
118111
}
112+
119113
is KotlinClassMetadata.FileFacade ->
120-
toKmPackage()
114+
kmPackage
115+
121116
is KotlinClassMetadata.MultiFileClassPart ->
122-
toKmPackage().also { _facadeClassName = this.facadeClassName }
117+
kmPackage.also { _facadeClassName = this.facadeClassName }
118+
123119
else -> null
124120
}
125121

126122
if (container != null) {
127-
fun List<KmTypeParameter>.containsReified() = any { Flag.TypeParameter.IS_REIFIED(it.flags) }
123+
fun List<KmTypeParameter>.containsReified() = any { it.isReified }
128124

129125
for (function in container.functions) {
130-
addMember(function.signature, function.flags, function.typeParameters.containsReified())
126+
addMember(function.signature, function.visibility, function.typeParameters.containsReified())
131127
}
132128

133129
for (property in container.properties) {
134130
val isReified = property.typeParameters.containsReified()
135131
val propertyAnnotations =
136132
PropertyAnnotationHolders(property.fieldSignature, property.syntheticMethodForAnnotations)
137133

138-
addMember(property.getterSignature, property.getterFlags, isReified, propertyAnnotations)
139-
addMember(property.setterSignature, property.setterFlags, isReified, propertyAnnotations)
134+
addMember(property.getterSignature, property.getter.visibility, isReified, propertyAnnotations)
135+
addMember(property.setterSignature, property.setter?.visibility, isReified, propertyAnnotations)
140136

141137
val fieldVisibility = when {
142-
Flag.Property.IS_LATEINIT(property.flags) -> property.setterFlags
143-
property.getterSignature == null && property.setterSignature == null -> property.flags // JvmField or const case
144-
else -> flagsOf(Flag.IS_PRIVATE)
138+
property.isLateinit -> property.setter!!.visibility
139+
property.getterSignature == null && property.setterSignature == null -> property.visibility // JvmField or const case
140+
else -> Visibility.PRIVATE
145141
}
146-
addMember(property.fieldSignature, fieldVisibility, isReified = false, propertyAnnotation = propertyAnnotations)
142+
addMember(
143+
property.fieldSignature,
144+
fieldVisibility,
145+
isReified = false,
146+
propertyAnnotation = propertyAnnotations
147+
)
147148
}
148149
}
149150

150-
return ClassVisibility(classNode.name, flags, members.associateBy { it.member }, _facadeClassName)
151+
return ClassVisibility(classNode.name, visibility, kind, members.associateBy { it.member }, _facadeClassName)
151152
}
152153

153154
internal fun ClassNode.toClassVisibility() = kotlinMetadata?.toClassVisibility(this)

src/main/kotlin/api/KotlinSignaturesLoading.kt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55

66
package kotlinx.validation.api
77

8-
import kotlinx.metadata.Flag
9-
import kotlinx.metadata.KmProperty
10-
import kotlinx.metadata.internal.metadata.jvm.deserialization.JvmFlags
11-
import kotlinx.metadata.jvm.*
8+
import kotlin.metadata.jvm.*
129
import kotlinx.validation.*
1310
import org.objectweb.asm.*
1411
import org.objectweb.asm.tree.*
1512
import java.io.*
1613
import java.util.*
1714
import java.util.jar.*
15+
import kotlin.metadata.KmProperty
16+
import kotlin.metadata.visibility
1817

1918
@ExternalApi
2019
@Suppress("unused")
@@ -132,10 +131,9 @@ private fun FieldNode.buildFieldSignature(
132131
}
133132

134133
val property = companionClassCandidate?.kmProperty(name)
135-
136-
if (property != null && JvmFlag.Property.IS_MOVED_FROM_INTERFACE_COMPANION(property.flags)) {
134+
if (property != null) {
137135
/*
138-
* The property was moved from the companion object. Take all the annotations from there
136+
* The property was declared in the companion object. Take all the annotations from there
139137
* to be able to filter out the non-public markers.
140138
*
141139
* See https://github.com/Kotlin/binary-compatibility-validator/issues/90
@@ -163,7 +161,7 @@ private fun ClassNode.kmProperty(name: String?): KmProperty? {
163161
return null
164162
}
165163

166-
return metadata.toKmClass().properties.firstOrNull {
164+
return metadata.kmClass.properties.firstOrNull {
167165
it.name == name
168166
}
169167
}
@@ -198,7 +196,7 @@ private fun MethodNode.buildMethodSignature(
198196
private fun List<MethodNode>.annotationsFor(methodSignature: JvmMethodSignature?): List<AnnotationNode> {
199197
if (methodSignature == null) return emptyList()
200198

201-
return firstOrNull { it.name == methodSignature.name && it.desc == methodSignature.desc }
199+
return firstOrNull { it.name == methodSignature.name && it.desc == methodSignature.descriptor }
202200
?.run {
203201
visibleAnnotations.orEmpty() + invisibleAnnotations.orEmpty()
204202
} ?: emptyList()
@@ -207,7 +205,7 @@ private fun List<MethodNode>.annotationsFor(methodSignature: JvmMethodSignature?
207205
private fun List<FieldNode>.annotationsFor(fieldSignature: JvmFieldSignature?): List<AnnotationNode> {
208206
if (fieldSignature == null) return emptyList()
209207

210-
return firstOrNull { it.name == fieldSignature.name && it.desc == fieldSignature.desc }
208+
return firstOrNull { it.name == fieldSignature.name && it.desc == fieldSignature.descriptor }
211209
?.run {
212210
visibleAnnotations.orEmpty() + invisibleAnnotations.orEmpty()
213211
} ?: emptyList()

0 commit comments

Comments
 (0)