From 7885ad9e27defdb34de1cd5138ec915cd1b91afc Mon Sep 17 00:00:00 2001 From: Dmitry Cheryasov Date: Wed, 5 May 2010 19:59:46 +0300 Subject: [PATCH] Class-private name resolution (PY-50): a small fix and tests. --- .../psi/impl/PyQualifiedReferenceImpl.java | 4 +-- .../testData/resolve/ClassPrivateInClass.py | 3 ++ .../testData/resolve/ClassPrivateInMethod.py | 5 +++ .../resolve/ClassPrivateInMethodNested.py | 6 ++++ .../testData/resolve/ClassPrivateInherited.py | 6 ++++ .../resolve/ClassPrivateOutsideClass.py | 4 +++ .../resolve/ClassPrivateOutsideInstance.py | 6 ++++ .../com/jetbrains/python/PyResolveTest.java | 35 ++++++++++++++++++- 8 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 python/testData/resolve/ClassPrivateInClass.py create mode 100644 python/testData/resolve/ClassPrivateInMethod.py create mode 100644 python/testData/resolve/ClassPrivateInMethodNested.py create mode 100644 python/testData/resolve/ClassPrivateInherited.py create mode 100644 python/testData/resolve/ClassPrivateOutsideClass.py create mode 100644 python/testData/resolve/ClassPrivateOutsideInstance.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyQualifiedReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/PyQualifiedReferenceImpl.java index abf93361daba..07ae89a8e1db 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyQualifiedReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyQualifiedReferenceImpl.java @@ -37,8 +37,8 @@ public class PyQualifiedReferenceImpl extends PyReferenceImpl { PyType qualifierType = qualifier.getType(TypeEvalContext.fast()); // is it a class-private name qualified by a different class? if (PyUtil.isClassPrivateName(referencedName) && qualifierType instanceof PyClassType) { - final List match = SyntaxMatchers.IN_METHOD.search(qualifier); - if (match == null || (match.size() > 1 && ((PyClassType)qualifierType).getPyClass() != match.get(1))) { + final List match = SyntaxMatchers.DEEP_IN_METHOD.search(qualifier); + if (match == null || (match.size() > 1 && ((PyClassType)qualifierType).getPyClass() != match.get(match.size()-1))) { return Collections.emptyList(); } } diff --git a/python/testData/resolve/ClassPrivateInClass.py b/python/testData/resolve/ClassPrivateInClass.py new file mode 100644 index 000000000000..28268beaba8f --- /dev/null +++ b/python/testData/resolve/ClassPrivateInClass.py @@ -0,0 +1,3 @@ +class A(object): + __X = 1 + __X # must resolve diff --git a/python/testData/resolve/ClassPrivateInMethod.py b/python/testData/resolve/ClassPrivateInMethod.py new file mode 100644 index 000000000000..02536978aa79 --- /dev/null +++ b/python/testData/resolve/ClassPrivateInMethod.py @@ -0,0 +1,5 @@ +class A(object): + __X = 1 + + def f(self): + self.__X diff --git a/python/testData/resolve/ClassPrivateInMethodNested.py b/python/testData/resolve/ClassPrivateInMethodNested.py new file mode 100644 index 000000000000..6772411b3d34 --- /dev/null +++ b/python/testData/resolve/ClassPrivateInMethodNested.py @@ -0,0 +1,6 @@ +class A(object): + __X = 1 + + def f(self): + def moo(): + self.__X diff --git a/python/testData/resolve/ClassPrivateInherited.py b/python/testData/resolve/ClassPrivateInherited.py new file mode 100644 index 000000000000..340f758dcef4 --- /dev/null +++ b/python/testData/resolve/ClassPrivateInherited.py @@ -0,0 +1,6 @@ +class A(object): + __A = 1 + +class B(A): + def f(self): + self.__A # must fail diff --git a/python/testData/resolve/ClassPrivateOutsideClass.py b/python/testData/resolve/ClassPrivateOutsideClass.py new file mode 100644 index 000000000000..0b5d03a6131f --- /dev/null +++ b/python/testData/resolve/ClassPrivateOutsideClass.py @@ -0,0 +1,4 @@ +class A(object): + __X = 1 + +A.__X diff --git a/python/testData/resolve/ClassPrivateOutsideInstance.py b/python/testData/resolve/ClassPrivateOutsideInstance.py new file mode 100644 index 000000000000..1e3c87770db1 --- /dev/null +++ b/python/testData/resolve/ClassPrivateOutsideInstance.py @@ -0,0 +1,6 @@ +class A(object): + __X = 1 + +a = A() + +a.__X # must fail diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index 7c70b0c98ca6..fa9b1688cd82 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -53,7 +53,6 @@ public class PyResolveTest extends PyResolveTestCase { assertNotNull(cls); assertEquals(cls.getName(), "Foo"); } - // NOTE: maybe this test does not belong exactly here; still it's the best place currently. public void testComplexCallee() { PsiElement targetElement = resolve(); @@ -251,4 +250,38 @@ public class PyResolveTest extends PyResolveTestCase { assertEquals(1, resolveResults.length); assertTrue(resolveResults [0].getElement() instanceof PyFunction); } + + public void testClassPrivateInClass() { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + assertTrue(targetElement.getParent() instanceof PyAssignmentStatement); + } + + public void testClassPrivateInMethod() { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + assertTrue(targetElement.getParent() instanceof PyAssignmentStatement); + } + + public void testClassPrivateInMethodNested() { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + assertTrue(targetElement.getParent() instanceof PyAssignmentStatement); + } + + public void testClassPrivateInherited() { + PsiElement targetElement = resolve(); + assertTrue(targetElement instanceof PyTargetExpression); + assertTrue(targetElement.getParent() instanceof PyAssignmentStatement); + } + + public void testClassPrivateOutsideClass() { + PsiElement targetElement = resolve(); + assertNull(targetElement); + } + + public void testClassPrivateOutsideInstance() { + PsiElement targetElement = resolve(); + assertNull(targetElement); + } } \ No newline at end of file