@@ -11,34 +11,42 @@ import java.lang.reflect.Method
11
11
import kotlin.reflect.KClass
12
12
import kotlin.reflect.KFunction
13
13
import kotlin.reflect.KParameter
14
- import kotlin.reflect.full.companionObject
15
- import kotlin.reflect.full.declaredFunctions
16
- import kotlin.reflect.full.memberProperties
17
- import kotlin.reflect.full.primaryConstructor
14
+ import kotlin.reflect.full.*
18
15
import kotlin.reflect.jvm.internal.KotlinReflectionInternalError
16
+ import kotlin.reflect.jvm.javaGetter
19
17
import kotlin.reflect.jvm.javaType
20
18
import kotlin.reflect.jvm.kotlinFunction
21
19
22
20
internal class KotlinNamesAnnotationIntrospector (val module : KotlinModule , val cache : ReflectionCache , val ignoredClassesForImplyingJsonCreator : Set <KClass <* >>) : NopAnnotationIntrospector() {
23
21
// since 2.4
24
- override fun findImplicitPropertyName (member : AnnotatedMember ): String? {
25
- if (member is AnnotatedMethod && member.isInlineClass()) {
26
- if (member.name.startsWith(" get" ) &&
27
- member.name.contains(' -' ) &&
28
- member.parameterCount == 0 ) {
29
- return member.name.substringAfter(" get" ).decapitalize().substringBefore(' -' )
30
- } else if (member.name.startsWith(" is" ) &&
31
- member.name.contains(' -' ) &&
32
- member.parameterCount == 0 ) {
33
- return member.name.substringAfter(" is" ).decapitalize().substringBefore(' -' )
34
- }
35
- } else if (member is AnnotatedParameter ) {
36
- return findKotlinParameterName(member)
37
- }
38
-
39
- return null
22
+ override fun findImplicitPropertyName (member : AnnotatedMember ): String? = when (member) {
23
+ is AnnotatedMethod -> findImplicitPropertyNameFromKotlinPropertyIfNeeded(member)
24
+ is AnnotatedParameter -> findKotlinParameterName(member)
25
+ else -> null
40
26
}
41
27
28
+ // Since getter for value class (inline class) will be compiled into a different name such as "getFoo-${random}",
29
+ // use the property name in Kotlin in such a case.
30
+ private fun findImplicitPropertyNameFromKotlinPropertyIfNeeded (member : AnnotatedMethod ): String? = member
31
+ .takeIf {
32
+ it.parameterCount == 0 &&
33
+ it.name.run { contains(" -" ) && (startsWith(" get" ) || startsWith(" is" )) }
34
+ }?.let { _ ->
35
+ val propertyNameFromGetter = member.name.let {
36
+ when {
37
+ it.startsWith(" get" ) -> it.substringAfter(" get" )
38
+ it.startsWith(" is" ) -> it.substringAfter(" is" )
39
+ else -> throw IllegalStateException (" Should not get here." )
40
+ }
41
+ }.decapitalize()
42
+
43
+ member.declaringClass.kotlin.declaredMemberProperties.find { kProperty1 ->
44
+ kProperty1.javaGetter
45
+ ?.let { it == member.member && kProperty1.name != propertyNameFromGetter }
46
+ ? : false
47
+ }?.name
48
+ }
49
+
42
50
// since 2.11: support Kotlin's way of handling "isXxx" backed properties where
43
51
// logical property name needs to remain "isXxx" and not become "xxx" as with Java Beans
44
52
// (see https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html and
@@ -158,5 +166,3 @@ internal class KotlinNamesAnnotationIntrospector(val module: KotlinModule, val c
158
166
}
159
167
}
160
168
}
161
-
162
- private fun AnnotatedMethod.isInlineClass () = declaringClass.declaredMethods.any { it.name.contains(' -' ) }
0 commit comments