Fixed accessing namespace private members from inner classes. Added test.

This commit is contained in:
Evgeny Gerashchenko
2012-06-19 22:47:26 +04:00
parent e8f15027e9
commit 9e727623c2
3 changed files with 13 additions and 3 deletions
@@ -1063,8 +1063,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
final boolean directToField = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER && contextKind() != OwnerKind.TRAIT_IMPL ;
JetExpression r = getReceiverForSelector(expression);
final boolean isSuper = r instanceof JetSuperExpression;
if (propertyDescriptor.getVisibility() == Visibilities.PRIVATE && !DescriptorUtils
.isClassObject(propertyDescriptor.getContainingDeclaration())) {
if (propertyDescriptor.getVisibility() == Visibilities.PRIVATE
&& !DescriptorUtils.isClassObject(propertyDescriptor.getContainingDeclaration())
&& propertyDescriptor.getContainingDeclaration() instanceof ClassDescriptor) {
if (context.getClassOrNamespaceDescriptor() != propertyDescriptor.getContainingDeclaration()) {
DeclarationDescriptor enclosed = propertyDescriptor.getContainingDeclaration();
if (enclosed != null && enclosed != context.getThisDescriptor()) {
@@ -1366,7 +1367,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
}
if (fd.getVisibility() == Visibilities.PRIVATE
&& !DescriptorUtils.isClassObject(fd.getContainingDeclaration())) {
&& !DescriptorUtils.isClassObject(fd.getContainingDeclaration())
&& fd.getContainingDeclaration() instanceof ClassDescriptor) {
if (context.getClassOrNamespaceDescriptor() != fd.getContainingDeclaration()) {
DeclarationDescriptor enclosed = fd.getContainingDeclaration();
if (enclosed != context.getThisDescriptor()) {
@@ -0,0 +1,4 @@
private var x = "O"
private fun f() = "K"
fun box() = { x + f() }()
@@ -563,4 +563,8 @@ public class NamespaceGenTest extends CodegenTestCase {
//noinspection ImplicitArrayToString
assertEquals("s" + args.toString(), main.invoke(null, "s", args));
}
public void testPrivateTopLevelPropAndVarInInner() {
blackBoxFile("privateTopLevelPropAndVarInInner.kt");
}
}