From 9e727623c2fd3443f234583dada864ac347e37bb Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 19 Jun 2012 22:47:26 +0400 Subject: [PATCH] Fixed accessing namespace private members from inner classes. Added test. --- .../src/org/jetbrains/jet/codegen/ExpressionCodegen.java | 8 +++++--- .../testData/codegen/privateTopLevelPropAndVarInInner.kt | 4 ++++ .../tests/org/jetbrains/jet/codegen/NamespaceGenTest.java | 4 ++++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/privateTopLevelPropAndVarInInner.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 3bd8a95e150..7f4cabd4193 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1063,8 +1063,9 @@ public class ExpressionCodegen extends JetVisitor { 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 { } 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()) { diff --git a/compiler/testData/codegen/privateTopLevelPropAndVarInInner.kt b/compiler/testData/codegen/privateTopLevelPropAndVarInInner.kt new file mode 100644 index 00000000000..b61fd243ab9 --- /dev/null +++ b/compiler/testData/codegen/privateTopLevelPropAndVarInInner.kt @@ -0,0 +1,4 @@ +private var x = "O" +private fun f() = "K" + +fun box() = { x + f() }() diff --git a/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index 4b70ebf58e6..c5c5a82c078 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -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"); + } }