From f5cfdd74855b8c536004f97d9fff7fc990cea552 Mon Sep 17 00:00:00 2001 From: Dmitry Cheryasov Date: Mon, 20 Oct 2008 21:50:11 +0400 Subject: [PATCH] Adds in-place defined attributes to completion variants of qualified references. (See PY-82.) --- .../jetbrains/python/psi/PyExpression.java | 8 +++-- .../psi/impl/PyReferenceExpressionImpl.java | 29 +++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/PyExpression.java b/python/src/com/jetbrains/python/psi/PyExpression.java index 28297fe28cb7..d3751f97989f 100644 --- a/python/src/com/jetbrains/python/psi/PyExpression.java +++ b/python/src/com/jetbrains/python/psi/PyExpression.java @@ -19,15 +19,17 @@ package com.jetbrains.python.psi; import com.jetbrains.python.psi.types.PyType; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + /** - * Created by IntelliJ IDEA. + * Describes a generalized expression, possibly typed. * User: yole * Date: 29.05.2005 - * Time: 10:41:59 - * To change this template use File | Settings | File Templates. */ public interface PyExpression extends PyElement { PyExpression[] EMPTY_ARRAY = new PyExpression[0]; + List EMPTY_LIST = new ArrayList(0); @Nullable PyType getType(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index 53322412d1a8..6362fb5f1c81 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -36,9 +36,7 @@ import com.jetbrains.python.psi.types.PyType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; /** * Created by IntelliJ IDEA. @@ -141,11 +139,13 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere // enrich the type info with any fields assigned nearby List qualifier_path = PyResolveUtil.unwindQualifiers((PyQualifiedExpression)qualifier); if (qualifier_path != null) { + /* PyResolveUtil.AssignmentCollectProcessor proc = new PyResolveUtil.AssignmentCollectProcessor(qualifier_path) ; PyResolveUtil.treeCrawlUp(proc, qualifier); - for (PyExpression ex : proc.getResult()) { + */ + for (PyExpression ex : /*proc.getResult()*/ collectAssignedAttributes((PyQualifiedExpression)qualifier)) { if (referencedName.equals(ex.getName())) return ex; } } @@ -182,6 +182,18 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return ret; } + private static Collection collectAssignedAttributes(PyQualifiedExpression qualifier) { + List qualifier_path = PyResolveUtil.unwindQualifiers(qualifier); + if (qualifier_path != null) { + PyResolveUtil.AssignmentCollectProcessor proc = + new PyResolveUtil.AssignmentCollectProcessor(qualifier_path) + ; + PyResolveUtil.treeCrawlUp(proc, qualifier); + return proc.getResult(); + } + else return EMPTY_LIST; + } + /** * Resolves reference to possible referred elements. * First element is always what resolve() would return. @@ -255,7 +267,14 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere if (qualifier != null) { PyType qualifierType = qualifier.getType(); if (qualifierType != null) { - return qualifierType.getCompletionVariants(this); + ArrayList variants = new ArrayList(); + if (qualifier instanceof PyQualifiedExpression) { + Collection attrs = collectAssignedAttributes((PyQualifiedExpression)qualifier); + variants.addAll(attrs); + Collections.addAll(variants, qualifierType.getCompletionVariants(this)); + return variants.toArray(); + } + else return qualifierType.getCompletionVariants(this); } return new Object[0]; }