Fix KCallable#callBy to JvmStatic companion object members
#KT-12915 Fixed
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
// WITH_REFLECT
|
||||||
|
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class C {
|
||||||
|
companion object {
|
||||||
|
fun foo(a: String, b: String = "b") = a + b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val f = C.Companion::class.members.single { it.name == "foo" }
|
||||||
|
|
||||||
|
// Any object method currently requires the object instance passed
|
||||||
|
try {
|
||||||
|
f.callBy(mapOf(
|
||||||
|
f.parameters.single { it.name == "a" } to "a"
|
||||||
|
))
|
||||||
|
return "Fail: IllegalArgumentException should have been thrown"
|
||||||
|
}
|
||||||
|
catch (e: IllegalArgumentException) {
|
||||||
|
// OK
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals("ab", f.callBy(mapOf(
|
||||||
|
f.parameters.first() to C,
|
||||||
|
f.parameters.single { it.name == "a" } to "a"
|
||||||
|
)))
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
// WITH_REFLECT
|
||||||
|
|
||||||
|
// KT-12915 IAE on callBy of JvmStatic function with default arguments
|
||||||
|
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class C {
|
||||||
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
fun foo(a: String, b: String = "b") = a + b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val f = C.Companion::class.members.single { it.name == "foo" }
|
||||||
|
|
||||||
|
// Any object method currently requires the object instance passed
|
||||||
|
try {
|
||||||
|
f.callBy(mapOf(
|
||||||
|
f.parameters.single { it.name == "a" } to "a"
|
||||||
|
))
|
||||||
|
return "Fail: IllegalArgumentException should have been thrown"
|
||||||
|
}
|
||||||
|
catch (e: IllegalArgumentException) {
|
||||||
|
// OK
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals("ab", f.callBy(mapOf(
|
||||||
|
f.parameters.first() to C,
|
||||||
|
f.parameters.single { it.name == "a" } to "a"
|
||||||
|
)))
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -11259,6 +11259,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/reflection/callBy"), Pattern.compile("^(.+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/reflection/callBy"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("companionObject.kt")
|
||||||
|
public void testCompanionObject() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/callBy/companionObject.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("defaultAndNonDefaultIntertwined.kt")
|
@TestMetadata("defaultAndNonDefaultIntertwined.kt")
|
||||||
public void testDefaultAndNonDefaultIntertwined() throws Exception {
|
public void testDefaultAndNonDefaultIntertwined() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/callBy/defaultAndNonDefaultIntertwined.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/callBy/defaultAndNonDefaultIntertwined.kt");
|
||||||
@@ -11271,6 +11277,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jvmStaticInCompanionObject.kt")
|
||||||
|
public void testJvmStaticInCompanionObject() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/callBy/jvmStaticInCompanionObject.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jvmStaticInObject.kt")
|
@TestMetadata("jvmStaticInObject.kt")
|
||||||
public void testJvmStaticInObject() throws Exception {
|
public void testJvmStaticInObject() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/callBy/jvmStaticInObject.kt");
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package kotlin.reflect.jvm.internal
|
package kotlin.reflect.jvm.internal
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import java.lang.reflect.Constructor
|
import java.lang.reflect.Constructor
|
||||||
@@ -89,7 +90,11 @@ internal open class KFunctionImpl protected constructor(
|
|||||||
when (member) {
|
when (member) {
|
||||||
is Constructor<*> -> FunctionCaller.Constructor(member)
|
is Constructor<*> -> FunctionCaller.Constructor(member)
|
||||||
is Method -> when {
|
is Method -> when {
|
||||||
descriptor.annotations.findAnnotation(JVM_STATIC) != null ->
|
// Note that static $default methods for @JvmStatic functions are generated differently in objects and companion objects.
|
||||||
|
// In objects, $default's signature does _not_ contain the additional object instance parameter,
|
||||||
|
// as opposed to companion objects where the first parameter is the companion object instance.
|
||||||
|
descriptor.annotations.findAnnotation(JVM_STATIC) != null &&
|
||||||
|
!(descriptor.containingDeclaration as ClassDescriptor).isCompanionObject ->
|
||||||
FunctionCaller.JvmStaticInObject(member)
|
FunctionCaller.JvmStaticInObject(member)
|
||||||
|
|
||||||
else -> FunctionCaller.StaticMethod(member)
|
else -> FunctionCaller.StaticMethod(member)
|
||||||
|
|||||||
Reference in New Issue
Block a user