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");