From a274216f14da3e86f5e68a3efd27be9f74265127 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 17 Sep 2020 17:30:43 +0300 Subject: [PATCH] [FIR] Check that expected lambda type is extension function using cone expected type #KT-41991 In progress --- .../resolve/arguments/varargOfLambdasWithReceiver.kt | 9 +++++++++ .../resolve/arguments/varargOfLambdasWithReceiver.txt | 9 +++++++++ .../kotlin/fir/FirDiagnosticsTestGenerated.java | 5 +++++ .../fir/FirDiagnosticsWithLightTreeTestGenerated.java | 5 +++++ .../kotlin/fir/resolve/inference/InferenceUtils.kt | 4 ++-- 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.kt create mode 100644 compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.txt diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.kt b/compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.kt new file mode 100644 index 00000000000..ea664c1d8b7 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.kt @@ -0,0 +1,9 @@ +// ISSUE: KT-41991 + +fun runLambdas(vararg values: String.() -> Unit) {} + +fun test() { + runLambdas({ + length + }) +} diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.txt b/compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.txt new file mode 100644 index 00000000000..077fc8d95f4 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.txt @@ -0,0 +1,9 @@ +FILE: varargOfLambdasWithReceiver.kt + public final fun runLambdas(vararg values: @R|kotlin/ExtensionFunctionType|() R|kotlin/Array>|): R|kotlin/Unit| { + } + public final fun test(): R|kotlin/Unit| { + R|/runLambdas|(vararg(runLambdas@fun R|kotlin/String|.(): R|kotlin/Unit| { + this@R|special/anonymous|.R|kotlin/String.length| + } + )) + } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 63378574e3f..0e44aecf096 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -575,6 +575,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/vararg.kt"); } + @TestMetadata("varargOfLambdasWithReceiver.kt") + public void testVarargOfLambdasWithReceiver() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.kt"); + } + @TestMetadata("varargProjection.kt") public void testVarargProjection() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/varargProjection.kt"); diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index f559591d863..178784b2633 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -575,6 +575,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/arguments/vararg.kt"); } + @TestMetadata("varargOfLambdasWithReceiver.kt") + public void testVarargOfLambdasWithReceiver() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/varargOfLambdasWithReceiver.kt"); + } + @TestMetadata("varargProjection.kt") public void testVarargProjection() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/varargProjection.kt"); diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt index eee1767d08c..56c10cf8da7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceUtils.kt @@ -46,7 +46,7 @@ fun ConeKotlinType.isKFunctionType(session: FirSession): Boolean { } fun ConeKotlinType.receiverType(expectedTypeRef: FirTypeRef?, session: FirSession): ConeKotlinType? { - if (isBuiltinFunctionalType(session) && expectedTypeRef?.isExtensionFunctionType(session) == true) { + if (isBuiltinFunctionalType(session) && isExtensionFunctionType(session)) { return (this.fullyExpandedType(session).typeArguments.first() as ConeKotlinTypeProjection).type } return null @@ -99,7 +99,7 @@ fun extractLambdaInfoFromFunctionalType( val receiverType = argument.receiverType ?: expectedType.receiverType(expectedTypeRef, session) val returnType = argument.returnType ?: expectedType.returnType(session) ?: return null - val parameters = extractLambdaParameters(expectedType, argument, expectedTypeRef?.isExtensionFunctionType(session) ?: false, session) + val parameters = extractLambdaParameters(expectedType, argument, expectedType.isExtensionFunctionType(session), session) return ResolvedLambdaAtom( argument,