Skip to content

Commit 858e0c2

Browse files
committed
fix issue
1 parent b16059c commit 858e0c2

File tree

1 file changed

+28
-26
lines changed

1 file changed

+28
-26
lines changed

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,42 @@ import java.util.Locale
1818
import kotlin.reflect.KClass
1919
import kotlin.reflect.KFunction
2020
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.*
2522
import kotlin.reflect.jvm.internal.KotlinReflectionInternalError
23+
import kotlin.reflect.jvm.javaGetter
2624
import kotlin.reflect.jvm.javaType
2725
import kotlin.reflect.jvm.kotlinFunction
2826

2927
internal class KotlinNamesAnnotationIntrospector(val module: KotlinModule, val cache: ReflectionCache, val ignoredClassesForImplyingJsonCreator: Set<KClass<*>>) : NopAnnotationIntrospector() {
3028
// 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
5133
}
5234

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+
5357
// since 2.11: support Kotlin's way of handling "isXxx" backed properties where
5458
// logical property name needs to remain "isXxx" and not become "xxx" as with Java Beans
5559
// (see https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html and
@@ -169,5 +173,3 @@ internal class KotlinNamesAnnotationIntrospector(val module: KotlinModule, val c
169173
}
170174
}
171175
}
172-
173-
private fun AnnotatedMethod.isInlineClass() = declaringClass.declaredMethods.any { it.name.contains('-') }

0 commit comments

Comments
 (0)