Unifier: Fix matching of callable references with expression receivers

#KT-21334 Fixed
This commit is contained in:
Alexey Sedunov
2017-11-20 18:22:01 +03:00
parent 354a6cbfd9
commit 998c312ad2
4 changed files with 31 additions and 3 deletions
@@ -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
@@ -0,0 +1,14 @@
public fun String.bar() = ""
fun foo() {
val f = if (1 < 2) {
<selection>"abc"::bar</selection>
} else {
"def"::bar
}
val ff = if (1 < 2) {
("abc")::bar
} else {
("def")::bar
}
}
@@ -0,0 +1,3 @@
"abc"::bar
("abc")::bar
@@ -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");