Skip to content

Commit 7e5ecf7

Browse files
committed
fix issue
1 parent 5663ba9 commit 7e5ecf7

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

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

+28-22
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,42 @@ import java.lang.reflect.Method
1111
import kotlin.reflect.KClass
1212
import kotlin.reflect.KFunction
1313
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.*
1815
import kotlin.reflect.jvm.internal.KotlinReflectionInternalError
16+
import kotlin.reflect.jvm.javaGetter
1917
import kotlin.reflect.jvm.javaType
2018
import kotlin.reflect.jvm.kotlinFunction
2119

2220
internal class KotlinNamesAnnotationIntrospector(val module: KotlinModule, val cache: ReflectionCache, val ignoredClassesForImplyingJsonCreator: Set<KClass<*>>) : NopAnnotationIntrospector() {
2321
// 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
4026
}
4127

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+
4250
// since 2.11: support Kotlin's way of handling "isXxx" backed properties where
4351
// logical property name needs to remain "isXxx" and not become "xxx" as with Java Beans
4452
// (see https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html and
@@ -158,5 +166,3 @@ internal class KotlinNamesAnnotationIntrospector(val module: KotlinModule, val c
158166
}
159167
}
160168
}
161-
162-
private fun AnnotatedMethod.isInlineClass() = declaringClass.declaredMethods.any { it.name.contains('-') }

0 commit comments

Comments
 (0)