From 2cb6d99c54cd06221687f4d7023e6d5c8e80859d Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 17 May 2011 16:17:14 +0200 Subject: [PATCH] references in superclass list of a class should be resolved outside of the class (PY-3554) --- .../python/psi/impl/PyReferenceImpl.java | 15 ++++++--------- python/testData/resolve/SuperclassResolveScope.py | 5 +++++ .../com/jetbrains/python/PyResolveTest.java | 4 ++++ .../python/fixtures/PyResolveTestCase.java | 11 +++++++++-- 4 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 python/testData/resolve/SuperclassResolveScope.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java index 15221bbdd2df..31102733e707 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java @@ -169,18 +169,15 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference ResolveProcessor processor = new ResolveProcessor(referencedName); // Use real context here to enable correct completion and resolve in case of PyExpressionCodeFragment!!! - final PsiElement realContext = PyPsiUtils.getRealContext(myElement); + PsiElement realContext = PyPsiUtils.getRealContext(myElement); + PyClass containingClass = PsiTreeUtil.getParentOfType(realContext, PyClass.class); + if (containingClass != null && PsiTreeUtil.isAncestor(containingClass.getSuperClassExpressionList(), myElement, false)) { + realContext = containingClass; + } + PsiElement roof = findResolveRoof(referencedName, realContext); PsiElement uexpr = PyResolveUtil.treeCrawlUp(processor, false, realContext, roof); if ((uexpr != null)) { - if ((uexpr instanceof PyClass)) { - // is it a case of the bizarre "class Foo(Foo)" construct? - PyClass cls = (PyClass)uexpr; - if (isSuperClassExpression(cls)) { - ret.clear(); - return ret; // cannot resolve us, the base class ref, to the class being defined - } - } // sort what we got for (NameDefiner hit : processor.getDefiners()) { ret.poke(hit, getRate(hit)); diff --git a/python/testData/resolve/SuperclassResolveScope.py b/python/testData/resolve/SuperclassResolveScope.py new file mode 100644 index 000000000000..1a6bd921869c --- /dev/null +++ b/python/testData/resolve/SuperclassResolveScope.py @@ -0,0 +1,5 @@ +from datetime import date + +class date(date): +# + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index 9a780ab5517c..898892d1564a 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -409,4 +409,8 @@ public class PyResolveTest extends PyResolveTestCase { public void testNestedListComp() { // PY-3068 assertResolvesTo(PyTargetExpression.class, "yy"); } + + public void testSuperclassResolveScope() { // PY-3554 + assertResolvesTo(PyClass.class, "date", "datetime.py"); + } } \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyResolveTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyResolveTestCase.java index 85d391024845..6b8ba45993ce 100644 --- a/python/testSrc/com/jetbrains/python/fixtures/PyResolveTestCase.java +++ b/python/testSrc/com/jetbrains/python/fixtures/PyResolveTestCase.java @@ -1,11 +1,11 @@ package com.jetbrains.python.fixtures; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.ex.temp.TempFileSystem; import com.intellij.psi.*; import com.intellij.testFramework.TestDataFile; import com.jetbrains.python.psi.LanguageLevel; @@ -72,7 +72,14 @@ public abstract class PyResolveTestCase extends PyLightFixtureTestCase { assertInstanceOf(element, aClass); assertEquals(name, ((PsiNamedElement) element).getName()); if (containingFilePath != null) { - assertEquals(containingFilePath, element.getContainingFile().getVirtualFile().getPath()); + VirtualFile virtualFile = element.getContainingFile().getVirtualFile(); + if (virtualFile.getFileSystem() instanceof TempFileSystem) { + assertEquals(containingFilePath, virtualFile.getPath()); + } + else { + assertEquals(containingFilePath, virtualFile.getName()); + } + } return (T)element; }