mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PY-47253 Suggest only immediate attributes for known package aliases
IJ-MR-7390 GitOrigin-RevId: 43a919a19d9b0be9e9e83478c2da8a26b351fd54
This commit is contained in:
committed by
intellij-monorepo-bot
parent
48d7c2cd8d
commit
2cf82cbee5
+10
-12
@@ -82,9 +82,9 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
|
||||
val psiElement = item.psiElement
|
||||
if (psiElement is PsiNamedElement && psiElement.containingFile != null) {
|
||||
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,
|
||||
val packageNameForAlias = PyPackageAliasesProvider.commonImportAliases[name]
|
||||
val nameToImport = packageNameForAlias ?: name
|
||||
AddImportHelper.addImportStatement(context.file, nameToImport, if (packageNameForAlias != null) name else null,
|
||||
AddImportHelper.getImportPriority(context.file, psiElement.containingFile),
|
||||
ref?.element as? PyElement)
|
||||
}
|
||||
@@ -115,9 +115,9 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
|
||||
val packageNameForAlias = PyPackageAliasesProvider.commonImportAliases[qualifier.toString()]
|
||||
val packageName = if (packageNameForAlias != null) QualifiedName.fromDottedString(packageNameForAlias) else qualifier
|
||||
val resultMatchingCompleteReference = result.withPrefixMatcher(QualifiedNameMatcher(qualifiedName))
|
||||
val scope = PySearchUtilBase.defaultSuggestionScope(parameters.originalFile)
|
||||
|
||||
val availableModules = PyModuleNameIndex.findByQualifiedName(packageName, project,
|
||||
PySearchUtilBase.defaultSuggestionScope(parameters.originalFile))
|
||||
val availableModules = PyModuleNameIndex.findByQualifiedName(packageName, project, scope)
|
||||
.asSequence()
|
||||
|
||||
if (packageNameForAlias == null) {
|
||||
@@ -141,11 +141,10 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
|
||||
.filter { it.containingFile != null }
|
||||
.filterNot { it is PsiFileSystemItem }
|
||||
.filterNot { it.name == null || it.name!!.startsWith('_') }
|
||||
.filter { attribute.isEmpty() || resultMatchingCompleteReference.prefixMatcher.prefixMatches("$packageName.${it.name}") }
|
||||
.filter { attribute.isEmpty() || resultMatchingCompleteReference.prefixMatcher.prefixMatches("$qualifier.${it.name}") }
|
||||
.mapNotNull {
|
||||
val qualifiedNameToSuggest = "$qualifier.${it.name}"
|
||||
if (suggestedQualifiedNames.add(qualifiedNameToSuggest)) {
|
||||
LookupElementBuilder.create(it, qualifiedNameToSuggest)
|
||||
if (suggestedQualifiedNames.add("$packageName.${it.name}")) {
|
||||
LookupElementBuilder.create(it, "$qualifier.${it.name}")
|
||||
.withIcon(it.getIcon(0))
|
||||
.withInsertHandler(getInsertHandler(it, parameters.position))
|
||||
.withTypeText(packageNameForAlias)
|
||||
@@ -158,14 +157,13 @@ class PyUnresolvedModuleAttributeCompletionContributor : CompletionContributor()
|
||||
result.restartCompletionOnAnyPrefixChange()
|
||||
return
|
||||
}
|
||||
val scope = PySearchUtilBase.defaultSuggestionScope(parameters.originalFile)
|
||||
PyQualifiedNameCompletionMatcher.processMatchingExportedNames(
|
||||
packageName.append(attribute), if (packageNameForAlias != null) qualifiedName else null, parameters.originalFile, scope,
|
||||
qualifiedName, parameters.originalFile, scope,
|
||||
Processor {
|
||||
ProgressManager.checkCanceled()
|
||||
if (suggestedQualifiedNames.add(it.qualifiedName.toString())) {
|
||||
resultMatchingCompleteReference.addElement(LookupElementBuilder
|
||||
.createWithSmartPointer(it.qualifiedNameWithUserTypedAlias.toString(),
|
||||
.createWithSmartPointer(it.qualifiedName.toString(),
|
||||
it.element)
|
||||
.withIcon(it.element.getIcon(0))
|
||||
.withInsertHandler(getInsertHandler(it.element, parameters.position)))
|
||||
|
||||
+2
-17
@@ -32,7 +32,6 @@ public class PyQualifiedNameCompletionMatcher {
|
||||
}
|
||||
|
||||
public static void processMatchingExportedNames(@NotNull QualifiedName qualifiedNamePattern,
|
||||
@Nullable QualifiedName originallyTypedAlias,
|
||||
@NotNull PsiFile currentFile,
|
||||
@NotNull GlobalSearchScope scope,
|
||||
@NotNull Processor<? super ExportedName> processor) {
|
||||
@@ -78,7 +77,7 @@ public class PyQualifiedNameCompletionMatcher {
|
||||
}
|
||||
QualifiedName attributeQualifiedName = importPath.append(attributeName);
|
||||
if (alreadySuggestedAttributes.add(attributeQualifiedName)) {
|
||||
if (!processor.process(new ExportedName(attributeQualifiedName, originallyTypedAlias, element))) {
|
||||
if (!processor.process(new ExportedName(attributeQualifiedName, element))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -127,12 +126,10 @@ 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, @Nullable QualifiedName originallyTypedQName, @NotNull PyElement element) {
|
||||
private ExportedName(@NotNull QualifiedName qualifiedName, @NotNull PyElement element) {
|
||||
myQualifiedName = qualifiedName;
|
||||
myOriginallyTypedQName = originallyTypedQName;
|
||||
myElement = element;
|
||||
}
|
||||
|
||||
@@ -141,22 +138,10 @@ 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 {
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
import pylab as p
|
||||
|
||||
p.argmax()
|
||||
+1
@@ -0,0 +1 @@
|
||||
p.argma<caret>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
def argmax():
|
||||
pass
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
def input():
|
||||
pass
|
||||
+1
@@ -0,0 +1 @@
|
||||
np.in<caret>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
def invert():
|
||||
pass
|
||||
+1
@@ -0,0 +1 @@
|
||||
np.r
|
||||
+1
@@ -0,0 +1 @@
|
||||
np.r<caret>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
def rand():
|
||||
pass
|
||||
@@ -114,6 +114,27 @@ public class PyNotImportedQualifiedNameCompletionTest extends PyTestCase {
|
||||
doTestBasicCompletion();
|
||||
}
|
||||
|
||||
//PY-47253
|
||||
public void testShowOnlyImmediateAttributesForAliases() {
|
||||
doTestBasicCompletion();
|
||||
}
|
||||
|
||||
//PY-47253
|
||||
public void testFuzzyResultsShouldBeAddedToAliasAttributesCompletion() {
|
||||
final String testName = getTestName(false);
|
||||
myFixture.copyDirectoryToProject(testName, "");
|
||||
myFixture.configureByFile("main.py");
|
||||
myFixture.completeBasic();
|
||||
List<String> variants = myFixture.getLookupElementStrings();
|
||||
assertEquals(2, variants.size());
|
||||
assertContainsElements(variants, "np.invert", "fileinput.input");
|
||||
}
|
||||
|
||||
//PY-47253
|
||||
public void testAliasAttributesShouldNotBeDuplicated() {
|
||||
doTestBasicCompletion();
|
||||
}
|
||||
|
||||
private void doTestBasicCompletion() {
|
||||
final String testName = getTestName(false);
|
||||
myFixture.copyDirectoryToProject(testName, "");
|
||||
|
||||
Reference in New Issue
Block a user