PY-47307 Do not insert dot after module name in completion, drop aliases completion

Aliases were completed only when the prefix was a fully-typed alias, and it became useless without inserting a dot and calling PyUnresolvedModuleAttributeCompletionContributor afterwards
IJ-MR-6806

GitOrigin-RevId: fc5b5e91911bbc85bda4da0753ad8e6da69951cb
This commit is contained in:
Lada Gagina
2021-03-15 13:52:43 +00:00
committed by intellij-monorepo-bot
parent 0a7003d789
commit b3e4cc8ba9
11 changed files with 9 additions and 36 deletions
@@ -1,12 +1,9 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.codeInsight.completion
import com.intellij.codeInsight.AutoPopupController
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
@@ -16,7 +13,9 @@ 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.*
import com.jetbrains.python.psi.PyFile
import com.jetbrains.python.psi.PyImportStatementBase
import com.jetbrains.python.psi.PyReferenceExpression
import com.jetbrains.python.psi.resolve.fromFoothold
import com.jetbrains.python.psi.resolve.resolveQualifiedName
import com.jetbrains.python.psi.types.PyModuleType
@@ -45,26 +44,10 @@ class PyModuleNameCompletionContributor : CompletionContributor() {
}
fun doFillCompletionVariants(parameters: CompletionParameters, result: CompletionResultSet) {
val autoPopupController = AutoPopupController.getInstance(parameters.originalFile.project)
val packageInsertHandler = InsertHandler<LookupElement> { 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<LookupElementBuilder>()
.filter { result.prefixMatcher.prefixMatches(it.lookupString) }
.filterNot { it.lookupString.startsWith('_') }
.map {
it.withInsertHandler(packageInsertHandler)
}
.forEach { result.addElement(it) }
}
@@ -110,8 +110,8 @@ 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 packageNameForAlias = PyPackageAliasesProvider.commonImportAliases[qualifier.toString()]
val packageName = if (packageNameForAlias != null) QualifiedName.fromDottedString(packageNameForAlias) else qualifier
val resultMatchingCompleteReference = result.withPrefixMatcher(QualifiedNameMatcher(qualifiedName))
PyModuleNameIndex.find(packageName.lastComponent!!, project, true).asSequence()
.filter { QualifiedNameFinder.findShortestImportableQName(it) == packageName }
@@ -126,7 +126,7 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
LookupElementBuilder.create(it, qualifiedNameToSuggest)
.withIcon(it.getIcon(0))
.withInsertHandler(getInsertHandler(it, parameters.position))
.withTypeText(commonAlias)
.withTypeText(packageNameForAlias)
}
else null
}
@@ -138,7 +138,7 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
}
val scope = PySearchUtilBase.defaultSuggestionScope(parameters.originalFile)
PyQualifiedNameCompletionMatcher.processMatchingExportedNames(
packageName.append(attribute), if (commonAlias != null) qualifiedName else null, parameters.originalFile, scope,
packageName.append(attribute), if (packageNameForAlias != null) qualifiedName else null, parameters.originalFile, scope,
Processor {
ProgressManager.checkCanceled()
if (suggestedQualifiedNames.add(it.qualifiedName.toString())) {
@@ -1 +0,0 @@
plt<caret>
@@ -4,15 +4,7 @@ package com.jetbrains.python;
import com.jetbrains.python.fixtures.PyTestCase;
public class PyNotImportedPackageNameCompletionTest extends PyTestCase {
public void testDotAfterPackageName() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + "/main.after.py");
}
public void testCompletionForAlias() {
public void testPackageNameBasicCompletion() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");