Fix for KT-10590: IllegalAccessError when protected getter of Java base class is accessed from lambda using property access syntax

This commit is contained in:
Michael Bogdanov
2016-01-25 13:02:42 +03:00
parent 9d66852ae2
commit cf09949354
6 changed files with 86 additions and 2 deletions
@@ -2213,9 +2213,11 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
StackValue receiver
) {
Type type = typeMapper.mapType(propertyDescriptor.getOriginal().getType());
CallableMethod callableGetter = typeMapper.mapToCallableMethod(propertyDescriptor.getGetMethod(), false);
CallableMethod callableGetter =
typeMapper.mapToCallableMethod(context.accessibleDescriptor(propertyDescriptor.getGetMethod(), null), false);
FunctionDescriptor setMethod = propertyDescriptor.getSetMethod();
CallableMethod callableSetter = setMethod != null ? typeMapper.mapToCallableMethod(setMethod, false) : null;
CallableMethod callableSetter =
setMethod != null ? typeMapper.mapToCallableMethod(context.accessibleDescriptor(setMethod, null), false) : null;
return StackValue.property(propertyDescriptor, null, type, false, null, callableGetter, callableSetter, state, receiver);
}
@@ -0,0 +1,12 @@
public class JavaBaseClass {
private String field = "fail";
protected String getFoo() {
return field;
}
protected void setFoo(String foo) {
field = foo;
}
}
@@ -0,0 +1,19 @@
package z
import JavaBaseClass
object KotlinExtender : JavaBaseClass() {
@JvmStatic fun test(): String {
return runSlowly {
foo = "OK"
foo
}
}
}
fun runSlowly(f: () -> String): String {
return f()
}
fun box(): String {
return KotlinExtender.test()
}
@@ -0,0 +1,12 @@
public class JavaBaseClass {
private String field = "fail";
protected String getFoo() {
return field;
}
protected void setFoo(String foo) {
field = foo;
}
}
@@ -0,0 +1,27 @@
package z
import JavaBaseClass
class A {
@JvmField var foo = "fail"
companion object : JavaBaseClass() {
@JvmStatic fun test(): String {
return runSlowly {
foo = "OK"
foo
}
}
}
}
fun runSlowly(f: () -> String): String {
return f()
}
fun box(): String {
val a = A()
a.foo = "Kotlin"
if (a.foo != "Kotlin") return "fail"
return A.test()
}
@@ -547,6 +547,18 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege
doTestWithJava(fileName);
}
@TestMetadata("protectedJavaProperty")
public void testProtectedJavaProperty() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/properties/protectedJavaProperty/");
doTestWithJava(fileName);
}
@TestMetadata("protectedJavaPropertyInCompanion")
public void testProtectedJavaPropertyInCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/properties/protectedJavaPropertyInCompanion/");
doTestWithJava(fileName);
}
@TestMetadata("substituteJavaSuperField")
public void testSubstituteJavaSuperField() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/properties/substituteJavaSuperField/");