From 998c312ad2f9d192fa87d10143f6e73d838f02cb Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 20 Nov 2017 18:22:01 +0300 Subject: [PATCH] Unifier: Fix matching of callable references with expression receivers #KT-21334 Fixed --- .../util/psi/patternMatching/KotlinPsiUnifier.kt | 11 ++++++++--- .../callableReferences/expressionReceivers.kt | 14 ++++++++++++++ .../expressionReceivers.kt.match | 3 +++ .../patternMatching/PsiUnifierTestGenerated.java | 6 ++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt create mode 100644 idea/testData/unifier/equivalence/expressions/callableReferences/expressionReceivers.kt.match 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");