mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Class-private name resolution (PY-50): a small fix and tests.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user