From 3b0cc0de47dbf5e525f06c84414c5eda3d3f3c09 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Wed, 12 Nov 2014 17:23:28 +0300 Subject: [PATCH] PY-7376 Resolving of relative imports takes into account namespace packages --- .../python/psi/resolve/ResolveImportUtil.java | 2 +- .../nspkg1/a.after.py | 1 + .../nspkg1/a.py | 1 + .../nspkg1/nspkg2/bar.py | 0 .../nspkg1/nspkg2/foo.py | 0 .../nspkg1/a.after.py | 1 + .../nspkg1/a.py | 1 + .../nspkg1/bar.py | 0 .../nspkg1/foo.py | 0 .../com/jetbrains/python/Py3CompletionTest.java | 17 +++++++++++++++++ 10 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.after.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/nspkg2/bar.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/nspkg2/foo.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.after.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/bar.py create mode 100644 python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/foo.py diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index 1f6d9d5f893b..e2ea4a797317 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -95,7 +95,7 @@ public class ResolveImportUtil { base = base.getOriginalFile(); // just to make sure result = base.getContainingDirectory(); int count = 1; - while (result != null && result.findFile(PyNames.INIT_DOT_PY) != null) { + while (result != null && PyUtil.isPackage(result, base)) { if (count >= depth) return result; result = result.getParentDirectory(); count += 1; diff --git a/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.after.py b/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.after.py new file mode 100644 index 000000000000..c36bd9b160b9 --- /dev/null +++ b/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.after.py @@ -0,0 +1 @@ +from .nspkg2 import foo \ No newline at end of file diff --git a/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.py b/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.py new file mode 100644 index 000000000000..59cec1ed8401 --- /dev/null +++ b/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/a.py @@ -0,0 +1 @@ +from .nspkg2 import f \ No newline at end of file diff --git a/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/nspkg2/bar.py b/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/nspkg2/bar.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/nspkg2/foo.py b/python/testData/completion/relativeFromImportInNamespacePackage/nspkg1/nspkg2/foo.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.after.py b/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.after.py new file mode 100644 index 000000000000..b3dc38201dc4 --- /dev/null +++ b/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.after.py @@ -0,0 +1 @@ +from . import foo \ No newline at end of file diff --git a/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.py b/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.py new file mode 100644 index 000000000000..f9d269cb07e8 --- /dev/null +++ b/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/a.py @@ -0,0 +1 @@ +from . import f \ No newline at end of file diff --git a/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/bar.py b/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/bar.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/foo.py b/python/testData/completion/relativeFromImportInNamespacePackage2/nspkg1/foo.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index 5fe31bdedeb3..7e085a397a2e 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -119,4 +119,21 @@ public class Py3CompletionTest extends PyTestCase { public void testImportNestedQualifiedNamespacePackage() { doMultiFileTest(); } + + // PY-7376 + public void testRelativeFromImportInNamespacePackage() { + doMultiFileTestInsideNamespacePackage(); + } + + // PY-7376 + public void testRelativeFromImportInNamespacePackage2() { + doMultiFileTestInsideNamespacePackage(); + } + + private void doMultiFileTestInsideNamespacePackage() { + myFixture.copyDirectoryToProject("completion/" + getTestName(true), ""); + myFixture.configureByFile("nspkg1/a.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile("completion/" + getTestName(true) + "/nspkg1/a.after.py"); + } }