Unifier: Fix matching of callable references with expression receivers
#KT-21334 Fixed
This commit is contained in:
+8
-3
@@ -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
|
||||
|
||||
|
||||
+14
@@ -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
|
||||
}
|
||||
}
|
||||
Vendored
+3
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user