From 5cf7c7e5bff14b97c7b97ceda075f1048909622c Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 18 Jun 2019 15:03:31 +0300 Subject: [PATCH] [NI] Fix composite substitution for stubbed type in builder-inference #KT-32038 Fixed --- .../inference/CoroutineInferenceSession.kt | 4 ++- .../inference/twoReceiversInScope.kt | 29 +++++++++++++++++++ .../inference/twoReceiversInScope.txt | 25 ++++++++++++++++ .../DiagnosticsTestWithStdLibGenerated.java | 5 ++++ ...ticsTestWithStdLibUsingJavacGenerated.java | 5 ++++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt index 01e62242d8b..c5297dee76c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSession.kt @@ -217,6 +217,8 @@ class CoroutineInferenceSession( class ComposedSubstitutor(val left: NewTypeSubstitutor, val right: NewTypeSubstitutor) : NewTypeSubstitutor { override fun substituteNotNullTypeWithConstructor(constructor: TypeConstructor): UnwrappedType? { - return left.safeSubstitute(right.substituteNotNullTypeWithConstructor(constructor) ?: return null) + return left.substituteNotNullTypeWithConstructor( + right.substituteNotNullTypeWithConstructor(constructor)?.constructor ?: constructor + ) } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.kt new file mode 100644 index 00000000000..264c95ec57f --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.kt @@ -0,0 +1,29 @@ +// !USE_EXPERIMENTAL: kotlin.Experimental +// !DIAGNOSTICS: -UNUSED_PARAMETER + +@file:UseExperimental(ExperimentalTypeInference::class) + +import kotlin.experimental.ExperimentalTypeInference + +interface MyFlow +interface MyFlowCollector + +fun flow(@BuilderInference block: MyFlowCollector.() -> Unit): MyFlow = TODO() + +interface SendChannel { + fun send(element: E) +} + +fun

produce(@BuilderInference block: SendChannel

.() -> Unit) {} + +fun MyFlow.collect(action: (C) -> Unit) {} + +private fun MyFlow.idScoped(): MyFlow { + return flow { + produce { + collect { + send(it) + } + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.txt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.txt new file mode 100644 index 00000000000..6b50b41daa0 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.txt @@ -0,0 +1,25 @@ +package + +public fun flow(/*0*/ @kotlin.BuilderInference block: MyFlowCollector.() -> kotlin.Unit): MyFlow +public fun produce(/*0*/ @kotlin.BuilderInference block: SendChannel

.() -> kotlin.Unit): kotlin.Unit +public fun MyFlow.collect(/*0*/ action: (C) -> kotlin.Unit): kotlin.Unit +private fun MyFlow.idScoped(): MyFlow + +public interface MyFlow { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface MyFlowCollector { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface SendChannel { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract fun send(/*0*/ element: E): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 02a9a21239f..df0710fc468 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -1932,6 +1932,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/suspendCallsWrongUpperBound.kt"); } + @TestMetadata("twoReceiversInScope.kt") + public void testTwoReceiversInScope() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.kt"); + } + @TestMetadata("typeFromReceiver.kt") public void testTypeFromReceiver() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/typeFromReceiver.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index a47a880779b..a9ef63a3eb4 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -1932,6 +1932,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/suspendCallsWrongUpperBound.kt"); } + @TestMetadata("twoReceiversInScope.kt") + public void testTwoReceiversInScope() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/twoReceiversInScope.kt"); + } + @TestMetadata("typeFromReceiver.kt") public void testTypeFromReceiver() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/inference/typeFromReceiver.kt");