Skip to content

Commit

Permalink
Support for value classes
Browse files Browse the repository at this point in the history
resolve: FasterXML#199
  • Loading branch information
wplong11 committed Aug 3, 2023
1 parent 423fc83 commit 8bb23d2
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,11 @@ internal class KotlinNamesAnnotationIntrospector(
if (member is Constructor<*>) {
val ctor = (member as Constructor<Any>)
val ctorParmCount = ctor.parameterTypes.size
val ktorParmCount = try { ctor.kotlinFunction?.parameters?.size ?: 0 }
val ktorParmCount = try { ctor.kotlinCtor?.parameters?.size ?: 0 }
catch (ex: KotlinReflectionInternalError) { 0 }
catch (ex: UnsupportedOperationException) { 0 }
if (ktorParmCount > 0 && ktorParmCount == ctorParmCount) {
ctor.kotlinFunction?.parameters?.get(param.index)?.name
ctor.kotlinCtor?.parameters?.get(param.index)?.name
} else {
null
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.fasterxml.jackson.module.kotlin

import java.lang.reflect.Constructor
import kotlin.reflect.KFunction
import kotlin.reflect.jvm.javaConstructor

val <T : Any> Constructor<T>.kotlinCtor: KFunction<T>?
get() {
val kotlinClass = declaringClass.kotlin
return if (kotlinClass.isValue) {
val parameterTypes = this.parameters.map { p -> p.type }
kotlinClass.constructors.firstOrNull { it.parameters.map { p -> p.type.erasedType() } == parameterTypes }
} else {
kotlinClass.constructors.firstOrNull { it.javaConstructor == this }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ internal class ReflectionCache(reflectionCacheSize: Int) : Serializable {
LRUMap(0, reflectionCacheSize)

fun kotlinFromJava(key: Constructor<Any>): KFunction<Any>? = javaConstructorToKotlin.get(key)
?: key.kotlinFunction?.let { javaConstructorToKotlin.putIfAbsent(key, it) ?: it }
?: key.kotlinCtor?.let { javaConstructorToKotlin.putIfAbsent(key, it) ?: it }

fun kotlinFromJava(key: Method): KFunction<*>? = javaMethodToKotlin.get(key)
?: key.kotlinFunction?.let { javaMethodToKotlin.putIfAbsent(key, it) ?: it }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.fasterxml.jackson.module.kotlin.test

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.kotlinModule
import org.junit.Assert
import org.junit.Test

class ValueClassTest {
@JvmInline
value class TestClass(val foo: List<Int>)

@Test
fun `test value class`() {
val mapper = createMapper()
Assert.assertEquals(listOf(1, 2), mapper.readValue("""{"foo": [1,2]}""", TestClass::class.java).foo)
}

private fun createMapper(): ObjectMapper {
return ObjectMapper().registerModule(kotlinModule())
}
}

0 comments on commit 8bb23d2

Please sign in to comment.