From 0f5aa4541a75a9d9907c4fc7f7004808d2ad920f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 11 May 2010 15:41:58 +0400 Subject: [PATCH] fix for PY-948 that doesn't break resolve of os.path --- .../python/psi/resolve/ResolveProcessor.java | 32 +++++++++---------- .../resolve/ClassNameEqualsMethodName.py | 5 +++ .../com/jetbrains/python/PyResolveTest.java | 5 +++ 3 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 python/testData/resolve/ClassNameEqualsMethodName.py diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java b/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java index ca109e70d8cd..04400de84260 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java @@ -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); + } } diff --git a/python/testData/resolve/ClassNameEqualsMethodName.py b/python/testData/resolve/ClassNameEqualsMethodName.py new file mode 100644 index 000000000000..0731576444de --- /dev/null +++ b/python/testData/resolve/ClassNameEqualsMethodName.py @@ -0,0 +1,5 @@ +class lock(object): + def __init__(self): + self.lock() + def lock(self): + pass diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index fa9b1688cd82..f881f51d6673 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -284,4 +284,9 @@ public class PyResolveTest extends PyResolveTestCase { PsiElement targetElement = resolve(); assertNull(targetElement); } + + public void testClassNameEqualsMethodName() { + PsiElement targetElement = resolve(); + assertInstanceOf(targetElement, PyFunction.class); + } } \ No newline at end of file