mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fix for PY-948 that doesn't break resolve of os.path
This commit is contained in:
@@ -7,10 +7,7 @@ import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.ResolveState;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.jetbrains.python.PyNames;
|
||||
import com.jetbrains.python.psi.NameDefiner;
|
||||
import com.jetbrains.python.psi.PyFile;
|
||||
import com.jetbrains.python.psi.PyReferenceExpression;
|
||||
import com.jetbrains.python.psi.PyUtil;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import com.jetbrains.python.psi.impl.PyImportedModule;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -50,42 +47,37 @@ public class ResolveProcessor implements PyAsScopeProcessor {
|
||||
}
|
||||
|
||||
public boolean execute(PsiElement element, ResolveState substitutor) {
|
||||
if (myResult != null) return false; // we already have a result and don't want to lose it in a second invocation
|
||||
if (element instanceof PyFile) {
|
||||
final VirtualFile file = ((PyFile)element).getVirtualFile();
|
||||
if (file != null) {
|
||||
if (myName.equals(file.getNameWithoutExtension())) {
|
||||
myResult = element;
|
||||
return false;
|
||||
return setResult(element);
|
||||
}
|
||||
else if (PyNames.INIT_DOT_PY.equals(file.getName())) {
|
||||
VirtualFile dir = file.getParent();
|
||||
if ((dir != null) && myName.equals(dir.getName())) {
|
||||
myResult = element;
|
||||
return false;
|
||||
return setResult(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (element instanceof PsiNamedElement) {
|
||||
if (myName.equals(((PsiNamedElement)element).getName())) {
|
||||
myResult = element;
|
||||
return false;
|
||||
return setResult(element);
|
||||
}
|
||||
}
|
||||
else if (element instanceof PyReferenceExpression) {
|
||||
PyReferenceExpression expr = (PyReferenceExpression)element;
|
||||
String referencedName = expr.getReferencedName();
|
||||
if (referencedName != null && referencedName.equals(myName)) {
|
||||
myResult = element;
|
||||
return false;
|
||||
return setResult(element);
|
||||
}
|
||||
}
|
||||
else if (element instanceof NameDefiner) {
|
||||
final NameDefiner definer = (NameDefiner)element;
|
||||
PsiElement by_name = definer.getElementNamed(myName);
|
||||
if (by_name != null) {
|
||||
myResult = by_name;
|
||||
setResult(by_name);
|
||||
if (!PsiTreeUtil.isAncestor(element, by_name, true)) {
|
||||
addNameDefiner(definer);
|
||||
}
|
||||
@@ -102,8 +94,7 @@ public class ResolveProcessor implements PyAsScopeProcessor {
|
||||
|
||||
public boolean execute(final PsiElement element, final String asName) {
|
||||
if (asName.equals(myName)) {
|
||||
myResult = element;
|
||||
return false;
|
||||
return setResult(element);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -116,5 +107,14 @@ public class ResolveProcessor implements PyAsScopeProcessor {
|
||||
public void handleEvent(Event event, Object associated) {
|
||||
}
|
||||
|
||||
private boolean setResult(PsiElement result) {
|
||||
if (myResult == null || getScope(myResult) == getScope(result)) {
|
||||
myResult = result;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static PsiElement getScope(PsiElement result) {
|
||||
return PsiTreeUtil.getParentOfType(result, PyFunction.class, PyClass.class, PyFile.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class lock(object):
|
||||
def __init__(self):
|
||||
self.l<ref>ock()
|
||||
def lock(self):
|
||||
pass
|
||||
@@ -284,4 +284,9 @@ public class PyResolveTest extends PyResolveTestCase {
|
||||
PsiElement targetElement = resolve();
|
||||
assertNull(targetElement);
|
||||
}
|
||||
|
||||
public void testClassNameEqualsMethodName() {
|
||||
PsiElement targetElement = resolve();
|
||||
assertInstanceOf(targetElement, PyFunction.class);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user