From d857142514e42be4f134a763592335dfa29d7073 Mon Sep 17 00:00:00 2001 From: "Anastasia.Shadrina" Date: Tue, 15 Mar 2022 15:15:51 +0700 Subject: [PATCH] KT-51243 Fix parameterized contextual lambda ^KT-51243 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../fir/resolve/inference/PostponedAtoms.kt | 13 ++++++-- .../resolve/calls/model/ResolutionAtoms.kt | 30 ++++++++++++++----- .../parameterizedContextualLambda.kt | 13 ++++++++ .../parameterizedContextualLambda.kt | 20 +++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ 10 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 204ef9574bb..a9eafc8dd7b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -10907,6 +10907,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("parameterizedContextualLambda.kt") + public void testParameterizedContextualLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 2740162fcaa..66774a47b76 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -10907,6 +10907,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("parameterizedContextualLambda.kt") + public void testParameterizedContextualLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 950b09fbfd3..8b0790fd255 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -10907,6 +10907,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("parameterizedContextualLambda.kt") + public void testParameterizedContextualLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 1ba6e60789d..92946e270ea 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -16734,6 +16734,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("parameterizedContextualLambda.kt") + public void testParameterizedContextualLambda() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt"); + } + @Test @TestMetadata("passingLambdaToContextualParam.kt") public void testPassingLambdaToContextualParam() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedAtoms.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedAtoms.kt index 0a50b1bdc5f..987edaeaf92 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedAtoms.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedAtoms.kt @@ -19,11 +19,11 @@ import org.jetbrains.kotlin.resolve.calls.model.LambdaWithTypeVariableAsExpected import org.jetbrains.kotlin.resolve.calls.model.PostponedCallableReferenceMarker import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker +import org.jetbrains.kotlin.utils.addIfNotNull // --------------------------- Variables --------------------------- - // -------------------------- Atoms -------------------------- sealed class PostponedResolvedAtom : PostponedResolvedAtomMarker { @@ -62,7 +62,16 @@ class ResolvedLambdaAtom( lateinit var returnStatements: Collection - override val inputTypes: Collection get() = receiver?.let { parameters + it } ?: parameters + override val inputTypes: Collection + get() { + if (receiver == null && contextReceivers.isEmpty()) return parameters + return ArrayList(parameters.size + contextReceivers.size + (if (receiver != null) 1 else 0)).apply { + addAll(parameters) + addIfNotNull(receiver) + addAll(contextReceivers) + } + } + override val outputType: ConeKotlinType get() = returnType fun replaceExpectedType(expectedType: ConeKotlinType, newReturnType: ConeTypeVariableType) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt index 5fe6c8185da..e0399a78813 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionAtoms.kt @@ -8,20 +8,26 @@ package org.jetbrains.kotlin.resolve.calls.model import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.calls.components.* +import org.jetbrains.kotlin.resolve.calls.components.ReturnArgumentsInfo +import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper +import org.jetbrains.kotlin.resolve.calls.components.candidate.CallableReferenceResolutionCandidate +import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate +import org.jetbrains.kotlin.resolve.calls.components.extractInputOutputTypesFromCallableReferenceExpectedType +import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.components.FreshVariableNewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor -import org.jetbrains.kotlin.resolve.calls.inference.model.* +import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintError +import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintMismatch +import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintWarning +import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind -import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate -import org.jetbrains.kotlin.resolve.calls.components.candidate.CallableReferenceResolutionCandidate -import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.UnwrappedType import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.typeUtil.unCapture +import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs /** @@ -174,7 +180,16 @@ class ResolvedLambdaAtom( setAnalyzedResults(subResolvedAtoms) } - override val inputTypes: Collection get() = receiver?.let { parameters + it } ?: parameters + override val inputTypes: Collection + get() { + if (receiver == null && contextReceivers.isEmpty()) return parameters + return ArrayList(parameters.size + contextReceivers.size + (if (receiver != null) 1 else 0)).apply { + addAll(parameters) + addIfNotNull(receiver) + addAll(contextReceivers) + } + } + override val outputType: UnwrappedType get() = returnType } @@ -230,8 +245,7 @@ class CallableReferenceWithRevisedExpectedTypeAtom( class PostponedCallableReferenceAtom( eagerCallableReferenceAtom: EagerCallableReferenceAtom ) : AbstractPostponedCallableReferenceAtom(eagerCallableReferenceAtom.atom, eagerCallableReferenceAtom.expectedType), - PostponedCallableReferenceMarker -{ + PostponedCallableReferenceMarker { override var revisedExpectedType: UnwrappedType? = null private set diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt new file mode 100644 index 00000000000..d2f9e37223b --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt @@ -0,0 +1,13 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// FIR status: context receivers aren't yet supported + +class A { + val result = "OK" +} + +fun test(receiver: T, action: context(T) () -> String) = action(receiver) + +fun box(): String = with(A()) { + result +} diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt new file mode 100644 index 00000000000..725ff32d087 --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt @@ -0,0 +1,20 @@ +// FIR_IDENTICAL +// SKIP_TXT +// !LANGUAGE: +ContextReceivers + +fun test(action: context(T) () -> Unit) {} + +fun test2(actionWithArg: context(T) (T) -> Unit) {} + +fun main() { + test { + length + } + test { + toDouble() + } + test2 { a -> + length + a.length + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 2fb738f0622..cb5f9f704ad 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -10913,6 +10913,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("parameterizedContextualLambda.kt") + public void testParameterizedContextualLambda() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/parameterizedContextualLambda.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 157940fa69c..7510823e2bb 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -16734,6 +16734,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("parameterizedContextualLambda.kt") + public void testParameterizedContextualLambda() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/parameterizedContextualLambda.kt"); + } + @Test @TestMetadata("passingLambdaToContextualParam.kt") public void testPassingLambdaToContextualParam() throws Exception {