From 8e19ba9851728c7418878fc05de2cf21308eaba1 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 27 Jan 2014 14:57:25 +0400 Subject: [PATCH] Fix JetSimpleNameExpression#getReceiver Correct behaviour for unary, binary expressions and type references Add instanceof checks in TipsManager so it's clear it only takes care of certain types of JetSimpleNameExpression --- .../jet/lang/psi/JetSimpleNameExpression.java | 22 ++++++++++++++----- .../jet/plugin/caches/JetShortNamesCache.java | 15 +------------ .../jet/plugin/codeInsight/TipsManager.java | 10 ++++----- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java index ec7d236f7d0..7fea20edba5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java @@ -35,10 +35,6 @@ public class JetSimpleNameExpression extends JetReferenceExpression { super(node); } - /** - * null if it's not a code expression - * @return receiver expression - */ @Nullable public JetExpression getReceiverExpression() { PsiElement parent = getParent(); @@ -55,10 +51,24 @@ public class JetSimpleNameExpression extends JetReferenceExpression { parent = callExpression.getParent(); if (parent instanceof JetQualifiedExpression) { JetQualifiedExpression qualifiedExpression = (JetQualifiedExpression) parent; - return qualifiedExpression.getReceiverExpression(); + JetExpression parentsReceiver = qualifiedExpression.getReceiverExpression(); + if (parentsReceiver != callExpression) { + return parentsReceiver; + } + } + } + else if (parent instanceof JetBinaryExpression && ((JetBinaryExpression) parent).getOperationReference() == this) { + return ((JetBinaryExpression) parent).getLeft(); + } + else if (parent instanceof JetUnaryExpression && ((JetUnaryExpression) parent).getOperationReference() == this) { + return ((JetUnaryExpression) parent).getBaseExpression(); + } + else if (parent instanceof JetUserType) { + JetUserType qualifier = ((JetUserType) parent).getQualifier(); + if (qualifier != null) { + return qualifier.getReferenceExpression(); } } - return null; } diff --git a/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java b/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java index 9b56f6cdc0d..63bd642afad 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.java @@ -292,8 +292,7 @@ public class JetShortNamesCache extends PsiShortNamesCache { @NotNull GlobalSearchScope searchScope ) { BindingContext context = resolveSession.resolveToElement(expression); - JetExpression receiverExpression = getReceiverForExtensionCall(expression); - + JetExpression receiverExpression = expression.getReceiverExpression(); if (receiverExpression == null) { return Collections.emptyList(); } @@ -325,18 +324,6 @@ public class JetShortNamesCache extends PsiShortNamesCache { return resultDescriptors; } - @Nullable - private static JetExpression getReceiverForExtensionCall(@NotNull JetSimpleNameExpression expression) { - PsiElement parent = expression.getParent(); - if (parent instanceof JetBinaryExpression && ((JetBinaryExpression) parent).getOperationReference() == expression) { - return ((JetBinaryExpression) parent).getLeft(); - } - else if (parent instanceof JetUnaryExpression && ((JetUnaryExpression) parent).getOperationReference() == expression) { - return ((JetUnaryExpression) parent).getBaseExpression(); - } - return expression.getReceiverExpression(); - } - @NotNull private Set extensionFunctionsFromSourceFqNames( @NotNull Condition acceptedNameCondition, diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.java index 2a8e172d2d5..d9a7a8eabce 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/TipsManager.java @@ -20,16 +20,14 @@ import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; -import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetImportDirective; -import org.jetbrains.jet.lang.psi.JetPackageDirective; -import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastUtils; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; @@ -54,7 +52,9 @@ public final class TipsManager { @NotNull BindingContext context ) { JetExpression receiverExpression = expression.getReceiverExpression(); - if (receiverExpression != null) { + PsiElement parent = expression.getParent(); + boolean inPositionForCompletionWithReceiver = parent instanceof JetCallExpression || parent instanceof JetQualifiedExpression; + if (receiverExpression != null && inPositionForCompletionWithReceiver) { // Process as call expression JetScope resolutionScope = context.get(BindingContext.RESOLUTION_SCOPE, expression); JetType expressionType = context.get(BindingContext.EXPRESSION_TYPE, receiverExpression);