From 2da4446a0c501440f68228b6678f66cae8b74a71 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 25 Apr 2012 21:59:01 +0200 Subject: [PATCH] don't offer top-level packages in completion of relative imports (PY-6304) --- .../impl/references/PyImportReference.java | 22 +++++++++---------- .../pack/__init__.py | 0 .../pack/subpack/__init__.py | 1 + .../pack/subpack/modX.py | 1 + .../python/PythonCompletionTest.java | 13 +++++++++++ 5 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 python/testData/completion/relativeImportExcludeToplevel/pack/__init__.py create mode 100644 python/testData/completion/relativeImportExcludeToplevel/pack/subpack/__init__.py create mode 100644 python/testData/completion/relativeImportExcludeToplevel/pack/subpack/modX.py diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java index b7556bc63820..c922230690c5 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java @@ -167,7 +167,7 @@ public class PyImportReference extends PyReferenceImpl { } public Object[] execute() { - int relative_level = -1; + int relativeLevel = -1; InsertHandler insertHandler = null; // NOTE: could use getPointInImport() @@ -191,9 +191,9 @@ public class PyImportReference extends PyReferenceImpl { } } else { // null source, must be a "from ... import" - relative_level = from_import.getRelativeLevel(); - if (relative_level > 0) { - PsiDirectory relative_dir = ResolveImportUtil.stepBackFrom(myCurrentFile, relative_level); + relativeLevel = from_import.getRelativeLevel(); + if (relativeLevel > 0) { + PsiDirectory relative_dir = ResolveImportUtil.stepBackFrom(myCurrentFile, relativeLevel); if (relative_dir != null) { addImportedNames(from_import.getImportElements()); fillFromDir(relative_dir, null); @@ -204,7 +204,7 @@ public class PyImportReference extends PyReferenceImpl { else { // in "import _" or "from _ import" ASTNode n = myElement.getNode().getTreePrev(); while (n != null && n.getElementType() == PyTokenTypes.DOT) { - relative_level += 1; + relativeLevel += 1; n = n.getTreePrev(); } if (from_import != null) { @@ -221,21 +221,21 @@ public class PyImportReference extends PyReferenceImpl { } } // look at dir by level - if (myCurrentFile != null && (relative_level >= 0 || !ResolveImportUtil.isAbsoluteImportEnabledFor(myCurrentFile))) { + if (myCurrentFile != null && (relativeLevel >= 0 || !ResolveImportUtil.isAbsoluteImportEnabledFor(myCurrentFile))) { final PsiDirectory containingDirectory = myCurrentFile.getContainingDirectory(); if (containingDirectory != null) { PyQualifiedName thisQName = ResolveImportUtil.findShortestImportableQName(containingDirectory); - if (thisQName == null) { - fillFromDir(ResolveImportUtil.stepBackFrom(myCurrentFile, relative_level), insertHandler); + if (thisQName == null || thisQName.getComponentCount() == relativeLevel) { + fillFromDir(ResolveImportUtil.stepBackFrom(myCurrentFile, relativeLevel), insertHandler); } - else if (thisQName.getComponentCount() >= relative_level) { - thisQName = thisQName.removeTail(relative_level); + else if (thisQName.getComponentCount() > relativeLevel) { + thisQName = thisQName.removeTail(relativeLevel); fillFromQName(thisQName, insertHandler); } } } } - if (relative_level == -1) { + if (relativeLevel == -1) { fillFromQName(PyQualifiedName.fromComponents(), insertHandler); } diff --git a/python/testData/completion/relativeImportExcludeToplevel/pack/__init__.py b/python/testData/completion/relativeImportExcludeToplevel/pack/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeImportExcludeToplevel/pack/subpack/__init__.py b/python/testData/completion/relativeImportExcludeToplevel/pack/subpack/__init__.py new file mode 100644 index 000000000000..6509788aae52 --- /dev/null +++ b/python/testData/completion/relativeImportExcludeToplevel/pack/subpack/__init__.py @@ -0,0 +1 @@ +__author__ = 'yole' diff --git a/python/testData/completion/relativeImportExcludeToplevel/pack/subpack/modX.py b/python/testData/completion/relativeImportExcludeToplevel/pack/subpack/modX.py new file mode 100644 index 000000000000..136608600f80 --- /dev/null +++ b/python/testData/completion/relativeImportExcludeToplevel/pack/subpack/modX.py @@ -0,0 +1 @@ +from ... import \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 1d8ba03e122a..9bf9201be865 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -550,4 +550,17 @@ public class PythonCompletionTest extends PyTestCase { public void testQualifiedAssignment() { // PY-6121 doTest(); } + + public void testRelativeImportExcludeToplevel() { // PY-6304 + setLanguageLevel(LanguageLevel.PYTHON27); + try { + myFixture.copyDirectoryToProject("completion/relativeImportExcludeToplevel", ""); + myFixture.configureByFile("pack/subpack/modX.py"); + myFixture.completeBasic(); + assertFalse(myFixture.getLookupElementStrings().contains("sys")); + } + finally { + setLanguageLevel(null); + } + } }