Fix mapping of jvmStatic functions
#KT-8800 Fixed
This commit is contained in:
compiler/testData/codegen/boxWithStdlib/reflection/mapping/platformStatic/companionObjectFunction.kt
Vendored
+33
@@ -0,0 +1,33 @@
|
|||||||
|
import kotlin.platform.platformStatic as static
|
||||||
|
import kotlin.reflect.jvm.*
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.failsWith
|
||||||
|
|
||||||
|
class C {
|
||||||
|
companion object {
|
||||||
|
@static fun foo(s: String): Int = s.length()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val foo = C.Companion::foo
|
||||||
|
|
||||||
|
val j = foo.javaMethod ?: return "Fail: no Java method found for C::foo"
|
||||||
|
assertEquals(3, j.invoke(C, "abc"))
|
||||||
|
|
||||||
|
val k = j.kotlinFunction ?: return "Fail: no Kotlin function found for Java method C::foo"
|
||||||
|
assertEquals(3, k.call(C, "def"))
|
||||||
|
|
||||||
|
|
||||||
|
val staticMethod = javaClass<C>().getDeclaredMethod("foo", javaClass<String>())
|
||||||
|
val k2 = staticMethod.kotlinFunction ?:
|
||||||
|
return "Fail: no Kotlin function found for static bridge for @jvmStatic method in companion object C::foo"
|
||||||
|
assertEquals(3, k2.call(C, "ghi"))
|
||||||
|
|
||||||
|
failsWith(javaClass<NullPointerException>()) { k2.call(null, "")!! }
|
||||||
|
|
||||||
|
val j2 = k2.javaMethod
|
||||||
|
assertEquals(j, j2)
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+19
@@ -0,0 +1,19 @@
|
|||||||
|
import kotlin.platform.platformStatic as static
|
||||||
|
import kotlin.reflect.jvm.*
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
object O {
|
||||||
|
@static fun foo(s: String): Int = s.length()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val foo = O::foo
|
||||||
|
|
||||||
|
val j = foo.javaMethod ?: return "Fail: no Java method found for O::foo"
|
||||||
|
assertEquals(3, j.invoke(null, "abc"))
|
||||||
|
|
||||||
|
val k = j.kotlinFunction ?: return "Fail: no Kotlin function found for Java method O::foo"
|
||||||
|
assertEquals(3, k.call(O, "def"))
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+21
@@ -3396,6 +3396,27 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/platformStatic")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class PlatformStatic extends AbstractBlackBoxCodegenTest {
|
||||||
|
public void testAllFilesPresentInPlatformStatic() throws Exception {
|
||||||
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/mapping/platformStatic"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("companionObjectFunction.kt")
|
||||||
|
public void testCompanionObjectFunction() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/platformStatic/companionObjectFunction.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("objectFunction.kt")
|
||||||
|
public void testObjectFunction() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/platformStatic/objectFunction.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/types")
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/types")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
@@ -17,8 +17,12 @@
|
|||||||
package kotlin.reflect.jvm
|
package kotlin.reflect.jvm
|
||||||
|
|
||||||
import java.lang.reflect.*
|
import java.lang.reflect.*
|
||||||
|
import java.util.*
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
import kotlin.reflect.jvm.internal.*
|
import kotlin.reflect.jvm.internal.KCallableImpl
|
||||||
|
import kotlin.reflect.jvm.internal.KPackageImpl
|
||||||
|
import kotlin.reflect.jvm.internal.KPropertyImpl
|
||||||
|
import kotlin.reflect.jvm.internal.KTypeImpl
|
||||||
|
|
||||||
// Kotlin reflection -> Java reflection
|
// Kotlin reflection -> Java reflection
|
||||||
|
|
||||||
@@ -115,15 +119,26 @@ public val Field.kotlinProperty: KProperty<*>?
|
|||||||
*/
|
*/
|
||||||
public val Method.kotlinFunction: KFunction<*>?
|
public val Method.kotlinFunction: KFunction<*>?
|
||||||
get() {
|
get() {
|
||||||
if (isSynthetic()) return null
|
if (isSynthetic) return null
|
||||||
|
|
||||||
if (Modifier.isStatic(getModifiers())) {
|
if (Modifier.isStatic(modifiers)) {
|
||||||
getDeclaringClass().kotlinPackage?.let { pkg ->
|
val kotlinPackage = declaringClass.kotlinPackage
|
||||||
return pkg.functions.firstOrNull { it.javaMethod == this }
|
if (kotlinPackage != null) {
|
||||||
|
return kotlinPackage.functions.firstOrNull { it.javaMethod == this }
|
||||||
|
}
|
||||||
|
|
||||||
|
// For static bridge method generated for a jvmStatic function in the companion object, also try to find the latter
|
||||||
|
val companion = declaringClass.kotlin.companionObject
|
||||||
|
if (companion != null) {
|
||||||
|
companion.functions.firstOrNull {
|
||||||
|
val m = it.javaMethod
|
||||||
|
m != null && m.name == this.name &&
|
||||||
|
Arrays.equals(m.parameterTypes, this.parameterTypes) && m.returnType == this.returnType
|
||||||
|
}?.let { return it }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return getDeclaringClass().kotlin.functions.firstOrNull { it.javaMethod == this }
|
return declaringClass.kotlin.functions.firstOrNull { it.javaMethod == this }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user