From 290c8ea4ab37faa9fb7be3d9b4758ff96223dfba Mon Sep 17 00:00:00 2001 From: Lada Gagina Date: Wed, 10 Feb 2021 02:57:36 +0300 Subject: [PATCH] PY-44026 Add completion with auto-import for common package aliases GitOrigin-RevId: 11d6f0df866ba3ae35cfdb1aed231a3e357bb4e7 --- .../PyModuleNameCompletionContributor.kt | 20 +++++++++++----- ...vedModuleAttributeCompletionContributor.kt | 24 ++++++++++++------- .../PyQualifiedNameCompletionMatcher.java | 19 +++++++++++++-- .../CompletionForAlias/main.after.py | 1 + .../CompletionForAlias/main.py | 1 + .../matplotlib}/__init__.py | 0 .../matplotlib/pyplot}/__init__.py | 0 .../ImportForAlias/main.after.py | 3 +++ .../ImportForAlias/main.py | 1 + .../ImportForAlias/matplotlib/__init__.py | 0 .../matplotlib/pyplot/__init__.py} | 0 .../main.after.py | 3 +++ .../main.py | 1 + .../matplotlib/__init__.py | 0 .../matplotlib/pyplot/__init__.py | 2 ++ .../ImportForModuleClass/foo/__init__.py | 0 .../foo/bar.py | 0 .../main.after.py | 0 .../main.py | 0 .../ImportForModuleFunction/foo/__init__.py | 0 .../ImportForModuleFunction/foo/bar.py | 2 ++ .../main.after.py | 0 .../main.py | 0 ...yNotImportedPackageNameCompletionTest.java | 7 ++++++ ...otImportedQualifiedNameCompletionTest.java | 18 ++++++++++++-- 25 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 python/testData/completion/notImportedPackageName/CompletionForAlias/main.after.py create mode 100644 python/testData/completion/notImportedPackageName/CompletionForAlias/main.py rename python/testData/completion/{notImportedQualifiedName/ImportForModuleClassIsAdded/foo => notImportedPackageName/CompletionForAlias/matplotlib}/__init__.py (100%) rename python/testData/completion/{notImportedQualifiedName/ImportForModuleFunctionIsAdded/foo => notImportedPackageName/CompletionForAlias/matplotlib/pyplot}/__init__.py (100%) create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAlias/main.after.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAlias/main.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAlias/matplotlib/__init__.py rename python/testData/completion/notImportedQualifiedName/{ImportForModuleFunctionIsAdded/foo/bar.py => ImportForAlias/matplotlib/pyplot/__init__.py} (100%) create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.after.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/__init__.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/pyplot/__init__.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForModuleClass/foo/__init__.py rename python/testData/completion/notImportedQualifiedName/{ImportForModuleClassIsAdded => ImportForModuleClass}/foo/bar.py (100%) rename python/testData/completion/notImportedQualifiedName/{ImportForModuleClassIsAdded => ImportForModuleClass}/main.after.py (100%) rename python/testData/completion/notImportedQualifiedName/{ImportForModuleClassIsAdded => ImportForModuleClass}/main.py (100%) create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/__init__.py create mode 100644 python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/bar.py rename python/testData/completion/notImportedQualifiedName/{ImportForModuleFunctionIsAdded => ImportForModuleFunction}/main.after.py (100%) rename python/testData/completion/notImportedQualifiedName/{ImportForModuleFunctionIsAdded => ImportForModuleFunction}/main.py (100%) diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyModuleNameCompletionContributor.kt b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyModuleNameCompletionContributor.kt index f742a0df0832..7fb2dfa7f68c 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyModuleNameCompletionContributor.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyModuleNameCompletionContributor.kt @@ -6,6 +6,7 @@ import com.intellij.codeInsight.completion.CompletionContributor import com.intellij.codeInsight.completion.CompletionParameters import com.intellij.codeInsight.completion.CompletionResultSet import com.intellij.codeInsight.completion.InsertHandler +import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementBuilder import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider import com.intellij.psi.PsiDirectory @@ -14,6 +15,7 @@ import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.QualifiedName import com.intellij.util.ProcessingContext import com.jetbrains.python.PyNames +import com.jetbrains.python.inspections.unresolvedReference.PyPackageAliasesProvider import com.jetbrains.python.psi.PyFile import com.jetbrains.python.psi.PyImportStatementBase import com.jetbrains.python.psi.PyReferenceExpression @@ -38,17 +40,23 @@ class PyModuleNameCompletionContributor : CompletionContributor() { fun doFillCompletionVariants(parameters: CompletionParameters, result: CompletionResultSet) { val autoPopupController = AutoPopupController.getInstance(parameters.originalFile.project) + val packageInsertHandler = InsertHandler { context, _ -> + // add dot for PyUnresolvedModuleAttributeCompletionContributor to work + context.document.insertString(context.tailOffset, ".") + context.editor.caretModel.moveToOffset(context.tailOffset) + autoPopupController.autoPopupMemberLookup(context.editor, null) + } + val commonAlias = PyPackageAliasesProvider.commonImportAliases[result.prefixMatcher.prefix] + if (commonAlias != null) { + result.addElement(LookupElementBuilder.create(result.prefixMatcher.prefix).withTypeText(commonAlias).withInsertHandler(packageInsertHandler)) + return + } getCompletionVariants(parameters.position.parent, parameters.originalFile).asSequence() .filterIsInstance() .filter { result.prefixMatcher.prefixMatches(it.lookupString) } .filterNot { it.lookupString.startsWith('_') } .map { - it.withInsertHandler(InsertHandler { context, _ -> - // add dot for PyUnresolvedModuleAttributeCompletionContributor to work - context.document.insertString(context.tailOffset, ".") - context.editor.caretModel.moveToOffset(context.tailOffset) - autoPopupController.autoPopupMemberLookup(context.editor, null) - }) + it.withInsertHandler(packageInsertHandler) } .forEach { result.addElement(it) } } diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyUnresolvedModuleAttributeCompletionContributor.kt b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyUnresolvedModuleAttributeCompletionContributor.kt index 58d080227fa7..3705159d7a67 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyUnresolvedModuleAttributeCompletionContributor.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/completion/PyUnresolvedModuleAttributeCompletionContributor.kt @@ -18,6 +18,7 @@ import com.intellij.util.Processor import com.jetbrains.python.PyTokenTypes import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil import com.jetbrains.python.codeInsight.imports.AddImportHelper +import com.jetbrains.python.inspections.unresolvedReference.PyPackageAliasesProvider import com.jetbrains.python.psi.* import com.jetbrains.python.psi.resolve.PyResolveUtil import com.jetbrains.python.psi.resolve.QualifiedNameFinder @@ -78,14 +79,17 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor() WriteCommandAction.writeCommandAction(context.project, context.file).run { val psiElement = item.psiElement if (psiElement is PsiNamedElement && psiElement.containingFile != null) { - val nameToImport = QualifiedName.fromDottedString(item.lookupString).removeLastComponent().toString() - AddImportHelper.addImportStatement(context.file, nameToImport, null, null, ref?.element as? PyElement) + val name = QualifiedName.fromDottedString(item.lookupString).removeLastComponent().toString() + val commonAlias = PyPackageAliasesProvider.commonImportAliases[name] + val nameToImport = commonAlias ?: name + AddImportHelper.addImportStatement(context.file, nameToImport, if (commonAlias != null) name else null, null, ref?.element as? PyElement) } } } private fun getInsertHandler(elementToInsert: PyElement, position: PsiElement): InsertHandler { - return if (elementToInsert is PyFunction && position.parent?.parent !is PyDecorator) functionInsertHandler else importingInsertHandler + return if (elementToInsert is PyFunction && position.parent?.parent !is PyDecorator) functionInsertHandler + else importingInsertHandler } } @@ -104,19 +108,23 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor() ProgressManager.checkCanceled() val qualifiedName = qualifier.append(attribute) + val commonAlias = PyPackageAliasesProvider.commonImportAliases[qualifier.toString()] + val packageName = if (commonAlias != null) QualifiedName.fromDottedString(commonAlias) else qualifier val resultMatchingCompleteReference = result.withPrefixMatcher(QualifiedNameMatcher(qualifiedName)) - PyModuleNameIndex.find(qualifier.lastComponent!!, project, true).asSequence() - .filter { QualifiedNameFinder.findShortestImportableQName(it) == qualifier } + PyModuleNameIndex.find(packageName.lastComponent!!, project, true).asSequence() + .filter { QualifiedNameFinder.findShortestImportableQName(it) == packageName } .flatMap { it.iterateNames().asSequence() } + .filter { it.containingFile != null } .filterNot { it is PsiFileSystemItem } .filterNot { it.name == null || it.name!!.startsWith('_') } - .filter { attribute.isEmpty() || result.prefixMatcher.prefixMatches(it.name!!) } + .filter { attribute.isEmpty() || resultMatchingCompleteReference.prefixMatcher.prefixMatches(it.name!!) } .mapNotNull { val qualifiedNameToSuggest = "$qualifier.${it.name}" if (suggestedQualifiedNames.add(qualifiedNameToSuggest)) { LookupElementBuilder.create(it, qualifiedNameToSuggest) .withIcon(it.getIcon(0)) .withInsertHandler(getInsertHandler(it, parameters.position)) + .withTypeText(commonAlias) } else null } @@ -128,12 +136,12 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor() } val scope = PySearchUtilBase.excludeSdkTestsScope(project) PyQualifiedNameCompletionMatcher.processMatchingExportedNames( - qualifiedName, parameters.originalFile, scope, + packageName.append(attribute), if (commonAlias != null) qualifiedName else null, parameters.originalFile, scope, Processor { ProgressManager.checkCanceled() if (suggestedQualifiedNames.add(it.qualifiedName.toString())) { resultMatchingCompleteReference.addElement(LookupElementBuilder - .createWithSmartPointer(it.qualifiedName.toString(), it.element) + .createWithSmartPointer(it.qualifiedNameWithUserTypedAlias.toString(), it.element) .withIcon(it.element.getIcon(0)) .withInsertHandler(getInsertHandler(it.element, parameters.position))) } diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/stubs/PyQualifiedNameCompletionMatcher.java b/python/python-psi-impl/src/com/jetbrains/python/psi/stubs/PyQualifiedNameCompletionMatcher.java index ebf581a73e55..8ddf6de332e5 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/stubs/PyQualifiedNameCompletionMatcher.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/stubs/PyQualifiedNameCompletionMatcher.java @@ -37,6 +37,7 @@ public class PyQualifiedNameCompletionMatcher { } public static void processMatchingExportedNames(@NotNull QualifiedName qualifiedNamePattern, + @Nullable QualifiedName originallyTypedAlias, @NotNull PsiFile currentFile, @NotNull GlobalSearchScope scope, @NotNull Processor processor) { @@ -71,7 +72,7 @@ public class PyQualifiedNameCompletionMatcher { } QualifiedName attributeQualifiedName = importPath.append(attributeName); if (alreadySuggestedAttributes.add(attributeQualifiedName)) { - if (!processor.process(new ExportedName(attributeQualifiedName, element))) { + if (!processor.process(new ExportedName(attributeQualifiedName, originallyTypedAlias, element))) { return false; } } @@ -120,10 +121,12 @@ public class PyQualifiedNameCompletionMatcher { public static final class ExportedName { private final QualifiedName myQualifiedName; + private final QualifiedName myOriginallyTypedQName; private final PyElement myElement; - private ExportedName(@NotNull QualifiedName qualifiedName, @NotNull PyElement element) { + private ExportedName(@NotNull QualifiedName qualifiedName, @Nullable QualifiedName originallyTypedQName, @NotNull PyElement element) { myQualifiedName = qualifiedName; + myOriginallyTypedQName = originallyTypedQName; myElement = element; } @@ -132,10 +135,22 @@ public class PyQualifiedNameCompletionMatcher { return myQualifiedName; } + @Nullable + public QualifiedName getOriginallyTypedQName() { + return myOriginallyTypedQName; + } + @NotNull public PyElement getElement() { return myElement; } + + @NotNull + public QualifiedName getQualifiedNameWithUserTypedAlias() { + return myOriginallyTypedQName != null + ? myOriginallyTypedQName.removeLastComponent().append(myQualifiedName.getLastComponent()) + : myQualifiedName; + } } public static final class QualifiedNameMatcher extends PrefixMatcher { diff --git a/python/testData/completion/notImportedPackageName/CompletionForAlias/main.after.py b/python/testData/completion/notImportedPackageName/CompletionForAlias/main.after.py new file mode 100644 index 000000000000..8c605af44ebe --- /dev/null +++ b/python/testData/completion/notImportedPackageName/CompletionForAlias/main.after.py @@ -0,0 +1 @@ +plt. \ No newline at end of file diff --git a/python/testData/completion/notImportedPackageName/CompletionForAlias/main.py b/python/testData/completion/notImportedPackageName/CompletionForAlias/main.py new file mode 100644 index 000000000000..5ff56b8f9ce2 --- /dev/null +++ b/python/testData/completion/notImportedPackageName/CompletionForAlias/main.py @@ -0,0 +1 @@ +plt \ No newline at end of file diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/foo/__init__.py b/python/testData/completion/notImportedPackageName/CompletionForAlias/matplotlib/__init__.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/foo/__init__.py rename to python/testData/completion/notImportedPackageName/CompletionForAlias/matplotlib/__init__.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/foo/__init__.py b/python/testData/completion/notImportedPackageName/CompletionForAlias/matplotlib/pyplot/__init__.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/foo/__init__.py rename to python/testData/completion/notImportedPackageName/CompletionForAlias/matplotlib/pyplot/__init__.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAlias/main.after.py b/python/testData/completion/notImportedQualifiedName/ImportForAlias/main.after.py new file mode 100644 index 000000000000..d67366d7ce5a --- /dev/null +++ b/python/testData/completion/notImportedQualifiedName/ImportForAlias/main.after.py @@ -0,0 +1,3 @@ +import matplotlib.pyplot as plt + +plt.func() \ No newline at end of file diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAlias/main.py b/python/testData/completion/notImportedQualifiedName/ImportForAlias/main.py new file mode 100644 index 000000000000..827a777df96c --- /dev/null +++ b/python/testData/completion/notImportedQualifiedName/ImportForAlias/main.py @@ -0,0 +1 @@ +plt. \ No newline at end of file diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAlias/matplotlib/__init__.py b/python/testData/completion/notImportedQualifiedName/ImportForAlias/matplotlib/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/foo/bar.py b/python/testData/completion/notImportedQualifiedName/ImportForAlias/matplotlib/pyplot/__init__.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/foo/bar.py rename to python/testData/completion/notImportedQualifiedName/ImportForAlias/matplotlib/pyplot/__init__.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.after.py b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.after.py new file mode 100644 index 000000000000..d67366d7ce5a --- /dev/null +++ b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.after.py @@ -0,0 +1,3 @@ +import matplotlib.pyplot as plt + +plt.func() \ No newline at end of file diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.py b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.py new file mode 100644 index 000000000000..4da6d133d766 --- /dev/null +++ b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/main.py @@ -0,0 +1 @@ +plt.fu \ No newline at end of file diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/__init__.py b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/pyplot/__init__.py b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/pyplot/__init__.py new file mode 100644 index 000000000000..b9bfa6f12339 --- /dev/null +++ b/python/testData/completion/notImportedQualifiedName/ImportForAliasWithNonEmptyAttribute/matplotlib/pyplot/__init__.py @@ -0,0 +1,2 @@ +def func(): + pass diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleClass/foo/__init__.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleClass/foo/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/foo/bar.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleClass/foo/bar.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/foo/bar.py rename to python/testData/completion/notImportedQualifiedName/ImportForModuleClass/foo/bar.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/main.after.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleClass/main.after.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/main.after.py rename to python/testData/completion/notImportedQualifiedName/ImportForModuleClass/main.after.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/main.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleClass/main.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleClassIsAdded/main.py rename to python/testData/completion/notImportedQualifiedName/ImportForModuleClass/main.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/__init__.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/bar.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/bar.py new file mode 100644 index 000000000000..b9bfa6f12339 --- /dev/null +++ b/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/foo/bar.py @@ -0,0 +1,2 @@ +def func(): + pass diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/main.after.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/main.after.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/main.after.py rename to python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/main.after.py diff --git a/python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/main.py b/python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/main.py similarity index 100% rename from python/testData/completion/notImportedQualifiedName/ImportForModuleFunctionIsAdded/main.py rename to python/testData/completion/notImportedQualifiedName/ImportForModuleFunction/main.py diff --git a/python/testSrc/com/jetbrains/python/PyNotImportedPackageNameCompletionTest.java b/python/testSrc/com/jetbrains/python/PyNotImportedPackageNameCompletionTest.java index 5ba956a0b501..3da11de523c1 100644 --- a/python/testSrc/com/jetbrains/python/PyNotImportedPackageNameCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PyNotImportedPackageNameCompletionTest.java @@ -15,6 +15,13 @@ public class PyNotImportedPackageNameCompletionTest extends PyTestCase { myFixture.checkResultByFile(getTestName(true) + "/main.after.py"); } + public void testCompletionForAlias() { + myFixture.copyDirectoryToProject(getTestName(false), ""); + myFixture.configureByFile("main.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile(getTestName(true) + "/main.after.py"); + } + @Override protected String getTestDataPath() { return super.getTestDataPath() + "/completion/notImportedPackageName/"; diff --git a/python/testSrc/com/jetbrains/python/PyNotImportedQualifiedNameCompletionTest.java b/python/testSrc/com/jetbrains/python/PyNotImportedQualifiedNameCompletionTest.java index 370cae3bfa94..5397f38c2ddd 100644 --- a/python/testSrc/com/jetbrains/python/PyNotImportedQualifiedNameCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PyNotImportedQualifiedNameCompletionTest.java @@ -45,14 +45,28 @@ public class PyNotImportedQualifiedNameCompletionTest extends PyTestCase { assertFalse(matcher.prefixMatches("xxx.foo.bar.baz")); } - public void testImportForModuleFunctionIsAdded() { + public void testImportForModuleFunction() { myFixture.copyDirectoryToProject(getTestName(false), ""); myFixture.configureByFile("main.py"); myFixture.completeBasic(); myFixture.checkResultByFile(getTestName(true) + "/main.after.py"); } - public void testImportForModuleClassIsAdded() { + public void testImportForModuleClass() { + myFixture.copyDirectoryToProject(getTestName(false), ""); + myFixture.configureByFile("main.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile(getTestName(true) + "/main.after.py"); + } + + public void testImportForAlias() { + myFixture.copyDirectoryToProject(getTestName(false), ""); + myFixture.configureByFile("main.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile(getTestName(true) + "/main.after.py"); + } + + public void testImportForAliasWithNonEmptyAttribute() { myFixture.copyDirectoryToProject(getTestName(false), ""); myFixture.configureByFile("main.py"); myFixture.completeBasic();