diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java index e5ceefd33c00..1135be226a6d 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java @@ -2,7 +2,7 @@ package com.jetbrains.python.psi.impl; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; -import com.jetbrains.python.psi.PyReferenceExpression; +import com.jetbrains.python.psi.PyQualifiedExpression; import com.jetbrains.python.psi.resolve.VariantsProcessor; import com.jetbrains.python.psi.types.PyType; @@ -26,7 +26,7 @@ public class PyJavaClassType implements PyType { return null; } - public Object[] getCompletionVariants(final PyReferenceExpression referenceExpression, ProcessingContext context) { + public Object[] getCompletionVariants(final PyQualifiedExpression referenceExpression, ProcessingContext context) { final VariantsProcessor processor = new VariantsProcessor(referenceExpression); myClass.processDeclarations(processor, ResolveState.initial(), null, referenceExpression); return processor.getResult(); diff --git a/python/src/com/jetbrains/python/psi/PyQualifiedExpression.java b/python/src/com/jetbrains/python/psi/PyQualifiedExpression.java index d56b1cb3606f..4c90d5077308 100644 --- a/python/src/com/jetbrains/python/psi/PyQualifiedExpression.java +++ b/python/src/com/jetbrains/python/psi/PyQualifiedExpression.java @@ -1,5 +1,6 @@ package com.jetbrains.python.psi; +import com.intellij.lang.ASTNode; import org.jetbrains.annotations.Nullable; /** @@ -10,4 +11,20 @@ import org.jetbrains.annotations.Nullable; public interface PyQualifiedExpression extends PyExpression { @Nullable PyExpression getQualifier(); + + /** + * Returns the name to the right of the qualifier. + * + * @return the name referenced by the expression. + */ + @Nullable + String getReferencedName(); + + /** + * Returns the element representing the name (to the right of the qualifier). + * + * @return the name element. + */ + @Nullable + ASTNode getNameElement(); } diff --git a/python/src/com/jetbrains/python/psi/PyReferenceExpression.java b/python/src/com/jetbrains/python/psi/PyReferenceExpression.java index e4184bcb7401..76a98e16bf44 100644 --- a/python/src/com/jetbrains/python/psi/PyReferenceExpression.java +++ b/python/src/com/jetbrains/python/psi/PyReferenceExpression.java @@ -1,6 +1,5 @@ package com.jetbrains.python.psi; -import com.intellij.lang.ASTNode; import com.intellij.psi.PsiPolyVariantReference; import com.jetbrains.python.psi.impl.PyQualifiedName; import org.jetbrains.annotations.NotNull; @@ -12,9 +11,6 @@ import org.jetbrains.annotations.Nullable; public interface PyReferenceExpression extends PyQualifiedExpression { PyReferenceExpression[] EMPTY_ARRAY = new PyReferenceExpression[0]; - @Nullable - String getReferencedName(); - /** * Goes through a chain of assignment statements until a non-assignment expression is encountered. * Starts at this, expecting it to resolve to a target of an assignment. @@ -30,6 +26,4 @@ public interface PyReferenceExpression extends PyQualifiedExpression { @NotNull PsiPolyVariantReference getReference(); - - ASTNode getNameElement(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyImportReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/PyImportReferenceImpl.java index 52f37bebd2ce..b62522980f06 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyImportReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyImportReferenceImpl.java @@ -28,8 +28,11 @@ import java.util.HashSet; * @author yole */ public class PyImportReferenceImpl extends PyReferenceImpl { + private final PyReferenceExpressionImpl myElement; + public PyImportReferenceImpl(PyReferenceExpressionImpl element) { super(element); + myElement = element; } @NotNull diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java index af36c2ebc3a7..970b8b33de14 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceImpl.java @@ -31,7 +31,7 @@ import java.util.concurrent.atomic.AtomicInteger; * @author yole */ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference { - protected final PyReferenceExpressionImpl myElement; + protected final PyQualifiedExpression myElement; public PyReferenceImpl(PyReferenceExpressionImpl element) { myElement = element; diff --git a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java index bcfb1442ff37..17c594330424 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java @@ -53,13 +53,21 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl class_list = new ParentMatcher(PyClass.class).search(referenceExpression); boolean within_our_class = class_list != null && class_list.get(0) == this; Set names_already = context.get(PyType.CTX_NAMES); diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index c58fbd7e2f16..018440770d36 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -6,7 +6,7 @@ import com.intellij.psi.*; import com.intellij.util.ProcessingContext; import com.jetbrains.python.PyNames; import com.jetbrains.python.psi.PyFile; -import com.jetbrains.python.psi.PyReferenceExpression; +import com.jetbrains.python.psi.PyQualifiedExpression; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.resolve.VariantsProcessor; import org.jetbrains.annotations.NotNull; @@ -72,7 +72,7 @@ public class PyModuleType implements PyType { // Maybe make it a PyClassType ref return result; } - public Object[] getCompletionVariants(final PyReferenceExpression referenceExpression, ProcessingContext context) { + public Object[] getCompletionVariants(final PyQualifiedExpression referenceExpression, ProcessingContext context) { Set names_already = context.get(CTX_NAMES); List result = new ArrayList(); ResolveImportUtil.ROLE_IN_IMPORT role = ResolveImportUtil.getRoleInImport(referenceExpression.getReference()); diff --git a/python/src/com/jetbrains/python/psi/types/PyNoneType.java b/python/src/com/jetbrains/python/psi/types/PyNoneType.java index 0c38df0dda5e..93e5bdd666ff 100644 --- a/python/src/com/jetbrains/python/psi/types/PyNoneType.java +++ b/python/src/com/jetbrains/python/psi/types/PyNoneType.java @@ -3,7 +3,7 @@ package com.jetbrains.python.psi.types; import com.intellij.psi.PsiElement; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; -import com.jetbrains.python.psi.PyReferenceExpression; +import com.jetbrains.python.psi.PyQualifiedExpression; /** * @author yole @@ -18,7 +18,7 @@ public class PyNoneType implements PyType { // TODO must extend ClassType. It's return null; } - public Object[] getCompletionVariants(final PyReferenceExpression referenceExpression, ProcessingContext context) { + public Object[] getCompletionVariants(final PyQualifiedExpression referenceExpression, ProcessingContext context) { return ArrayUtil.EMPTY_OBJECT_ARRAY; } diff --git a/python/src/com/jetbrains/python/psi/types/PyType.java b/python/src/com/jetbrains/python/psi/types/PyType.java index 36d37936fd96..31a8012ec545 100644 --- a/python/src/com/jetbrains/python/psi/types/PyType.java +++ b/python/src/com/jetbrains/python/psi/types/PyType.java @@ -3,6 +3,7 @@ package com.jetbrains.python.psi.types; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; +import com.jetbrains.python.psi.PyQualifiedExpression; import com.jetbrains.python.psi.PyReferenceExpression; import org.jetbrains.annotations.Nullable; @@ -28,7 +29,7 @@ public interface PyType { * @param context to share state between nested invocations * @return completion variants good for {@link com.intellij.psi.PsiReference#getVariants} return value. */ - Object[] getCompletionVariants(final PyReferenceExpression referenceExpression, ProcessingContext context); + Object[] getCompletionVariants(final PyQualifiedExpression referenceExpression, ProcessingContext context); /** * Context key for access to a set of names already found by variant search.