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