From 4acc7862421a6d16cea6481212ec730d6dcaec5f Mon Sep 17 00:00:00 2001 From: Dmitry Cheryasov Date: Fri, 23 May 2008 17:07:37 +0400 Subject: [PATCH] Transitive resolution (when an imported name is re-exported). --- .../jetbrains/python/psi/impl/PyFileImpl.java | 19 +++++++++++++++++++ .../transitiveImport/TransitiveImport.py | 3 +++ .../multiFile/transitiveImport/channel.py | 1 + .../multiFile/transitiveImport/source.py | 1 + .../python/PyMultiFileResolveTest.java | 6 ++++++ 5 files changed, 30 insertions(+) create mode 100644 python/testData/resolve/multiFile/transitiveImport/TransitiveImport.py create mode 100644 python/testData/resolve/multiFile/transitiveImport/channel.py create mode 100644 python/testData/resolve/multiFile/transitiveImport/source.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java index 6c67c7f20d74..94405a00e083 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java @@ -87,6 +87,11 @@ public class PyFileImpl extends PsiFileBase implements PyFile { if (!processor.execute(e, substitutor)) return false; } + for(PyFromImportStatement e: getFromImports()) { + if (e == lastParent) continue; + if (!e.processDeclarations(processor, substitutor, null, this)) return false; + } + // if we're in a stmt (not place itself), try buitins: if (lastParent != null) { final String fileName = getName(); @@ -147,6 +152,20 @@ public class PyFileImpl extends PsiFileBase implements PyFile { } return ret; } + + public List getFromImports() { + final List result = new ArrayList(); + accept(new PyRecursiveElementVisitor() { + public void visitPyElement(final PyElement node) { + super.visitPyElement(node); + if (PyFromImportStatement.class.isInstance(node)) { + //noinspection unchecked + result.add((PyFromImportStatement)node); + } + } + }); + return result; + } private List getTopLevelItems(final IElementType elementType, final Class itemClass) { final List result = new ArrayList(); diff --git a/python/testData/resolve/multiFile/transitiveImport/TransitiveImport.py b/python/testData/resolve/multiFile/transitiveImport/TransitiveImport.py new file mode 100644 index 000000000000..0a90b3a600e5 --- /dev/null +++ b/python/testData/resolve/multiFile/transitiveImport/TransitiveImport.py @@ -0,0 +1,3 @@ +from channel import * # token must pass through +print(token) +# \ No newline at end of file diff --git a/python/testData/resolve/multiFile/transitiveImport/channel.py b/python/testData/resolve/multiFile/transitiveImport/channel.py new file mode 100644 index 000000000000..7e9f3af36e9f --- /dev/null +++ b/python/testData/resolve/multiFile/transitiveImport/channel.py @@ -0,0 +1 @@ +from source import token # this re-exports token \ No newline at end of file diff --git a/python/testData/resolve/multiFile/transitiveImport/source.py b/python/testData/resolve/multiFile/transitiveImport/source.py new file mode 100644 index 000000000000..41011d58c253 --- /dev/null +++ b/python/testData/resolve/multiFile/transitiveImport/source.py @@ -0,0 +1 @@ +token = 'Yes' # an exported name \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index 57a77f095439..19994af68329 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -8,6 +8,7 @@ import com.intellij.psi.*; import com.intellij.testFramework.PsiTestUtil; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.PyFunction; +import com.jetbrains.python.psi.PyTargetExpression; /** * @author yole @@ -78,6 +79,11 @@ public class PyMultiFileResolveTest extends CodeInsightTestCase { assertTrue(element instanceof PyFunction); } + public void testTransitiveImport() throws Exception { + PsiElement element = doResolve(); + assertTrue(element instanceof PyTargetExpression); + } + private PsiElement doResolve() throws Exception { String testName = getTestName(true); String fileName = getTestName(false) + ".py";