FIR: Fix false-positive successful resolution of call with lambda receiver

Do not try to integrate/postpone receiver expression to the base system
Receiver should be resolved independently anyway
This commit is contained in:
Denis Zharkov
2020-11-12 11:29:20 +03:00
parent 396e799e5d
commit e2099a0307
6 changed files with 51 additions and 2 deletions
@@ -0,0 +1,14 @@
fun (() -> String).foo() {}
fun String.foo() {}
fun String.bar() {}
fun main1() {
{ "" }.foo()
"".foo()
}
fun main2() {
{ "" }.<!INAPPLICABLE_CANDIDATE!>bar<!>()
"".bar()
}
@@ -0,0 +1,21 @@
FILE: lambdaAsReceiver.kt
public final fun R|() -> kotlin/String|.foo(): R|kotlin/Unit| {
}
public final fun R|kotlin/String|.foo(): R|kotlin/Unit| {
}
public final fun R|kotlin/String|.bar(): R|kotlin/Unit| {
}
public final fun main1(): R|kotlin/Unit| {
fun <anonymous>(): R|kotlin/String| {
^ String()
}
.R|/foo|()
String().R|/foo|()
}
public final fun main2(): R|kotlin/Unit| {
fun <anonymous>(): R|kotlin/String| {
^ String()
}
.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /bar>#()
String().R|/bar|()
}
@@ -724,6 +724,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.kt");
}
@TestMetadata("lambdaAsReceiver.kt")
public void testLambdaAsReceiver() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/lambdaAsReceiver.kt");
}
@TestMetadata("objectInvoke.kt")
public void testObjectInvoke() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
@@ -724,6 +724,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.kt");
}
@TestMetadata("lambdaAsReceiver.kt")
public void testLambdaAsReceiver() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/lambdaAsReceiver.kt");
}
@TestMetadata("objectInvoke.kt")
public void testObjectInvoke() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
@@ -724,6 +724,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/invokeWithReceiverAndArgument.kt");
}
@TestMetadata("lambdaAsReceiver.kt")
public void testLambdaAsReceiver() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/lambdaAsReceiver.kt");
}
@TestMetadata("objectInvoke.kt")
public void testObjectInvoke() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
@@ -115,11 +115,10 @@ internal sealed class CheckReceivers : ResolutionStage() {
explicitReceiverKind.shouldBeCheckedAgainstExplicit() &&
!explicitReceiverExpression.isSuperReferenceExpression()
) {
candidate.resolveArgumentExpression(
candidate.resolvePlainExpressionArgument(
candidate.csBuilder,
argument = explicitReceiverExpression,
expectedType = candidate.substitutor.substituteOrSelf(expectedReceiverType),
expectedTypeRef = explicitReceiverExpression.typeRef,
sink = sink,
context = context,
isReceiver = true,