55
66package 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.*
1110import org.objectweb.asm.tree.*
1211
1312internal 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
3028internal 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
4745internal fun ClassVisibility.isPublic (isPublishedApi : Boolean ) =
4846 isPublic(visibility, isPublishedApi)
4947
5048internal 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
5654internal 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
9485internal 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
153154internal fun ClassNode.toClassVisibility () = kotlinMetadata?.toClassVisibility(this )
0 commit comments