Fix handling of value class with private constructor
See gh-32536
This commit is contained in:
@@ -319,7 +319,9 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||
KType type = parameter.getType();
|
||||
if (!(type.isMarkedNullable() && arg == null) && type.getClassifier() instanceof KClass<?> kClass
|
||||
&& KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) {
|
||||
arg = KClasses.getPrimaryConstructor(kClass).call(arg);
|
||||
KFunction<?> valueClassConstructor = KClasses.getPrimaryConstructor(kClass);
|
||||
KCallablesJvm.setAccessible(valueClassConstructor, true);
|
||||
arg = valueClassConstructor.call(arg);
|
||||
}
|
||||
argMap.put(parameter, arg);
|
||||
}
|
||||
|
||||
@@ -112,6 +112,13 @@ class InvocableHandlerMethodKotlinTests {
|
||||
Assertions.assertThat(value).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun valueClassWithPrivateConstructor() {
|
||||
composite.addResolver(StubArgumentResolver(Char::class.java, 'a'))
|
||||
val value = getInvocable(ValueClassHandler::class.java, Char::class.java).invokeForRequest(request, null)
|
||||
Assertions.assertThat(value).isEqualTo('a')
|
||||
}
|
||||
|
||||
@Test
|
||||
fun propertyAccessor() {
|
||||
val value = getInvocable(PropertyAccessorHandler::class.java).invokeForRequest(request, null)
|
||||
@@ -191,6 +198,8 @@ class InvocableHandlerMethodKotlinTests {
|
||||
fun valueClassWithNullable(limit: LongValueClass?) =
|
||||
limit?.value
|
||||
|
||||
fun valueClassWithPrivateConstructor(limit: ValueClassWithPrivateConstructor) =
|
||||
limit.value
|
||||
}
|
||||
|
||||
private class PropertyAccessorHandler {
|
||||
@@ -238,6 +247,13 @@ class InvocableHandlerMethodKotlinTests {
|
||||
}
|
||||
}
|
||||
|
||||
@JvmInline
|
||||
value class ValueClassWithPrivateConstructor private constructor(val value: Char) {
|
||||
companion object {
|
||||
fun from(value: Char) = ValueClassWithPrivateConstructor(value)
|
||||
}
|
||||
}
|
||||
|
||||
class CustomException(message: String) : Throwable(message)
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user