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 ClassDescriptor current,
@NotNull DescriptorSink sink @NotNull DescriptorSink sink
) { ) {
Collection<CallableMemberDescriptor> visibleOverridables = filterVisible(current, overridables); Collection<CallableMemberDescriptor> visibleOverridables = filterVisibleFakeOverrides(current, overridables);
Modality modality = getMinimalModality(visibleOverridables); Modality modality = getMinimalModality(visibleOverridables);
boolean allInvisible = visibleOverridables.isEmpty(); boolean allInvisible = visibleOverridables.isEmpty();
Collection<CallableMemberDescriptor> effectiveOverridden = allInvisible ? overridables : visibleOverridables; Collection<CallableMemberDescriptor> effectiveOverridden = allInvisible ? overridables : visibleOverridables;
@@ -277,14 +277,15 @@ public class OverrideResolver {
} }
@NotNull @NotNull
private static Collection<CallableMemberDescriptor> filterVisible( private static Collection<CallableMemberDescriptor> filterVisibleFakeOverrides(
@NotNull final ClassDescriptor current, @NotNull final ClassDescriptor current,
@NotNull Collection<CallableMemberDescriptor> toFilter @NotNull Collection<CallableMemberDescriptor> toFilter
) { ) {
return Collections2.filter(toFilter, new Predicate<CallableMemberDescriptor>() { return Collections2.filter(toFilter, new Predicate<CallableMemberDescriptor>() {
@Override @Override
public boolean apply(@Nullable CallableMemberDescriptor descriptor) { 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"); 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") @TestMetadata("kt535.kt")
public void testKt535() throws Exception { public void testKt535() throws Exception {
doTest("compiler/testData/codegen/box/objects/kt535.kt"); doTest("compiler/testData/codegen/box/objects/kt535.kt");