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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
public class JavaBaseClass {
|
||||
|
||||
private String field = "fail";
|
||||
|
||||
protected String getFoo() {
|
||||
return field;
|
||||
}
|
||||
|
||||
protected void setFoo(String foo) {
|
||||
field = foo;
|
||||
}
|
||||
}
|
||||
+19
@@ -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()
|
||||
}
|
||||
compiler/testData/codegen/boxWithJava/properties/protectedJavaPropertyInCompanion/JavaBaseClass.java
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
public class JavaBaseClass {
|
||||
|
||||
private String field = "fail";
|
||||
|
||||
protected String getFoo() {
|
||||
return field;
|
||||
}
|
||||
|
||||
protected void setFoo(String foo) {
|
||||
field = foo;
|
||||
}
|
||||
}
|
||||
Vendored
+27
@@ -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()
|
||||
}
|
||||
+12
@@ -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/");
|
||||
|
||||
Reference in New Issue
Block a user