Fix KFunction.javaMethod for property accessors
This commit is contained in:
+34
@@ -0,0 +1,34 @@
|
|||||||
|
import kotlin.reflect.jvm.*
|
||||||
|
import kotlin.test.*
|
||||||
|
|
||||||
|
var foo = "foo"
|
||||||
|
|
||||||
|
class A {
|
||||||
|
var bar = "bar"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val fooGetter = ::foo.getter.javaMethod ?: return "Fail fooGetter"
|
||||||
|
assertEquals("foo", fooGetter.invoke(null))
|
||||||
|
|
||||||
|
val fooSetter = ::foo.setter.javaMethod ?: return "Fail fooSetter"
|
||||||
|
fooSetter.invoke(null, "foof")
|
||||||
|
assertEquals("foof", foo)
|
||||||
|
|
||||||
|
assertNull(::foo.getter.javaConstructor)
|
||||||
|
assertNull(::foo.setter.javaConstructor)
|
||||||
|
|
||||||
|
|
||||||
|
val a = A()
|
||||||
|
val barGetter = A::bar.getter.javaMethod ?: return "Fail barGetter"
|
||||||
|
assertEquals("bar", barGetter.invoke(a))
|
||||||
|
|
||||||
|
val barSetter = A::bar.setter.javaMethod ?: return "Fail barSetter"
|
||||||
|
barSetter.invoke(a, "barb")
|
||||||
|
assertEquals("barb", a.bar)
|
||||||
|
|
||||||
|
assertNull(A::bar.getter.javaConstructor)
|
||||||
|
assertNull(A::bar.setter.javaConstructor)
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -3237,6 +3237,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("propertyAccessors.kt")
|
||||||
|
public void testPropertyAccessors() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/propertyAccessors.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("syntheticFields.kt")
|
@TestMetadata("syntheticFields.kt")
|
||||||
public void testSyntheticFields() throws Exception {
|
public void testSyntheticFields() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/syntheticFields.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/syntheticFields.kt");
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ interface KMutablePropertyImpl<R> : KMutableProperty<R>, KPropertyImpl<R> {
|
|||||||
override val setter: Setter<R>
|
override val setter: Setter<R>
|
||||||
|
|
||||||
abstract class Setter<R> : KMutableProperty.Setter<R>, KPropertyImpl.Accessor<R>, KCallableImpl<Unit> {
|
abstract class Setter<R> : KMutableProperty.Setter<R>, KPropertyImpl.Accessor<R>, KCallableImpl<Unit> {
|
||||||
|
abstract override val property: KMutablePropertyImpl<R>
|
||||||
|
|
||||||
override val name: String get() = "<set-${property.name}>"
|
override val name: String get() = "<set-${property.name}>"
|
||||||
|
|
||||||
override val descriptor: PropertySetterDescriptor by ReflectProperties.lazySoft {
|
override val descriptor: PropertySetterDescriptor by ReflectProperties.lazySoft {
|
||||||
|
|||||||
@@ -68,7 +68,12 @@ public val KMutableProperty<*>.javaSetter: Method?
|
|||||||
* or `null` if this function is a constructor or cannot be represented by a Java [Method].
|
* or `null` if this function is a constructor or cannot be represented by a Java [Method].
|
||||||
*/
|
*/
|
||||||
public val KFunction<*>.javaMethod: Method?
|
public val KFunction<*>.javaMethod: Method?
|
||||||
get() = ((this as? KFunctionImpl)?.caller as? FunctionCaller.Method)?.method
|
get() = when (this) {
|
||||||
|
is KFunctionImpl -> (caller as? FunctionCaller.Method)?.method
|
||||||
|
is KPropertyImpl.Getter<*> -> property.javaGetter
|
||||||
|
is KMutablePropertyImpl.Setter<*> -> property.javaSetter
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a Java [Constructor] instance corresponding to the given Kotlin function,
|
* Returns a Java [Constructor] instance corresponding to the given Kotlin function,
|
||||||
@@ -76,7 +81,10 @@ public val KFunction<*>.javaMethod: Method?
|
|||||||
*/
|
*/
|
||||||
@suppress("UNCHECKED_CAST")
|
@suppress("UNCHECKED_CAST")
|
||||||
public val <T> KFunction<T>.javaConstructor: Constructor<T>?
|
public val <T> KFunction<T>.javaConstructor: Constructor<T>?
|
||||||
get() = ((this as? KFunctionImpl)?.caller as? FunctionCaller.Constructor)?.constructor as? Constructor<T>
|
get() = when (this) {
|
||||||
|
is KFunctionImpl -> (caller as? FunctionCaller.Constructor)?.constructor as? Constructor<T>
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user