mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
references in superclass list of a class should be resolved outside of the class (PY-3554)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user