From cdf76f7eed5afebc709acc6394ee7dc3627e8dba Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 1 Jul 2010 13:18:14 +0400 Subject: [PATCH] to have same behavior for stub-based and non-stub-based resolve, findExportedName() walks the list of stubs in reverse order --- .../com/jetbrains/python/psi/impl/PyFileImpl.java | 3 ++- .../resolve/multiFile/nameConflict/NameConflict.py | 4 ++++ .../resolve/multiFile/nameConflict/intermediate.py | 2 ++ .../resolve/multiFile/nameConflict/pack1.py | 1 + .../resolve/multiFile/nameConflict/pack2.py | 1 + .../jetbrains/python/PyMultiFileResolveTest.java | 13 +++++++++++++ 6 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 python/testData/resolve/multiFile/nameConflict/NameConflict.py create mode 100644 python/testData/resolve/multiFile/nameConflict/intermediate.py create mode 100644 python/testData/resolve/multiFile/nameConflict/pack1.py create mode 100644 python/testData/resolve/multiFile/nameConflict/pack2.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java index 1ef11a256ebf..89b2a2f5f3a9 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java @@ -195,7 +195,8 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { final StubElement stub = getStub(); if (stub != null) { final List children = stub.getChildrenStubs(); - for (Object child : children) { + for (int i=children.size()-1; i >= 0; i--) { + Object child = children.get(i); if (child instanceof NamedStub && name.equals(((NamedStub)child).getName())) { return ((NamedStub) child).getPsi(); } diff --git a/python/testData/resolve/multiFile/nameConflict/NameConflict.py b/python/testData/resolve/multiFile/nameConflict/NameConflict.py new file mode 100644 index 000000000000..8b250ce78bfe --- /dev/null +++ b/python/testData/resolve/multiFile/nameConflict/NameConflict.py @@ -0,0 +1,4 @@ +from intermediate import do_stuff + +do_stuff() +# diff --git a/python/testData/resolve/multiFile/nameConflict/intermediate.py b/python/testData/resolve/multiFile/nameConflict/intermediate.py new file mode 100644 index 000000000000..02fe58af9969 --- /dev/null +++ b/python/testData/resolve/multiFile/nameConflict/intermediate.py @@ -0,0 +1,2 @@ +from pack1 import do_stuff +from pack2 import do_stuff diff --git a/python/testData/resolve/multiFile/nameConflict/pack1.py b/python/testData/resolve/multiFile/nameConflict/pack1.py new file mode 100644 index 000000000000..d85ae00aed26 --- /dev/null +++ b/python/testData/resolve/multiFile/nameConflict/pack1.py @@ -0,0 +1 @@ +def do_stuff(): print("wrong stuff") diff --git a/python/testData/resolve/multiFile/nameConflict/pack2.py b/python/testData/resolve/multiFile/nameConflict/pack2.py new file mode 100644 index 000000000000..030a3d97ca72 --- /dev/null +++ b/python/testData/resolve/multiFile/nameConflict/pack2.py @@ -0,0 +1 @@ +def do_stuff(): print("the good stuff") diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index d53fd79be60c..ca8f0cca679a 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -179,10 +179,23 @@ public class PyMultiFileResolveTest extends PyLightFixtureTestCase { assertResolvesTo(PyFunction.class, "dostuff"); } + public void testNameConflict() throws Exception { + assertResolvesTo(PyFunction.class, "do_stuff", "/src/pack2.py"); + } + private void assertResolvesTo(final Class aClass, final String name) throws Exception { + assertResolvesTo(aClass, name, null); + } + + private void assertResolvesTo(final Class aClass, + final String name, + String containingFilePath) throws Exception { final PsiElement element = doResolve(); assertInstanceOf(element, aClass); assertEquals(name, ((PsiNamedElement) element).getName()); + if (containingFilePath != null) { + assertEquals(containingFilePath, element.getContainingFile().getVirtualFile().getPath()); + } } private PsiFile prepareFile() throws Exception {