From d2061e69f7d9e6a1a458254b4ae38b93f5c865dd Mon Sep 17 00:00:00 2001 From: Anton Bragin Date: Wed, 28 Mar 2018 19:15:59 +0300 Subject: [PATCH] PY-28341 Already used entries don't removed from completion list Entries that were used in code remain in the completion list. Return type of PyQualifiedReference updated to reflect the fact that it returns PyTargetExpression's only. --- .../impl/references/PyQualifiedReference.java | 23 +++++++------------ .../completionForUsedAttribute/a.after.py | 4 ++++ .../completionForUsedAttribute/a.py | 4 ++++ .../completionForUsedAttribute/m1.py | 1 + .../python/PythonCompletionTest.java | 5 ++++ 5 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 python/testData/completion/completionForUsedAttribute/a.after.py create mode 100644 python/testData/completion/completionForUsedAttribute/a.py create mode 100644 python/testData/completion/completionForUsedAttribute/m1.py diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java index b7576cdec096..789b90373dfc 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java @@ -282,24 +282,17 @@ public class PyQualifiedReference extends PyReferenceImpl { final PyQualifiedExpression qualifierExpression = (PyQualifiedExpression)qualifier; final QualifiedName qualifiedName = qualifierExpression.asQualifiedName(); if (qualifiedName != null) { - final Collection attrs = collectAssignedAttributes(qualifiedName, qualifier); - for (PyExpression ex : attrs) { - final String name = ex.getName(); + final Collection attrs = collectAssignedAttributes(qualifiedName, qualifier); + for (PyTargetExpression expression : attrs) { + final String name = expression.getName(); if (name != null && name.endsWith(CompletionUtil.DUMMY_IDENTIFIER_TRIMMED)) { continue; } - if (ex instanceof PsiNamedElement && qualifierType instanceof PyClassType && name != null) { - variants.add(LookupElementBuilder.createWithSmartPointer(name, ex) + if (qualifierType instanceof PyClassType && name != null) { + variants.add(LookupElementBuilder.createWithSmartPointer(name, expression) .withTypeText(qualifierType.getName()) .withIcon(PlatformIcons.FIELD_ICON)); - } - if (ex instanceof PyReferenceExpression) { - PyReferenceExpression refExpr = (PyReferenceExpression)ex; - namesAlready.add(refExpr.getReferencedName()); - } - else if (ex instanceof PyTargetExpression) { - PyTargetExpression targetExpr = (PyTargetExpression)ex; - namesAlready.add(targetExpr.getName()); + namesAlready.add(name); } } } @@ -414,10 +407,10 @@ public class PyQualifiedReference extends PyReferenceImpl { * Can be used for completion. */ @NotNull - public static Collection collectAssignedAttributes(@NotNull final QualifiedName qualifierQName, + public static Collection collectAssignedAttributes(@NotNull final QualifiedName qualifierQName, @NotNull final PsiElement anchor) { final Set names = new HashSet<>(); - final List results = new ArrayList<>(); + final List results = new ArrayList<>(); for (ScopeOwner owner = ScopeUtil.getScopeOwner(anchor); owner != null; owner = ScopeUtil.getScopeOwner(owner)) { final Scope scope = ControlFlowCache.getScope(owner); for (final PyTargetExpression target : scope.getTargetExpressions()) { diff --git a/python/testData/completion/completionForUsedAttribute/a.after.py b/python/testData/completion/completionForUsedAttribute/a.after.py new file mode 100644 index 000000000000..2eb90c203e55 --- /dev/null +++ b/python/testData/completion/completionForUsedAttribute/a.after.py @@ -0,0 +1,4 @@ +import m1 + +m1.a +m1.a = 0 diff --git a/python/testData/completion/completionForUsedAttribute/a.py b/python/testData/completion/completionForUsedAttribute/a.py new file mode 100644 index 000000000000..08c782d2f2e2 --- /dev/null +++ b/python/testData/completion/completionForUsedAttribute/a.py @@ -0,0 +1,4 @@ +import m1 + +m1. +m1.a = 0 diff --git a/python/testData/completion/completionForUsedAttribute/m1.py b/python/testData/completion/completionForUsedAttribute/m1.py new file mode 100644 index 000000000000..d25d49e0ffc3 --- /dev/null +++ b/python/testData/completion/completionForUsedAttribute/m1.py @@ -0,0 +1 @@ +a = 1 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 9f13f9fd1052..f1d3ee3c173a 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -1335,6 +1335,11 @@ public class PythonCompletionTest extends PyTestCase { runWithLanguageLevel(LanguageLevel.PYTHON34, this::assertSingleVariantInExtendedCompletion); } + // PY-28341 + public void testCompletionForUsedAttribute() { + doMultiFileTest(); + } + // PY-28103 public void testPrintFunctionWithoutFuture() { final List suggested = doTestByText("pr");