PY-47304 Keep showing direct (non-fuzzy) module attributes after dot in completion

Previously, we accidentally offered immediate attributes of a module only right
after a dot in a non-imported qualified name (i.e., with an empty attribute name).
If a qualified name of a fuzzy variant matched that of a direct attribute, it went
unnoticed. However, if a name was non-trivially exported, as in case of
"_pytest.mark.structures.MARK_GEN" exported as "pytest.mark", its expected name,
as an attribute of pytest module, disappeared immediately as one started typing
anything past the dot in "pytest.".

GitOrigin-RevId: 5fbd7bd77fd1629f4d852b757d350cc182b991d7
This commit is contained in:
Mikhail Golubev
2021-03-16 16:28:31 +00:00
committed by intellij-monorepo-bot
parent 23103c4883
commit 8faf6e47bb
6 changed files with 20 additions and 21 deletions
@@ -119,7 +119,7 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
.filter { it.containingFile != null }
.filterNot { it is PsiFileSystemItem }
.filterNot { it.name == null || it.name!!.startsWith('_') }
.filter { attribute.isEmpty() || resultMatchingCompleteReference.prefixMatcher.prefixMatches(it.name!!) }
.filter { attribute.isEmpty() || resultMatchingCompleteReference.prefixMatcher.prefixMatches("$packageName.${it.name}") }
.mapNotNull {
val qualifiedNameToSuggest = "$qualifier.${it.name}"
if (suggestedQualifiedNames.add(qualifiedNameToSuggest)) {
@@ -75,38 +75,30 @@ public class PyNotImportedQualifiedNameCompletionTest extends PyTestCase {
}
public void testImportForModuleFunction() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + "/main.after.py");
doTestBasicCompletion();
}
public void testImportForModuleClass() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + "/main.after.py");
doTestBasicCompletion();
}
public void testImportForAlias() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + "/main.after.py");
doTestBasicCompletion();
}
public void testImportForAliasWithNonEmptyAttribute() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + "/main.after.py");
doTestBasicCompletion();
}
public void testUseImportPriorityWhenAddingImport() {
doTestBasicCompletion();
}
public void testDirectModuleAttributesSuggestedForNonEmptyAttributePrefix() {
doTestBasicCompletion();
}
private void doTestBasicCompletion() {
final String testName = getTestName(false);
myFixture.copyDirectoryToProject(testName, "");
myFixture.configureByFile("main.py");