Class-private name resolution (PY-50): a small fix and tests.

This commit is contained in:
Dmitry Cheryasov
2010-05-05 19:59:46 +03:00
parent 389b8a0528
commit 7885ad9e27
8 changed files with 66 additions and 3 deletions
@@ -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<? extends PsiElement> match = SyntaxMatchers.IN_METHOD.search(qualifier);
if (match == null || (match.size() > 1 && ((PyClassType)qualifierType).getPyClass() != match.get(1))) {
final List<? extends PsiElement> match = SyntaxMatchers.DEEP_IN_METHOD.search(qualifier);
if (match == null || (match.size() > 1 && ((PyClassType)qualifierType).getPyClass() != match.get(match.size()-1))) {
return Collections.emptyList();
}
}
@@ -0,0 +1,3 @@
class A(object):
__X = 1
_<ref>_X # must resolve
@@ -0,0 +1,5 @@
class A(object):
__X = 1
def f(self):
self._<ref>_X
@@ -0,0 +1,6 @@
class A(object):
__X = 1
def f(self):
def moo():
self._<ref>_X
@@ -0,0 +1,6 @@
class A(object):
__A = 1
class B(A):
def f(self):
self._<ref>_A # must fail
@@ -0,0 +1,4 @@
class A(object):
__X = 1
A._<ref>_X
@@ -0,0 +1,6 @@
class A(object):
__X = 1
a = A()
a._<ref>_X # must fail
@@ -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);
}
}