Fix for KT-3684: IllegalAccess on a private property of the outer class
#KT-3684 Fixed
This commit is contained in:
@@ -252,7 +252,7 @@ public class OverrideResolver {
|
||||
@NotNull ClassDescriptor current,
|
||||
@NotNull DescriptorSink sink
|
||||
) {
|
||||
Collection<CallableMemberDescriptor> visibleOverridables = filterVisible(current, overridables);
|
||||
Collection<CallableMemberDescriptor> visibleOverridables = filterVisibleFakeOverrides(current, overridables);
|
||||
Modality modality = getMinimalModality(visibleOverridables);
|
||||
boolean allInvisible = visibleOverridables.isEmpty();
|
||||
Collection<CallableMemberDescriptor> effectiveOverridden = allInvisible ? overridables : visibleOverridables;
|
||||
@@ -277,14 +277,15 @@ public class OverrideResolver {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static Collection<CallableMemberDescriptor> filterVisible(
|
||||
private static Collection<CallableMemberDescriptor> filterVisibleFakeOverrides(
|
||||
@NotNull final ClassDescriptor current,
|
||||
@NotNull Collection<CallableMemberDescriptor> toFilter
|
||||
) {
|
||||
return Collections2.filter(toFilter, new Predicate<CallableMemberDescriptor>() {
|
||||
@Override
|
||||
public boolean apply(@Nullable CallableMemberDescriptor descriptor) {
|
||||
return Visibilities.isVisible(descriptor, current);
|
||||
//nested class could capture private member, so check for private visibility added
|
||||
return descriptor.getVisibility() != Visibilities.PRIVATE && Visibilities.isVisible(descriptor, current);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
open class X(private val n: String) {
|
||||
|
||||
fun foo(): String {
|
||||
return object : X("inner") {
|
||||
fun print(): String {
|
||||
return n;
|
||||
}
|
||||
}.print()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun box() : String {
|
||||
return X("OK").foo()
|
||||
}
|
||||
|
||||
@@ -3168,6 +3168,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
doTest("compiler/testData/codegen/box/objects/kt3238.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt3684.kt")
|
||||
public void testKt3684() throws Exception {
|
||||
doTest("compiler/testData/codegen/box/objects/kt3684.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt535.kt")
|
||||
public void testKt535() throws Exception {
|
||||
doTest("compiler/testData/codegen/box/objects/kt535.kt");
|
||||
|
||||
Reference in New Issue
Block a user