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:
+14
@@ -0,0 +1,14 @@
|
||||
fun (() -> String).foo() {}
|
||||
fun String.foo() {}
|
||||
|
||||
fun String.bar() {}
|
||||
|
||||
fun main1() {
|
||||
{ "" }.foo()
|
||||
"".foo()
|
||||
}
|
||||
|
||||
fun main2() {
|
||||
{ "" }.<!INAPPLICABLE_CANDIDATE!>bar<!>()
|
||||
"".bar()
|
||||
}
|
||||
+21
@@ -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|()
|
||||
}
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user