From c5faf532f543c95adac352f03c85e8baf0d4c40f Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Fri, 30 Apr 2021 13:24:37 +0300 Subject: [PATCH] Allow builder inference calls with labeled lambda ^KT-24993 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../calls/inference/CoroutineInferenceUtil.kt | 10 ++++----- .../builderInference/labaledCall.fir.kt | 21 +++++++++++++++++++ .../inference/builderInference/labaledCall.kt | 21 +++++++++++++++++++ .../builderInference/labaledCall.txt | 13 ++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.txt 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 070867e6333..2d6dcb8ef9d 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 @@ -12638,6 +12638,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/builderInference"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("labaledCall.kt") + public void testLabaledCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt"); + } + @Test @TestMetadata("simpleLambdaInCallWithAnotherLambdaWithBuilderInference.kt") public void testSimpleLambdaInCallWithAnotherLambdaWithBuilderInference() 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 70455267193..fbd9eda2bc0 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 @@ -12638,6 +12638,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/builderInference"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("labaledCall.kt") + public void testLabaledCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt"); + } + @Test @TestMetadata("simpleLambdaInCallWithAnotherLambdaWithBuilderInference.kt") public void testSimpleLambdaInCallWithAnotherLambdaWithBuilderInference() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceUtil.kt index d661cd30795..476f0acd3b3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceUtil.kt @@ -14,10 +14,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtFunction -import org.jetbrains.kotlin.psi.KtLambdaExpression -import org.jetbrains.kotlin.psi.ValueArgument +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRendererOptions import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver @@ -335,8 +332,11 @@ fun isCoroutineCallWithAdditionalInference( else parameterDescriptor.hasSuspendFunctionType + val pureExpression = argument.getArgumentExpression() + val baseExpression = if (pureExpression is KtLabeledExpression) pureExpression.baseExpression else pureExpression + return parameterHasOptIn && - argument.getArgumentExpression() is KtLambdaExpression && + baseExpression is KtLambdaExpression && parameterDescriptor.type.let { it.isBuiltinFunctionalType && it.getReceiverTypeFromFunctionType() != null } } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.fir.kt new file mode 100644 index 00000000000..2b6b82d00a7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.fir.kt @@ -0,0 +1,21 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -UNCHECKED_CAST -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE +// WITH_RUNTIME + +// FILE: main.kt +import kotlin.experimental.ExperimentalTypeInference + +@UseExperimental(ExperimentalTypeInference::class) +fun build(@BuilderInference block: TestInterface.() -> Unit): R = TODO() + +interface TestInterface { + fun emit(r: R) + fun get(): R +} + +fun main() { + build myLabel@ { + emit("") + val x = this@myLabel + "" + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt b/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt new file mode 100644 index 00000000000..2b6b82d00a7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt @@ -0,0 +1,21 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -DEPRECATION -UNCHECKED_CAST -EXPERIMENTAL_IS_NOT_ENABLED -UNUSED_VARIABLE +// WITH_RUNTIME + +// FILE: main.kt +import kotlin.experimental.ExperimentalTypeInference + +@UseExperimental(ExperimentalTypeInference::class) +fun build(@BuilderInference block: TestInterface.() -> Unit): R = TODO() + +interface TestInterface { + fun emit(r: R) + fun get(): R +} + +fun main() { + build myLabel@ { + emit("") + val x = this@myLabel + "" + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.txt b/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.txt new file mode 100644 index 00000000000..3bd18b8f535 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.txt @@ -0,0 +1,13 @@ +package + +@kotlin.UseExperimental(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun build(/*0*/ @kotlin.BuilderInference block: TestInterface.() -> kotlin.Unit): R +public fun main(): kotlin.Unit + +public interface TestInterface { + public abstract fun emit(/*0*/ r: R): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun get(): R + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + 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 3d5a718aeab..f8c18499ea5 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 @@ -12644,6 +12644,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/builderInference"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("labaledCall.kt") + public void testLabaledCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/labaledCall.kt"); + } + @Test @TestMetadata("simpleLambdaInCallWithAnotherLambdaWithBuilderInference.kt") public void testSimpleLambdaInCallWithAnotherLambdaWithBuilderInference() throws Exception {