5
5
6
6
package kotlinx.validation.api
7
7
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.*
11
10
import org.objectweb.asm.tree.*
12
11
13
12
internal class ClassVisibility (
14
13
val name : String ,
15
- val flags : Flags ? ,
14
+ val visibility : Visibility ? ,
15
+ val classKind : ClassKind ? ,
16
16
val members : Map <JvmMemberSignature , MemberVisibility >,
17
17
val facadeClassName : String? = null
18
18
) {
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
22
20
var companionVisibilities: ClassVisibility ? = null
23
21
val partVisibilities = mutableListOf<ClassVisibility >()
24
22
}
@@ -29,7 +27,7 @@ internal fun ClassVisibility.findMember(signature: JvmMemberSignature): MemberVi
29
27
30
28
internal data class MemberVisibility (
31
29
val member : JvmMemberSignature ,
32
- val visibility : Flags ? ,
30
+ val visibility : Visibility ? ,
33
31
val isReified : Boolean ,
34
32
/*
35
33
* This property includes both annotations on the member itself,
@@ -38,24 +36,25 @@ internal data class MemberVisibility(
38
36
val propertyAnnotation : PropertyAnnotationHolders ? = null
39
37
)
40
38
41
- private fun isPublic (visibility : Flags ? , isPublishedApi : Boolean ) =
39
+ private fun isPublic (visibility : Visibility ? , isPublishedApi : Boolean ) =
42
40
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 )
46
44
47
45
internal fun ClassVisibility.isPublic (isPublishedApi : Boolean ) =
48
46
isPublic(visibility, isPublishedApi)
49
47
50
48
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)
53
51
54
- internal fun MemberVisibility.isInternal (): Boolean = visibility != null && Flag . IS_INTERNAL (visibility)
52
+ internal fun MemberVisibility.isInternal (): Boolean = visibility == Visibility . INTERNAL
55
53
56
54
internal val ClassNode .kotlinMetadata: KotlinClassMetadata ?
57
55
get() {
58
56
val metadata = findAnnotation(" kotlin/Metadata" , false ) ? : return null
57
+
59
58
@Suppress(" UNCHECKED_CAST" )
60
59
val header = with (metadata) {
61
60
Metadata (
@@ -68,15 +67,7 @@ internal val ClassNode.kotlinMetadata: KotlinClassMetadata?
68
67
extraInt = get(" xi" ) as Int?
69
68
)
70
69
}
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)
80
71
}
81
72
82
73
@@ -92,62 +83,72 @@ internal class PropertyAnnotationHolders(
92
83
)
93
84
94
85
internal fun KotlinClassMetadata.toClassVisibility (classNode : ClassNode ): ClassVisibility {
95
- var flags: Flags ? = null
86
+ var visibility: Visibility ? = null
87
+ var kind: ClassKind ? = null
96
88
var _facadeClassName : String? = null
97
89
val members = mutableListOf<MemberVisibility >()
98
90
99
91
fun addMember (
100
92
signature : JvmMemberSignature ? ,
101
- flags : Flags ,
93
+ visibility : Visibility ? ,
102
94
isReified : Boolean ,
103
95
propertyAnnotation : PropertyAnnotationHolders ? = null
104
96
) {
105
97
if (signature != null ) {
106
- members.add(MemberVisibility (signature, flags , isReified, propertyAnnotation))
98
+ members.add(MemberVisibility (signature, visibility , isReified, propertyAnnotation))
107
99
}
108
100
}
109
101
110
102
val container: KmDeclarationContainer ? = when (this ) {
111
103
is KotlinClassMetadata .Class ->
112
- toKmClass().also { klass ->
113
- flags = klass.flags
104
+ kmClass.also { klass ->
105
+ visibility = klass.visibility
106
+ kind = klass.kind
114
107
115
108
for (constructor in klass.constructors) {
116
- addMember(constructor .signature, constructor .flags , isReified = false )
109
+ addMember(constructor .signature, constructor .visibility , isReified = false )
117
110
}
118
111
}
112
+
119
113
is KotlinClassMetadata .FileFacade ->
120
- toKmPackage()
114
+ kmPackage
115
+
121
116
is KotlinClassMetadata .MultiFileClassPart ->
122
- toKmPackage().also { _facadeClassName = this .facadeClassName }
117
+ kmPackage.also { _facadeClassName = this .facadeClassName }
118
+
123
119
else -> null
124
120
}
125
121
126
122
if (container != null ) {
127
- fun List<KmTypeParameter>.containsReified () = any { Flag . TypeParameter . IS_REIFIED ( it.flags) }
123
+ fun List<KmTypeParameter>.containsReified () = any { it.isReified }
128
124
129
125
for (function in container.functions) {
130
- addMember(function.signature, function.flags , function.typeParameters.containsReified())
126
+ addMember(function.signature, function.visibility , function.typeParameters.containsReified())
131
127
}
132
128
133
129
for (property in container.properties) {
134
130
val isReified = property.typeParameters.containsReified()
135
131
val propertyAnnotations =
136
132
PropertyAnnotationHolders (property.fieldSignature, property.syntheticMethodForAnnotations)
137
133
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)
140
136
141
137
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
145
141
}
146
- addMember(property.fieldSignature, fieldVisibility, isReified = false , propertyAnnotation = propertyAnnotations)
142
+ addMember(
143
+ property.fieldSignature,
144
+ fieldVisibility,
145
+ isReified = false ,
146
+ propertyAnnotation = propertyAnnotations
147
+ )
147
148
}
148
149
}
149
150
150
- return ClassVisibility (classNode.name, flags , members.associateBy { it.member }, _facadeClassName )
151
+ return ClassVisibility (classNode.name, visibility, kind , members.associateBy { it.member }, _facadeClassName )
151
152
}
152
153
153
154
internal fun ClassNode.toClassVisibility () = kotlinMetadata?.toClassVisibility(this )
0 commit comments