diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt index ba37f70c866..e27038cab7c 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt @@ -49,6 +49,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.KotlinTypeChecker +import org.jetbrains.kotlin.types.expressions.DoubleColonLHS import org.jetbrains.kotlin.types.expressions.OperatorConventions import java.util.* @@ -458,10 +459,14 @@ class KotlinPsiUnifier( && ((parent.operationToken as KtToken) in OperatorConventions.INCREMENT_OPERATIONS) } - private fun matchCallableReferences(e1: KtCallableReferenceExpression, e2: KtCallableReferenceExpression): Boolean { + private fun KtCallableReferenceExpression.hasExpressionReceiver(): Boolean = + bindingContext[BindingContext.DOUBLE_COLON_LHS, receiverExpression] is DoubleColonLHS.Expression + + private fun matchCallableReferences(e1: KtCallableReferenceExpression, e2: KtCallableReferenceExpression): Status? { + if (e1.hasExpressionReceiver() || e2.hasExpressionReceiver()) return null val d1 = e1.bindingContext[BindingContext.REFERENCE_TARGET, e1.callableReference] val d2 = e2.bindingContext[BindingContext.REFERENCE_TARGET, e2.callableReference] - return matchDescriptors(d1, d2) + return if (matchDescriptors(d1, d2)) MATCHED else UNMATCHED } private fun matchThisExpressions(e1: KtThisExpression, e2: KtThisExpression): Boolean { @@ -748,7 +753,7 @@ class KotlinPsiUnifier( UNMATCHED e1 is KtCallableReferenceExpression && e2 is KtCallableReferenceExpression -> - if (matchCallableReferences(e1, e2)) MATCHED else UNMATCHED + matchCallableReferences(e1, e2) e1 is KtThisExpression && e2 is KtThisExpression -> if (matchThisExpressions(e1, e2)) MATCHED else UNMATCHED diff --git a/idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt b/idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt new file mode 100644 index 00000000000..2b8120346d7 --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt @@ -0,0 +1,14 @@ +public fun String.bar() = "" + +fun foo() { + val f = if (1 < 2) { + "abc"::bar + } else { + "def"::bar + } + val ff = if (1 < 2) { + ("abc")::bar + } else { + ("def")::bar + } +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt.match b/idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt.match new file mode 100644 index 00000000000..e9df55c3c96 --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt.match @@ -0,0 +1,3 @@ +"abc"::bar + +("abc")::bar \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java index 99602f84095..f4a8aacaf59 100644 --- a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java @@ -351,6 +351,12 @@ public class PsiUnifierTestGenerated extends AbstractPsiUnifierTest { doTest(fileName); } + @TestMetadata("expressionReceivers.kt") + public void testExpressionReceivers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt"); + doTest(fileName); + } + @TestMetadata("functionRefRuntime.kt") public void testFunctionRefRuntime() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/callableReferences/functionRefRuntime.kt");