From e7f37924037abd501db5ae770efabcd7ddfde5f7 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 1 Feb 2012 19:18:54 +0400 Subject: [PATCH] Fixed completion of classobj attributes for old-style classes (PY-5486) --- .../python/psi/impl/PyBuiltinCache.java | 3 ++- .../jetbrains/python/psi/types/PyClassType.java | 10 +++++++++- .../completion/oldStyleClassAttributes.after.py | 4 ++++ .../completion/oldStyleClassAttributes.py | 4 ++++ .../jetbrains/python/PythonCompletionTest.java | 16 ++++++++++------ 5 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 python/testData/completion/oldStyleClassAttributes.after.py create mode 100644 python/testData/completion/oldStyleClassAttributes.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java b/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java index 98db7048c33c..3433def0bb46 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java +++ b/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java @@ -18,6 +18,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileSystemItem; import com.intellij.psi.PsiManager; +import com.jetbrains.python.PyNames; import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyFile; @@ -287,7 +288,7 @@ public class PyBuiltinCache { @Nullable public PyClassType getOldstyleClassobjType() { - return getObjectType("___Classobj"); + return getObjectType(PyNames.FAKE_OLD_BASE); } @Nullable diff --git a/python/src/com/jetbrains/python/psi/types/PyClassType.java b/python/src/com/jetbrains/python/psi/types/PyClassType.java index 66ce6d565a39..d69580233a08 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassType.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassType.java @@ -256,6 +256,14 @@ public class PyClassType extends UserDataHolderBase implements PyCallableType { addInheritedMembers(prefix, location, context, ret); + if (!myClass.isNewStyleClass()) { + final PyBuiltinCache cache = PyBuiltinCache.getInstance(myClass); + final PyClassType classobjType = cache.getOldstyleClassobjType(); + if (classobjType != null) { + ret.addAll(Arrays.asList(classobjType.getCompletionVariants(prefix, location, context))); + } + } + if (isDefinition() && myClass.isNewStyleClass()) { PyClassType typeType = PyBuiltinCache.getInstance(myClass).getObjectType("type"); if (typeType != null) { @@ -385,7 +393,7 @@ public class PyClassType extends UserDataHolderBase implements PyCallableType { public String toString() { return (isValid() ? "" : "[INVALID] ") + "PyClassType: " + getClassQName(); } - + public boolean isValid() { return myClass == null || myClass.isValid(); } diff --git a/python/testData/completion/oldStyleClassAttributes.after.py b/python/testData/completion/oldStyleClassAttributes.after.py new file mode 100644 index 000000000000..ba7b7954de5e --- /dev/null +++ b/python/testData/completion/oldStyleClassAttributes.after.py @@ -0,0 +1,4 @@ +class C: + pass +c = C() +c.__class__ diff --git a/python/testData/completion/oldStyleClassAttributes.py b/python/testData/completion/oldStyleClassAttributes.py new file mode 100644 index 000000000000..03fdd87b8815 --- /dev/null +++ b/python/testData/completion/oldStyleClassAttributes.py @@ -0,0 +1,4 @@ +class C: + pass +c = C() +c.__cla diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index d11717b76b48..f43db36aac12 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -487,23 +487,23 @@ public class PythonCompletionTest extends PyTestCase { public void testImportKeyword() { doTest(); } - + public void testAssignedNearby() { doTest(); } - + public void testDunderAll() { doMultiFileTest(); } - + public void testAsName() { doMultiFileTest(); } - + public void testKeywordArgumentsForImplicitCall() { doTest(); } - + public void testTypeMembers() { // PY-5311 myFixture.configureByText(PythonFileType.INSTANCE, "a = 'string'\n" + "a."); @@ -512,8 +512,12 @@ public class PythonCompletionTest extends PyTestCase { final List strings = myFixture.getLookupElementStrings(); assertFalse(strings.contains("mro")); } - + public void testDunderAllReference() { // PY-5502 doTest(); } + + public void testOldStyleClassAttributes() { + doTest(); + } }