11package io.github.projectmapk.jackson.module.kogera.annotationIntrospector
22
3- import com.fasterxml.jackson.annotation.JsonCreator
4- import com.fasterxml.jackson.annotation.JsonProperty
53import com.fasterxml.jackson.databind.JavaType
6- import com.fasterxml.jackson.databind.cfg.MapperConfig
74import com.fasterxml.jackson.databind.introspect.Annotated
8- import com.fasterxml.jackson.databind.introspect.AnnotatedConstructor
95import com.fasterxml.jackson.databind.introspect.AnnotatedField
106import com.fasterxml.jackson.databind.introspect.AnnotatedMember
117import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
@@ -14,17 +10,13 @@ import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
1410import com.fasterxml.jackson.databind.jsontype.NamedType
1511import io.github.projectmapk.jackson.module.kogera.JSON_PROPERTY_CLASS
1612import io.github.projectmapk.jackson.module.kogera.ReflectionCache
17- import io.github.projectmapk.jackson.module.kogera.hasCreatorAnnotation
1813import io.github.projectmapk.jackson.module.kogera.jmClass.JmClass
1914import io.github.projectmapk.jackson.module.kogera.jmClass.JmProperty
20- import io.github.projectmapk.jackson.module.kogera.jmClass.JmValueParameter
2115import io.github.projectmapk.jackson.module.kogera.reconstructClass
2216import io.github.projectmapk.jackson.module.kogera.toSignature
2317import kotlinx.metadata.isNullable
2418import java.lang.reflect.Constructor
25- import java.lang.reflect.Executable
2619import java.lang.reflect.Method
27- import java.lang.reflect.Modifier
2820
2921// AnnotationIntrospector that overrides the behavior of the default AnnotationIntrospector
3022// (in most cases, JacksonAnnotationIntrospector).
@@ -115,54 +107,4 @@ internal class KotlinPrimaryAnnotationIntrospector(
115107 override fun findSubtypes (a : Annotated ): List <NamedType >? = cache.getJmClass(a.rawType)?.let { jmClass ->
116108 jmClass.sealedSubclasses.map { NamedType (it.reconstructClass()) }.ifEmpty { null }
117109 }
118-
119- // Return Mode.DEFAULT if ann is a Primary Constructor and the condition is satisfied.
120- // Currently, there is no way to define the priority of a Creator,
121- // so the presence or absence of a JsonCreator is included in the decision.
122- // The reason for overriding the JacksonAnnotationIntrospector is to reduce overhead.
123- // In rare cases, a problem may occur,
124- // but it is assumed that the problem can be solved by adjusting the order of module registration.
125- override fun findCreatorAnnotation (config : MapperConfig <* >, ann : Annotated ): JsonCreator .Mode ? {
126- (ann as ? AnnotatedConstructor )?.takeIf { 0 < it.parameterCount } ? : return null
127-
128- val declaringClass = ann.declaringClass
129- val jmClass = declaringClass.takeIf { ! it.isEnum }
130- ?.let { cache.getJmClass(it) }
131- ? : return null
132-
133- return JsonCreator .Mode .DEFAULT
134- .takeIf { ann.annotated.isPrimarilyConstructorOf(jmClass) && ! hasCreator(declaringClass, jmClass) }
135- }
136- }
137-
138- private fun Constructor <* >.isPrimarilyConstructorOf (jmClass : JmClass ): Boolean = jmClass.findJmConstructor(this )
139- ?.let { ! it.isSecondary || jmClass.constructors.size == 1 } == true
140-
141- private fun isPossibleSingleString (
142- kotlinParams : List <JmValueParameter >,
143- javaFunction : Executable ,
144- propertyNames : Set <String >
145- ): Boolean = kotlinParams.size == 1 &&
146- kotlinParams[0 ].let { it.name !in propertyNames && it.isString } &&
147- javaFunction.parameters[0 ].annotations.none { it is JsonProperty }
148-
149- private fun hasCreatorConstructor (clazz : Class <* >, jmClass : JmClass , propertyNames : Set <String >): Boolean {
150- val kmConstructorMap = jmClass.constructors.associateBy { it.signature?.descriptor }
151-
152- return clazz.constructors.any { constructor ->
153- val kmConstructor = kmConstructorMap[constructor .toSignature().descriptor] ? : return @any false
154-
155- ! isPossibleSingleString(kmConstructor.valueParameters, constructor , propertyNames) &&
156- constructor .hasCreatorAnnotation()
157- }
158- }
159-
160- // In the original, `isPossibleSingleString` comparison was disabled,
161- // and if enabled, the behavior would have changed, so the comparison is skipped.
162- private fun hasCreatorFunction (clazz : Class <* >): Boolean = clazz.declaredMethods
163- .any { Modifier .isStatic(it.modifiers) && it.hasCreatorAnnotation() }
164-
165- private fun hasCreator (clazz : Class <* >, jmClass : JmClass ): Boolean {
166- val propertyNames = jmClass.propertyNameSet
167- return hasCreatorConstructor(clazz, jmClass, propertyNames) || hasCreatorFunction(clazz)
168110}
0 commit comments