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");
|
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")
|
@TestMetadata("objectInvoke.kt")
|
||||||
public void testObjectInvoke() throws Exception {
|
public void testObjectInvoke() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
|
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");
|
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")
|
@TestMetadata("objectInvoke.kt")
|
||||||
public void testObjectInvoke() throws Exception {
|
public void testObjectInvoke() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
|
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");
|
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")
|
@TestMetadata("objectInvoke.kt")
|
||||||
public void testObjectInvoke() throws Exception {
|
public void testObjectInvoke() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/callResolution/objectInvoke.kt");
|
||||||
|
|||||||
@@ -115,11 +115,10 @@ internal sealed class CheckReceivers : ResolutionStage() {
|
|||||||
explicitReceiverKind.shouldBeCheckedAgainstExplicit() &&
|
explicitReceiverKind.shouldBeCheckedAgainstExplicit() &&
|
||||||
!explicitReceiverExpression.isSuperReferenceExpression()
|
!explicitReceiverExpression.isSuperReferenceExpression()
|
||||||
) {
|
) {
|
||||||
candidate.resolveArgumentExpression(
|
candidate.resolvePlainExpressionArgument(
|
||||||
candidate.csBuilder,
|
candidate.csBuilder,
|
||||||
argument = explicitReceiverExpression,
|
argument = explicitReceiverExpression,
|
||||||
expectedType = candidate.substitutor.substituteOrSelf(expectedReceiverType),
|
expectedType = candidate.substitutor.substituteOrSelf(expectedReceiverType),
|
||||||
expectedTypeRef = explicitReceiverExpression.typeRef,
|
|
||||||
sink = sink,
|
sink = sink,
|
||||||
context = context,
|
context = context,
|
||||||
isReceiver = true,
|
isReceiver = true,
|
||||||
|
|||||||
Reference in New Issue
Block a user