references in superclass list of a class should be resolved outside of the class (PY-3554)

This commit is contained in:
Dmitry Jemerov
2011-05-17 17:17:21 +02:00
parent c20b9839da
commit 2cb6d99c54
4 changed files with 24 additions and 11 deletions
@@ -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));
@@ -0,0 +1,5 @@
from datetime import date
class date(date):
# <ref>
pass
@@ -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");
}
}
@@ -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;
}