1+ // Visitor API has already been deprecated, but the error is being suppressed for now.
2+ @file:Suppress(" DEPRECATION_ERROR" )
3+
14package io.github.projectmapk.jackson.module.kogera
25
6+ import kotlinx.metadata.ClassKind
37import kotlinx.metadata.ClassName
4- import kotlinx.metadata.ExperimentalContextReceivers
5- import kotlinx.metadata.Flags
6- import kotlinx.metadata.KmClassExtensionVisitor
7- import kotlinx.metadata.KmClassVisitor
8+ import kotlinx.metadata.KmClass
89import kotlinx.metadata.KmConstructor
9- import kotlinx.metadata.KmConstructorVisitor
10- import kotlinx.metadata.KmExtensionType
1110import kotlinx.metadata.KmFunction
12- import kotlinx.metadata.KmFunctionVisitor
1311import kotlinx.metadata.KmProperty
14- import kotlinx.metadata.KmPropertyVisitor
1512import kotlinx.metadata.KmType
16- import kotlinx.metadata.KmTypeAliasVisitor
17- import kotlinx.metadata.KmTypeParameterVisitor
18- import kotlinx.metadata.KmTypeVisitor
19- import kotlinx.metadata.KmVariance
20- import kotlinx.metadata.KmVersionRequirementVisitor
21- import kotlinx.metadata.flagsOf
22- import kotlinx.metadata.internal.accept
23- import kotlinx.metadata.internal.metadata.jvm.deserialization.JvmProtoBufUtil
2413import kotlinx.metadata.jvm.getterSignature
2514import kotlinx.metadata.jvm.signature
2615import java.lang.reflect.Constructor
2716import java.lang.reflect.Field
2817import java.lang.reflect.Method
29-
30- // KmClassVisitor with all processing disabled as much as possible to reduce load
31- internal sealed class ReducedKmClassVisitor : KmClassVisitor () {
32- final override val delegate: KmClassVisitor ? get() = null
33-
34- // from KmDeclarationContainerVisitor
35- override fun visitFunction (flags : Flags , name : String ): KmFunctionVisitor ? = null
36- override fun visitProperty (
37- flags : Flags ,
38- name : String ,
39- getterFlags : Flags ,
40- setterFlags : Flags
41- ): KmPropertyVisitor ? = null
42- override fun visitTypeAlias (flags : Flags , name : String ): KmTypeAliasVisitor ? = null
43- override fun visitExtensions (type : KmExtensionType ): KmClassExtensionVisitor ? = null
44-
45- // from KmClassVisitor
46- override fun visit (flags : Flags , name : ClassName ) {}
47- override fun visitTypeParameter (
48- flags : Flags ,
49- name : String ,
50- id : Int ,
51- variance : KmVariance
52- ): KmTypeParameterVisitor ? = null
53- override fun visitSupertype (flags : Flags ): KmTypeVisitor ? = null
54- override fun visitConstructor (flags : Flags ): KmConstructorVisitor ? = null
55- override fun visitCompanionObject (name : String ) {}
56- override fun visitNestedClass (name : String ) {}
57- override fun visitEnumEntry (name : String ) {}
58- override fun visitSealedSubclass (name : ClassName ) {}
59- override fun visitInlineClassUnderlyingPropertyName (name : String ) {}
60- override fun visitInlineClassUnderlyingType (flags : Flags ): KmTypeVisitor ? = null
61-
62- @OptIn(ExperimentalContextReceivers ::class )
63- override fun visitContextReceiverType (flags : Flags ): KmTypeVisitor ? = null
64- override fun visitVersionRequirement (): KmVersionRequirementVisitor ? = null
65- override fun visitEnd () {}
66- }
18+ import kotlinx.metadata.internal.metadata.deserialization.Flags as ProtoFlags
6719
6820// Jackson Metadata Class
6921internal sealed interface JmClass {
7022 class CompanionObject (declaringClass : Class <* >, companionObject : String ) {
71- private class ReducedCompanionVisitor (companionClass : Class <* >) : ReducedKmClassVisitor() {
72- val functions: MutableList <KmFunction > = arrayListOf ()
73-
74- init {
75- companionClass.getAnnotation(Metadata ::class .java)!! .accept(this )
76- }
77-
78- override fun visitFunction (flags : Flags , name : String ): KmFunctionVisitor = KmFunction (flags, name)
79- .apply { functions.add(this ) }
80- }
81-
8223 private val companionField: Field = declaringClass.getDeclaredField(companionObject)
8324 val type: Class <* > = companionField.type
8425 val isAccessible: Boolean = companionField.isAccessible
85- private val functions by lazy { ReducedCompanionVisitor ( type) .functions }
26+ private val functions by lazy { type.toKmClass() !! .functions }
8627 val instance: Any by lazy {
8728 // To prevent the call from failing, save the initial value and then rewrite the flag.
8829 if (! companionField.isAccessible) companionField.isAccessible = true
@@ -95,7 +36,7 @@ internal sealed interface JmClass {
9536 }
9637 }
9738
98- val flags : Flags
39+ val kind : ClassKind
9940 val constructors: List <KmConstructor >
10041 val sealedSubclasses: List <ClassName >
10142 val inlineClassUnderlyingType: KmType ?
@@ -110,34 +51,35 @@ internal sealed interface JmClass {
11051
11152private class JmClassImpl (
11253 clazz : Class <* >,
113- metadata : Metadata ,
54+ kmClass : KmClass ,
11455 superJmClass : JmClass ? ,
11556 interfaceJmClasses : List <JmClass >
116- ) : ReducedKmClassVisitor(), JmClass {
117- private val allPropsMap: MutableMap <String , KmProperty > = mutableMapOf ()
57+ ) : JmClass {
58+ private val allPropsMap: Map <String , KmProperty >
11859
11960 // Defined as non-lazy because it is always read in both serialization and deserialization
12061 override val properties: List <KmProperty >
12162
122- private var companionPropName: String? = null
123- override var flags : Flags = flagsOf()
124- override val constructors: MutableList <KmConstructor > = mutableListOf ()
125- override val sealedSubclasses: MutableList <ClassName > = mutableListOf ()
126- override var inlineClassUnderlyingType: KmType ? = null
63+ private val companionPropName: String? = kmClass.companionObject
64+ override val kind : ClassKind = ClassKind .values()[ ProtoFlags . CLASS_KIND .get(kmClass.flags).number]
65+ override val constructors: List <KmConstructor > = kmClass.constructors
66+ override val sealedSubclasses: List <ClassName > = kmClass.sealedSubclasses
67+ override val inlineClassUnderlyingType: KmType ? = kmClass.inlineClassUnderlyingType
12768
12869 init {
129- metadata.accept(this )
130-
13170 // Add properties of inherited classes and interfaces
13271 // If an `interface` is implicitly implemented by an abstract class,
13372 // it is necessary to obtain a more specific type, so always add it from the abstract class first.
134- (superJmClass as JmClassImpl ? )?.allPropsMap?.forEach {
135- this .allPropsMap.putIfAbsent(it.key, it.value)
73+ val tempPropsMap = ((superJmClass as JmClassImpl ? )?.allPropsMap?.toMutableMap() ? : mutableMapOf ()).apply {
74+ kmClass.properties.forEach {
75+ this [it.name] = it
76+ }
13677 }
137- @Suppress(" UNCHECKED_CAST" )
138- (interfaceJmClasses as List <JmClassImpl >).forEach { i ->
139- i.allPropsMap.forEach {
140- this .allPropsMap.putIfAbsent(it.key, it.value)
78+
79+ allPropsMap = interfaceJmClasses.fold(tempPropsMap) { acc, cur ->
80+ val curProps = (cur as JmClassImpl ).allPropsMap
81+ acc.apply {
82+ curProps.forEach { acc.putIfAbsent(it.key, it.value) }
14183 }
14284 }
14385
@@ -178,38 +120,11 @@ private class JmClassImpl(
178120 val getterName = getter.name
179121 return properties.find { it.getterSignature?.name == getterName }
180122 }
181-
182- // KmClassVisitor
183- override fun visit (flags : Flags , name : ClassName ) {
184- this .flags = flags
185- }
186-
187- override fun visitProperty (flags : Flags , name : String , getterFlags : Flags , setterFlags : Flags ): KmPropertyVisitor =
188- KmProperty (flags, name, getterFlags, setterFlags).apply { allPropsMap[name] = this }
189-
190- override fun visitConstructor (flags : Flags ): KmConstructorVisitor =
191- KmConstructor (flags).apply { constructors.add(this ) }
192-
193- override fun visitCompanionObject (name : String ) {
194- this .companionPropName = name
195- }
196-
197- override fun visitSealedSubclass (name : ClassName ) {
198- sealedSubclasses.add(name)
199- }
200-
201- override fun visitInlineClassUnderlyingType (flags : Flags ): KmTypeVisitor =
202- KmType (flags).also { inlineClassUnderlyingType = it }
203- }
204-
205- private fun Metadata.accept (visitor : ReducedKmClassVisitor ) {
206- val (strings, proto) = JvmProtoBufUtil .readClassDataFrom(data1.takeIf (Array <* >::isNotEmpty)!! , data2)
207- proto.accept(visitor, strings)
208123}
209124
210125internal fun JmClass (
211126 clazz : Class <* >,
212- metadata : Metadata ,
127+ kmClass : KmClass ,
213128 superJmClass : JmClass ? ,
214129 interfaceJmClasses : List <JmClass >
215- ): JmClass = JmClassImpl (clazz, metadata , superJmClass, interfaceJmClasses)
130+ ): JmClass = JmClassImpl (clazz, kmClass , superJmClass, interfaceJmClasses)
0 commit comments