fix for PY-948 that doesn't break resolve of os.path

This commit is contained in:
Dmitry Jemerov
2010-05-11 15:45:07 +04:00
parent ea8e88cc70
commit 0f5aa4541a
3 changed files with 26 additions and 16 deletions
@@ -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);
}
}