Initialize builder inference lambda anyway, even a call is inapplicable

^KT-47744 Fixed
This commit is contained in:
Victor Petukhov
2021-07-15 11:17:27 +03:00
committed by teamcityserver
parent 2b0ba6fa40
commit 357fda2efa
19 changed files with 227 additions and 1 deletions
@@ -12988,6 +12988,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("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -12988,6 +12988,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("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -17903,6 +17903,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@Test
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -88,6 +88,8 @@ class DelegatedPropertyInferenceSession(
diagnosticsHolder: KotlinDiagnosticsHolder
): Map<TypeConstructor, UnwrappedType> = emptyMap()
override fun initializeLambda(lambda: ResolvedLambdaAtom) {}
override fun writeOnlyStubs(callInfo: SingleCallResolutionResult): Boolean = false
override fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom) = true
@@ -124,4 +126,6 @@ class InferenceSessionForExistingCandidates(
): ConstraintSystemCompletionMode? = null
override fun resolveReceiverIndependently(): Boolean = resolveReceiverIndependently
override fun initializeLambda(lambda: ResolvedLambdaAtom) {}
}
@@ -223,13 +223,17 @@ class BuilderInferenceSession(
return ComposedSubstitutor(currentSubstitutor, createNonFixedTypeToVariableSubstitutor())
}
override fun initializeLambda(lambda: ResolvedLambdaAtom) {
this.lambda = lambda
}
override fun inferPostponedVariables(
lambda: ResolvedLambdaAtom,
initialStorage: ConstraintStorage,
completionMode: ConstraintSystemCompletionMode,
diagnosticsHolder: KotlinDiagnosticsHolder,
): Map<TypeConstructor, UnwrappedType>? {
this.lambda = lambda
initializeLambda(lambda)
fun getResultingSubstitutor(): NewTypeSubstitutor {
val storageSubstitutor = initialStorage.buildResultingSubstitutor(commonSystem, transformTypeVariablesToErrorTypes = false)
@@ -30,6 +30,8 @@ interface InferenceSession {
diagnosticsHolder: KotlinDiagnosticsHolder
): Map<TypeConstructor, UnwrappedType> = emptyMap()
override fun initializeLambda(lambda: ResolvedLambdaAtom) { }
override fun writeOnlyStubs(callInfo: SingleCallResolutionResult): Boolean = false
override fun callCompleted(resolvedAtom: ResolvedAtom): Boolean = false
override fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom) = true
@@ -53,6 +55,8 @@ interface InferenceSession {
diagnosticsHolder: KotlinDiagnosticsHolder
): Map<TypeConstructor, UnwrappedType>?
fun initializeLambda(lambda: ResolvedLambdaAtom)
fun writeOnlyStubs(callInfo: SingleCallResolutionResult): Boolean
fun callCompleted(resolvedAtom: ResolvedAtom): Boolean
fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom): Boolean
@@ -147,6 +147,7 @@ class PostponedArgumentsAnalyzer(
returnArgumentsAnalysisResult
if (hasInapplicableCallForBuilderInference) {
inferenceSession?.initializeLambda(lambda)
c.getBuilder().removePostponedVariables()
return
}
@@ -0,0 +1,38 @@
// !LANGUAGE: +UnrestrictedBuilderInference
// WITH_RUNTIME
// DONT_TARGET_EXACT_BACKEND: WASM
import kotlin.experimental.ExperimentalTypeInference
@OptIn(ExperimentalTypeInference::class)
fun <T> flow(@BuilderInference block: suspend FlowCollector<T>.() -> Unit) = Flow<T>()
@OptIn(ExperimentalTypeInference::class)
fun <E> produce(@BuilderInference block: suspend SendChannel<E>.() -> Unit) {}
interface SendChannel<in E> {
val onSend: SelectClause2<E, SendChannel<E>>
}
interface SelectClause2<in P, out Q>
class Flow<out T>
interface FlowCollector<in T>
interface SelectBuilder<in R> {
operator fun <P, Q> SelectClause2<P, Q>.invoke(param: P, block: suspend (Q) -> R)
}
inline fun <R> select(crossinline builder: SelectBuilder<R>.() -> Unit) = Unit as R
fun box(): String {
val x: Flow<String> = flow {
produce {
select<Unit> {
onSend("") {
}
}
}
}
return "OK"
}
@@ -0,0 +1,37 @@
// !LANGUAGE: -UnrestrictedBuilderInference
// !DIAGNOSTICS: -EXPERIMENTAL_IS_NOT_ENABLED -UNCHECKED_CAST
// WITH_RUNTIME
import kotlin.experimental.ExperimentalTypeInference
@OptIn(ExperimentalTypeInference::class)
fun <T> flow(@BuilderInference block: suspend FlowCollector<T>.() -> Unit) = Flow<T>()
@OptIn(ExperimentalTypeInference::class)
fun <E> produce(@BuilderInference block: suspend SendChannel<E>.() -> Unit) {}
interface SendChannel<in E> {
val onSend: SelectClause2<E, SendChannel<E>>
}
interface SelectClause2<in P, out Q>
class Flow<out T>
interface FlowCollector<in T>
interface SelectBuilder<in R> {
operator fun <P, Q> SelectClause2<P, Q>.invoke(param: P, block: suspend (Q) -> R)
}
inline fun <R> select(crossinline builder: SelectBuilder<R>.() -> Unit) = Unit as R
fun test() {
val x: Flow<String> = flow {
produce {
select<Unit> {
onSend("") {
}
}
}
}
}
@@ -0,0 +1,37 @@
// !LANGUAGE: -UnrestrictedBuilderInference
// !DIAGNOSTICS: -EXPERIMENTAL_IS_NOT_ENABLED -UNCHECKED_CAST
// WITH_RUNTIME
import kotlin.experimental.ExperimentalTypeInference
@OptIn(ExperimentalTypeInference::class)
fun <T> flow(@BuilderInference block: suspend FlowCollector<T>.() -> Unit) = Flow<T>()
@OptIn(ExperimentalTypeInference::class)
fun <E> produce(@BuilderInference block: suspend SendChannel<E>.() -> Unit) {}
interface SendChannel<in E> {
val onSend: SelectClause2<E, SendChannel<E>>
}
interface SelectClause2<in P, out Q>
class Flow<out T>
interface FlowCollector<in T>
interface SelectBuilder<in R> {
operator fun <P, Q> SelectClause2<P, Q>.invoke(param: P, block: suspend (Q) -> R)
}
inline fun <R> select(crossinline builder: SelectBuilder<R>.() -> Unit) = Unit as R
fun test() {
val x: Flow<String> = flow {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>produce<!> {
select<Unit> {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>onSend<!>("") {
}
}
}
}
}
@@ -0,0 +1,39 @@
package
@kotlin.OptIn(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ T> flow(/*0*/ @kotlin.BuilderInference block: suspend FlowCollector<T>.() -> kotlin.Unit): Flow<T>
@kotlin.OptIn(markerClass = {kotlin.experimental.ExperimentalTypeInference::class}) public fun </*0*/ E> produce(/*0*/ @kotlin.BuilderInference block: suspend SendChannel<E>.() -> kotlin.Unit): kotlin.Unit
public inline fun </*0*/ R> select(/*0*/ crossinline builder: SelectBuilder<R>.() -> kotlin.Unit): R
public fun test(): kotlin.Unit
public final class Flow</*0*/ out T> {
public constructor Flow</*0*/ out T>()
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 FlowCollector</*0*/ in T> {
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 SelectBuilder</*0*/ in R> {
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 abstract operator fun </*0*/ P, /*1*/ Q> SelectClause2<P, Q>.invoke(/*0*/ param: P, /*1*/ block: suspend (Q) -> R): kotlin.Unit
}
public interface SelectClause2</*0*/ in P, /*1*/ out Q> {
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</*0*/ in E> {
public abstract val onSend: SelectClause2<E, SendChannel<E>>
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
}
@@ -12994,6 +12994,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("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -17867,6 +17867,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@Test
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -17903,6 +17903,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@Test
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -14799,6 +14799,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt");
@@ -12988,6 +12988,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/builderInference"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
}
@Test
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt");
}
@Test
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
@@ -12903,6 +12903,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt");
@@ -12309,6 +12309,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt");
@@ -12374,6 +12374,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47052.kt");
}
@TestMetadata("kt47744.kt")
public void testKt47744() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/kt47744.kt");
}
@TestMetadata("labaledCall.kt")
public void testLabaledCall() throws Exception {
runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt");