From 4273a29f3550886f5bcf8b52a1031e1fe2d8fd8c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 28 Aug 2012 17:38:30 +0200 Subject: [PATCH] one more original element issue in completion (PY-7327); cleanup --- .../src/com/jetbrains/python/psi/PyUtil.java | 33 +++++-------------- .../impl/references/PyQualifiedReference.java | 2 +- .../testData/completion/dunderClass.after.py | 4 +++ python/testData/completion/dunderClass.py | 4 +++ .../python/PythonCompletionTest.java | 4 +++ 5 files changed, 21 insertions(+), 26 deletions(-) create mode 100644 python/testData/completion/dunderClass.after.py create mode 100644 python/testData/completion/dunderClass.py diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java index 7cd8ea4f44bc..d9875cf384ad 100644 --- a/python/src/com/jetbrains/python/psi/PyUtil.java +++ b/python/src/com/jetbrains/python/psi/PyUtil.java @@ -361,23 +361,6 @@ public class PyUtil { return superClasses; } - /** - * Finds the first identifier AST node under target element, and returns its text. - * - * @param target - * @return identifier text, or null. - */ - public static - @Nullable - String getIdentifier(PsiElement target) { - ASTNode node = target.getNode(); - if (node != null) { - ASTNode ident_node = node.findChildByType(PyTokenTypes.IDENTIFIER); - if (ident_node != null) return ident_node.getText(); - } - return null; - } - // TODO: move to a more proper place? @@ -392,16 +375,16 @@ public class PyUtil { if (ref != null) { PyExpression qualifier = ref.getQualifier(); if (qualifier != null) { - String attr_name = getIdentifier(ref); - if ("__class__".equals(attr_name)) { - PyType qual_type = context.getType(qualifier); - if (qual_type instanceof PyClassType) { - return new PyClassTypeImpl(((PyClassType)qual_type).getPyClass(), true); // always as class, never instance + String attr_name = ref.getReferencedName(); + if (PyNames.CLASS.equals(attr_name)) { + PyType qualifierType = context.getType(qualifier); + if (qualifierType instanceof PyClassType) { + return new PyClassTypeImpl(((PyClassType)qualifierType).getPyClass(), true); // always as class, never instance } } - else if ("__dict__".equals(attr_name)) { - PyType qual_type = context.getType(qualifier); - if (qual_type instanceof PyClassType && ((PyClassType)qual_type).isDefinition()) { + else if (PyNames.DICT.equals(attr_name)) { + PyType qualifierType = context.getType(qualifier); + if (qualifierType instanceof PyClassType && ((PyClassType)qualifierType).isDefinition()) { return PyBuiltinCache.getInstance(ref).getDictType(); } } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java index 87f8239ca70e..a626ffbf1fab 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java @@ -238,7 +238,7 @@ public class PyQualifiedReference extends PyReferenceImpl { @NotNull @Override public Object[] getVariants() { - PyExpression qualifier = myElement.getQualifier(); + PyExpression qualifier = CompletionUtil.getOriginalOrSelf(myElement.getQualifier()); assert qualifier != null; final PyQualifiedExpression element = CompletionUtil.getOriginalOrSelf(myElement); diff --git a/python/testData/completion/dunderClass.after.py b/python/testData/completion/dunderClass.after.py new file mode 100644 index 000000000000..aaaffce5f04b --- /dev/null +++ b/python/testData/completion/dunderClass.after.py @@ -0,0 +1,4 @@ +class Foo(object): + xyzzy = 3 + def fun(self): + a = self.__class__.xyzzy \ No newline at end of file diff --git a/python/testData/completion/dunderClass.py b/python/testData/completion/dunderClass.py new file mode 100644 index 000000000000..4d1a9136ac59 --- /dev/null +++ b/python/testData/completion/dunderClass.py @@ -0,0 +1,4 @@ +class Foo(object): + xyzzy = 3 + def fun(self): + a = self.__class__.x \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index c2c0c3442a11..1b16add43383 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -591,6 +591,10 @@ public class PythonCompletionTest extends PyTestCase { doTest(); } + public void testDunderClass() { // PY-7327 + doTest(); + } + public void testAsInWith() { // PY-3701 setLanguageLevel(LanguageLevel.PYTHON27); assertTrue(doTestByText("with foo ").contains("as"));