From 4c7a2fd177b605830f859a08e2c36b14729aafbb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 5 Feb 2013 21:09:21 +0100 Subject: [PATCH] second half of fix for PY-7887 --- .../codeInsight/imports/AddImportHelper.java | 15 ++++++----- .../src/com/jetbrains/python/psi/PyUtil.java | 6 +++++ .../python/psi/resolve/VariantsProcessor.java | 4 +-- .../submoduleRegularImport/pack/__init__.py | 0 .../submoduleRegularImport/pack/submod.py | 0 .../submoduleRegularImport.after.py | 3 +++ .../submoduleRegularImport.py | 1 + .../python/PyClassNameCompletionTest.java | 26 ++++++++++++------- 8 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 python/testData/completion/className/submoduleRegularImport/pack/__init__.py create mode 100644 python/testData/completion/className/submoduleRegularImport/pack/submod.py create mode 100644 python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.after.py create mode 100644 python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.py diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java index 375406fd68ed..3469eb7cd56e 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java @@ -226,14 +226,17 @@ public class AddImportHelper { if (target instanceof PsiFileSystemItem && qName.getComponentCount() == 1) { addImportStatement(file, path, null, priority); } - else if (useQualified) { - addImportStatement(file, path, null, priority); - final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(file.getProject()); - element.replace(elementGenerator.createExpressionFromText(LanguageLevel.forElement(target), qName + "." + target.getName())); - } else { final PyQualifiedName toImportQName = QualifiedNameFinder.findCanonicalImportPath(toImport, element); - addImportFrom(file, null, toImportQName.toString(), target.getName(), null, priority); + if (useQualified) { + addImportStatement(file, path, null, priority); + final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(file.getProject()); + final String targetName = PyUtil.getElementNameWithoutExtension(target); + element.replace(elementGenerator.createExpressionFromText(LanguageLevel.forElement(target), toImportQName + "." + targetName)); + } + else { + addImportFrom(file, null, toImportQName.toString(), target.getName(), null, priority); + } } } diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java index 4e26ba30eaa7..12a2870fe860 100644 --- a/python/src/com/jetbrains/python/psi/PyUtil.java +++ b/python/src/com/jetbrains/python/psi/PyUtil.java @@ -609,6 +609,12 @@ public class PyUtil { } } + public static String getElementNameWithoutExtension(PsiNamedElement psiNamedElement) { + return psiNamedElement instanceof PyFile + ? FileUtil.getNameWithoutExtension(((PyFile)psiNamedElement).getName()) + : psiNamedElement.getName(); + } + public static boolean hasUnresolvedAncestors(@NotNull PyClass cls) { for (PyClassRef classRef : cls.iterateAncestors()) { if (classRef.getPyClass() == null && classRef.getType() == null) { diff --git a/python/src/com/jetbrains/python/psi/resolve/VariantsProcessor.java b/python/src/com/jetbrains/python/psi/resolve/VariantsProcessor.java index 96e067dff963..f79cb9014052 100644 --- a/python/src/com/jetbrains/python/psi/resolve/VariantsProcessor.java +++ b/python/src/com/jetbrains/python/psi/resolve/VariantsProcessor.java @@ -50,9 +50,7 @@ public abstract class VariantsProcessor implements PsiScopeProcessor { // TODO: refactor to look saner; much code duplication if (element instanceof PsiNamedElement) { final PsiNamedElement psiNamedElement = (PsiNamedElement)element; - final String name = psiNamedElement instanceof PyFile - ? FileUtil.getNameWithoutExtension(((PyFile)psiNamedElement).getName()) - : psiNamedElement.getName(); + final String name = PyUtil.getElementNameWithoutExtension(psiNamedElement); if (name != null && nameIsAcceptable(name)) { addElement(name, psiNamedElement); } diff --git a/python/testData/completion/className/submoduleRegularImport/pack/__init__.py b/python/testData/completion/className/submoduleRegularImport/pack/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/className/submoduleRegularImport/pack/submod.py b/python/testData/completion/className/submoduleRegularImport/pack/submod.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.after.py b/python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.after.py new file mode 100644 index 000000000000..f75256736d24 --- /dev/null +++ b/python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.after.py @@ -0,0 +1,3 @@ +import pack.submod + +pack.submod diff --git a/python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.py b/python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.py new file mode 100644 index 000000000000..69cc258a0332 --- /dev/null +++ b/python/testData/completion/className/submoduleRegularImport/submoduleRegularImport.py @@ -0,0 +1 @@ +subm diff --git a/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java b/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java index 11d8d770e356..c4fea2e2093a 100644 --- a/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PyClassNameCompletionTest.java @@ -18,15 +18,7 @@ public class PyClassNameCompletionTest extends PyTestCase { } public void testQualified() { - final PyCodeInsightSettings settings = PyCodeInsightSettings.getInstance(); - boolean oldValue = settings.PREFER_FROM_IMPORT; - settings.PREFER_FROM_IMPORT = false; - try { - doTest(); - } - finally { - settings.PREFER_FROM_IMPORT = oldValue; - } + doTestWithoutFromImport(); } public void testFunction() { @@ -45,6 +37,22 @@ public class PyClassNameCompletionTest extends PyTestCase { doTest(); } + public void testSubmoduleRegularImport() { // PY-7887 + doTestWithoutFromImport(); + } + + private void doTestWithoutFromImport() { + final PyCodeInsightSettings settings = PyCodeInsightSettings.getInstance(); + boolean oldValue = settings.PREFER_FROM_IMPORT; + settings.PREFER_FROM_IMPORT = false; + try { + doTest(); + } + finally { + settings.PREFER_FROM_IMPORT = oldValue; + } + } + private void doTest() { final String path = "/completion/className/" + getTestName(true); myFixture.copyDirectoryToProject(path, "");