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
|
StackValue receiver
|
||||||
) {
|
) {
|
||||||
Type type = typeMapper.mapType(propertyDescriptor.getOriginal().getType());
|
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();
|
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);
|
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);
|
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")
|
@TestMetadata("substituteJavaSuperField")
|
||||||
public void testSubstituteJavaSuperField() throws Exception {
|
public void testSubstituteJavaSuperField() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/properties/substituteJavaSuperField/");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/properties/substituteJavaSuperField/");
|
||||||
|
|||||||
Reference in New Issue
Block a user