Fix for KT-3684: IllegalAccess on a private property of the outer class

#KT-3684 Fixed
This commit is contained in:
Mikhael Bogdanov
2013-06-18 10:55:53 +04:00
parent 03a818f732
commit 8ac8798266
3 changed files with 25 additions and 3 deletions
@@ -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");