@@ -2,19 +2,17 @@ package com.fasterxml.jackson.module.kotlin
2
2
3
3
import com.fasterxml.jackson.annotation.JsonCreator
4
4
import com.fasterxml.jackson.annotation.JsonProperty
5
- import com.fasterxml.jackson.databind.PropertyName
6
- import com.fasterxml.jackson.databind.cfg.MapperConfig
7
5
import com.fasterxml.jackson.databind.introspect.Annotated
8
6
import com.fasterxml.jackson.databind.introspect.AnnotatedConstructor
9
7
import com.fasterxml.jackson.databind.introspect.AnnotatedField
10
8
import com.fasterxml.jackson.databind.introspect.AnnotatedMember
11
9
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
12
10
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter
13
11
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
14
- import com.fasterxml.jackson.databind.util.BeanUtil
12
+ import kotlinx.metadata.jvm.fieldSignature
13
+ import kotlinx.metadata.jvm.getterSignature
15
14
import java.lang.reflect.Constructor
16
15
import java.lang.reflect.Method
17
- import java.util.Locale
18
16
import kotlin.reflect.KClass
19
17
import kotlin.reflect.KFunction
20
18
import kotlin.reflect.KParameter
@@ -30,35 +28,35 @@ import kotlin.reflect.jvm.kotlinFunction
30
28
internal class KotlinNamesAnnotationIntrospector (val module : KotlinModule , val cache : ReflectionCache , val ignoredClassesForImplyingJsonCreator : Set <KClass <* >>) : NopAnnotationIntrospector() {
31
29
// since 2.4
32
30
override fun findImplicitPropertyName (member : AnnotatedMember ): String? = when (member) {
33
- is AnnotatedMethod -> if (member.name.contains(' -' ) && member.parameterCount == 0 ) {
34
- when {
35
- member.name.startsWith(" get" ) -> member.name.substringAfter(" get" )
36
- member.name.startsWith(" is" ) -> member.name.substringAfter(" is" )
37
- else -> null
38
- }?.replaceFirstChar { it.lowercase(Locale .getDefault()) }?.substringBefore(' -' )
39
- } else null
31
+ is AnnotatedMethod -> member.annotated.declaringClass.toKmClass()?.let { kmClass ->
32
+ val methodSignature = member.annotated.toSignature()
33
+
34
+ kmClass.properties.find { it.getterSignature == methodSignature }?.name
35
+ }
36
+ is AnnotatedField -> member.annotated.declaringClass.toKmClass()?.let { kmClass ->
37
+ val fieldSignature = member.annotated.toSignature()
38
+
39
+ kmClass.properties.find { it.fieldSignature == fieldSignature }?.name
40
+ }
40
41
is AnnotatedParameter -> findKotlinParameterName(member)
41
42
else -> null
42
43
}
43
44
44
- // since 2.11: support Kotlin's way of handling "isXxx" backed properties where
45
- // logical property name needs to remain "isXxx" and not become "xxx" as with Java Beans
46
- // (see https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html and
47
- // https://github.com/FasterXML/jackson-databind/issues/2527
48
- // for details)
49
- override fun findRenameByField (
50
- config : MapperConfig <* >,
51
- field : AnnotatedField ,
52
- implName : PropertyName
53
- ): PropertyName ? {
54
- val origSimple = implName.simpleName
55
- if (field.declaringClass.isKotlinClass() && origSimple.startsWith(" is" )) {
56
- val mangledName: String? = BeanUtil .stdManglePropertyName(origSimple, 2 )
57
- if ((mangledName != null ) && ! mangledName.equals(origSimple)) {
58
- return PropertyName .construct(mangledName)
59
- }
60
- }
61
- return null
45
+ // If it is not a property on Kotlin, it is not used to serialization
46
+ override fun findPropertyAccess (ann : Annotated ): JsonProperty .Access ? = when (ann) {
47
+ is AnnotatedMethod ->
48
+ ann.annotated
49
+ .takeIf { it.parameters.isEmpty() } // Ignore target is only getter
50
+ ?.let { method ->
51
+ method.declaringClass.toKmClass()?.let { kmClass ->
52
+ val methodSignature = method.toSignature()
53
+
54
+ JsonProperty .Access .WRITE_ONLY .takeIf {
55
+ kmClass.properties.none { it.getterSignature == methodSignature }
56
+ }
57
+ }
58
+ }
59
+ else -> null
62
60
}
63
61
64
62
@Suppress(" UNCHECKED_CAST" )
0 commit comments