diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 848e193cfda..317b70089fc 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1609,28 +1609,6 @@ public class ExpressionCodegen extends JetVisitor implem isInterface, isSuper, getter, setter, invokeOpcode); } - private PropertyDescriptor accessablePropertyDescriptor(PropertyDescriptor propertyDescriptor) { - PropertySetterDescriptor setter = propertyDescriptor.getSetter(); - if ((propertyDescriptor.getVisibility() == Visibilities.PRIVATE || - (setter != null && setter.getVisibility() == Visibilities.PRIVATE)) - && !DescriptorUtils.isClassObject(propertyDescriptor.getContainingDeclaration()) - && propertyDescriptor.getContainingDeclaration() instanceof ClassDescriptor) { - if (context.getClassOrNamespaceDescriptor() != propertyDescriptor.getContainingDeclaration()) { - DeclarationDescriptor enclosed = propertyDescriptor.getContainingDeclaration(); - if (!context.hasThisDescriptor() || enclosed != context.getThisDescriptor()) { - CodegenContext c = context; - while (c != null && c.getContextDescriptor() != enclosed) { - c = c.getParentContext(); - } - if (c != null) { - propertyDescriptor = (PropertyDescriptor) c.getAccessor(propertyDescriptor); - } - } - } - } - return propertyDescriptor; - } - private static boolean isOverrideForTrait(CallableMemberDescriptor propertyDescriptor) { if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { final Set overriddenDescriptors = propertyDescriptor.getOverriddenDescriptors(); @@ -1659,7 +1637,8 @@ public class ExpressionCodegen extends JetVisitor implem receiver = StackValue.receiver(resolvedCall, receiver, this, null); return generateConstructorCall(expression, (JetSimpleNameExpression) callee, receiver); } - else if (funDescriptor instanceof FunctionDescriptor) { + + if (funDescriptor instanceof FunctionDescriptor) { Call call = bindingContext.get(CALL, expression.getCalleeExpression()); if (resolvedCall instanceof VariableAsFunctionResolvedCall) { VariableAsFunctionResolvedCall variableAsFunctionResolvedCall = (VariableAsFunctionResolvedCall) resolvedCall; @@ -1675,6 +1654,48 @@ public class ExpressionCodegen extends JetVisitor implem } } + private PropertyDescriptor accessablePropertyDescriptor(PropertyDescriptor propertyDescriptor) { + PropertySetterDescriptor setter = propertyDescriptor.getSetter(); + if ((propertyDescriptor.getVisibility() == Visibilities.PRIVATE || + (setter != null && setter.getVisibility() == Visibilities.PRIVATE)) + && !DescriptorUtils.isClassObject(propertyDescriptor.getContainingDeclaration()) + && propertyDescriptor.getContainingDeclaration() instanceof ClassDescriptor) { + if (context.getClassOrNamespaceDescriptor() != propertyDescriptor.getContainingDeclaration()) { + DeclarationDescriptor enclosed = propertyDescriptor.getContainingDeclaration(); + if (!context.hasThisDescriptor() || enclosed != context.getThisDescriptor()) { + CodegenContext c = context; + while (c != null && c.getContextDescriptor() != enclosed) { + c = c.getParentContext(); + } + if (c != null) { + propertyDescriptor = (PropertyDescriptor) c.getAccessor(propertyDescriptor); + } + } + } + } + return propertyDescriptor; + } + + private FunctionDescriptor accessableFunctionDescriptor(FunctionDescriptor fd) { + if (fd.getVisibility() != Visibilities.PRIVATE || fd.getContainingDeclaration() instanceof NamespaceDescriptor) { + return fd; + } + + if (context.getClassOrNamespaceDescriptor() != fd.getContainingDeclaration()) { + DeclarationDescriptor enclosed = fd.getContainingDeclaration(); + if (enclosed != context.getThisDescriptor()) { + CodegenContext c = context; + while (c.getContextDescriptor() != enclosed) { + c = c.getParentContext(); + assert c != null; + } + fd = (FunctionDescriptor) c.getAccessor(fd); + } + } + + return fd; + } + private StackValue invokeFunction( Call call, StackValue receiver, @@ -1712,21 +1733,7 @@ public class ExpressionCodegen extends JetVisitor implem } } - if (fd.getVisibility() == Visibilities.PRIVATE - && !DescriptorUtils.isClassObject(fd.getContainingDeclaration()) - && fd.getContainingDeclaration() instanceof ClassDescriptor) { - if (context.getClassOrNamespaceDescriptor() != fd.getContainingDeclaration()) { - DeclarationDescriptor enclosed = fd.getContainingDeclaration(); - if (enclosed != context.getThisDescriptor()) { - CodegenContext c = context; - while (c.getContextDescriptor() != enclosed) { - c = c.getParentContext(); - assert c != null; - } - fd = (FunctionDescriptor) c.getAccessor(fd); - } - } - } + fd = accessableFunctionDescriptor(fd); Callable callable = resolveToCallable(fd, superCall); if (callable instanceof CallableMethod) {