Fix kotlinFunction for inline reified methods in reflection
Inline functions with reified type parameters are generated as private (see AsmUtil.specialCaseVisibility), so we should treat them as "declared" in reflection to look them up via getDeclaredMethod, not getMethod #KT-14721 Fixed
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
inline fun <reified T> f() = 1
|
||||
|
||||
fun g() {}
|
||||
|
||||
class Foo {
|
||||
inline fun <reified T> h(t: T) = 1
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
assertEquals(::g, ::g.javaMethod!!.kotlinFunction)
|
||||
|
||||
val h = Foo::class.members.single { it.name == "h" } as KFunction<*>
|
||||
assertEquals(h, h.javaMethod!!.kotlinFunction)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
public final class Foo {
|
||||
public method <init>(): void
|
||||
private final method h(p0: java.lang.Object): int
|
||||
}
|
||||
|
||||
|
||||
public final class InlineReifiedFunKt {
|
||||
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||
private final static method f(): int
|
||||
public final static method g(): void
|
||||
}
|
||||
+6
@@ -13492,6 +13492,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("mappedClassIsEqualToClassLiteral.kt")
|
||||
public void testMappedClassIsEqualToClassLiteral() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt");
|
||||
|
||||
@@ -13492,6 +13492,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("mappedClassIsEqualToClassLiteral.kt")
|
||||
public void testMappedClassIsEqualToClassLiteral() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt");
|
||||
|
||||
@@ -13492,6 +13492,12 @@ public class LightAnalysisModeCodegenTestGenerated extends AbstractLightAnalysis
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("mappedClassIsEqualToClassLiteral.kt")
|
||||
public void testMappedClassIsEqualToClassLiteral() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt");
|
||||
|
||||
@@ -19,6 +19,7 @@ package kotlin.reflect.jvm.internal
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReified
|
||||
import java.lang.reflect.Constructor
|
||||
import java.lang.reflect.Member
|
||||
import java.lang.reflect.Method
|
||||
@@ -58,7 +59,11 @@ internal class KFunctionImpl private constructor(
|
||||
|
||||
override val name: String get() = descriptor.name.asString()
|
||||
|
||||
private fun isDeclared(): Boolean = Visibilities.isPrivate(descriptor.visibility)
|
||||
private fun isPrivateInBytecode(): Boolean =
|
||||
Visibilities.isPrivate(descriptor.visibility) ||
|
||||
descriptor.isInlineOnlyOrReified()
|
||||
|
||||
private fun isDeclared(): Boolean = isPrivateInBytecode()
|
||||
|
||||
override val caller: FunctionCaller<*> by ReflectProperties.lazySoft caller@ {
|
||||
val jvmSignature = RuntimeTypeMapper.mapSignature(descriptor)
|
||||
|
||||
+12
@@ -16697,6 +16697,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||
}
|
||||
|
||||
@TestMetadata("inlineReifiedFun.kt")
|
||||
public void testInlineReifiedFun() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/inlineReifiedFun.kt");
|
||||
try {
|
||||
doTest(fileName);
|
||||
}
|
||||
catch (Throwable ignore) {
|
||||
return;
|
||||
}
|
||||
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||
}
|
||||
|
||||
@TestMetadata("mappedClassIsEqualToClassLiteral.kt")
|
||||
public void testMappedClassIsEqualToClassLiteral() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/reflection/mapping/mappedClassIsEqualToClassLiteral.kt");
|
||||
|
||||
Reference in New Issue
Block a user