[NI] Fix substitution in builder-inference for empty common system
This commit is contained in:
+9
-4
@@ -105,7 +105,13 @@ class CoroutineInferenceSession(
|
|||||||
lambda: ResolvedLambdaAtom,
|
lambda: ResolvedLambdaAtom,
|
||||||
initialStorage: ConstraintStorage,
|
initialStorage: ConstraintStorage,
|
||||||
diagnosticsHolder: KotlinDiagnosticsHolder
|
diagnosticsHolder: KotlinDiagnosticsHolder
|
||||||
): Map<TypeConstructor, UnwrappedType> {
|
): Map<TypeConstructor, UnwrappedType>? {
|
||||||
|
if (partiallyResolvedCallsInfo.isEmpty() && commonCalls.isEmpty()) {
|
||||||
|
val emptyCommonSystem = NewConstraintSystemImpl(callComponents.constraintInjector, builtIns)
|
||||||
|
updateCalls(lambda, emptyCommonSystem)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
val commonSystem = buildCommonSystem(initialStorage)
|
val commonSystem = buildCommonSystem(initialStorage)
|
||||||
|
|
||||||
val context = commonSystem.asConstraintSystemCompleterContext()
|
val context = commonSystem.asConstraintSystemCompleterContext()
|
||||||
@@ -281,9 +287,8 @@ class CoroutineInferenceSession(
|
|||||||
|
|
||||||
class ComposedSubstitutor(val left: NewTypeSubstitutor, val right: NewTypeSubstitutor) : NewTypeSubstitutor {
|
class ComposedSubstitutor(val left: NewTypeSubstitutor, val right: NewTypeSubstitutor) : NewTypeSubstitutor {
|
||||||
override fun substituteNotNullTypeWithConstructor(constructor: TypeConstructor): UnwrappedType? {
|
override fun substituteNotNullTypeWithConstructor(constructor: TypeConstructor): UnwrappedType? {
|
||||||
return left.substituteNotNullTypeWithConstructor(
|
val rightSubstitution = right.substituteNotNullTypeWithConstructor(constructor)
|
||||||
right.substituteNotNullTypeWithConstructor(constructor)?.constructor ?: constructor
|
return left.substituteNotNullTypeWithConstructor(rightSubstitution?.constructor ?: constructor) ?: rightSubstitution
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val isEmpty: Boolean get() = left.isEmpty && right.isEmpty
|
override val isEmpty: Boolean get() = left.isEmpty && right.isEmpty
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ interface InferenceSession {
|
|||||||
lambda: ResolvedLambdaAtom,
|
lambda: ResolvedLambdaAtom,
|
||||||
initialStorage: ConstraintStorage,
|
initialStorage: ConstraintStorage,
|
||||||
diagnosticsHolder: KotlinDiagnosticsHolder
|
diagnosticsHolder: KotlinDiagnosticsHolder
|
||||||
): Map<TypeConstructor, UnwrappedType>
|
): Map<TypeConstructor, UnwrappedType>?
|
||||||
|
|
||||||
fun writeOnlyStubs(callInfo: SingleCallResolutionResult): Boolean
|
fun writeOnlyStubs(callInfo: SingleCallResolutionResult): Boolean
|
||||||
fun callCompleted(resolvedAtom: ResolvedAtom): Boolean
|
fun callCompleted(resolvedAtom: ResolvedAtom): Boolean
|
||||||
|
|||||||
+4
@@ -159,6 +159,10 @@ class PostponedArgumentsAnalyzer(
|
|||||||
val storageSnapshot = c.getBuilder().currentStorage()
|
val storageSnapshot = c.getBuilder().currentStorage()
|
||||||
|
|
||||||
val postponedVariables = inferenceSession.inferPostponedVariables(lambda, storageSnapshot, diagnosticHolder)
|
val postponedVariables = inferenceSession.inferPostponedVariables(lambda, storageSnapshot, diagnosticHolder)
|
||||||
|
if (postponedVariables == null) {
|
||||||
|
c.getBuilder().removePostponedVariables()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
for ((constructor, resultType) in postponedVariables) {
|
for ((constructor, resultType) in postponedVariables) {
|
||||||
val variableWithConstraints = storageSnapshot.notFixedTypeVariables[constructor] ?: continue
|
val variableWithConstraints = storageSnapshot.notFixedTypeVariables[constructor] ?: continue
|
||||||
|
|||||||
+1
@@ -34,6 +34,7 @@ interface ConstraintSystemOperation {
|
|||||||
fun registerVariable(variable: TypeVariableMarker)
|
fun registerVariable(variable: TypeVariableMarker)
|
||||||
fun markPostponedVariable(variable: TypeVariableMarker)
|
fun markPostponedVariable(variable: TypeVariableMarker)
|
||||||
fun unmarkPostponedVariable(variable: TypeVariableMarker)
|
fun unmarkPostponedVariable(variable: TypeVariableMarker)
|
||||||
|
fun removePostponedVariables()
|
||||||
|
|
||||||
fun addSubtypeConstraint(lowerType: KotlinTypeMarker, upperType: KotlinTypeMarker, position: ConstraintPosition)
|
fun addSubtypeConstraint(lowerType: KotlinTypeMarker, upperType: KotlinTypeMarker, position: ConstraintPosition)
|
||||||
fun addEqualityConstraint(a: KotlinTypeMarker, b: KotlinTypeMarker, position: ConstraintPosition)
|
fun addEqualityConstraint(a: KotlinTypeMarker, b: KotlinTypeMarker, position: ConstraintPosition)
|
||||||
|
|||||||
+4
@@ -103,6 +103,10 @@ class NewConstraintSystemImpl(
|
|||||||
storage.postponedTypeVariables -= variable
|
storage.postponedTypeVariables -= variable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun removePostponedVariables() {
|
||||||
|
storage.postponedTypeVariables.clear()
|
||||||
|
}
|
||||||
|
|
||||||
override fun addSubtypeConstraint(lowerType: KotlinTypeMarker, upperType: KotlinTypeMarker, position: ConstraintPosition) =
|
override fun addSubtypeConstraint(lowerType: KotlinTypeMarker, upperType: KotlinTypeMarker, position: ConstraintPosition) =
|
||||||
constraintInjector.addInitialSubtypeConstraint(
|
constraintInjector.addInitialSubtypeConstraint(
|
||||||
apply { checkState(State.BUILDING, State.COMPLETION, State.TRANSACTION) },
|
apply { checkState(State.BUILDING, State.COMPLETION, State.TRANSACTION) },
|
||||||
|
|||||||
Vendored
+52
@@ -0,0 +1,52 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// WITH_COROUTINES
|
||||||
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
|
|
||||||
|
import helpers.*
|
||||||
|
import kotlin.coroutines.*
|
||||||
|
import kotlin.coroutines.intrinsics.*
|
||||||
|
import kotlin.experimental.ExperimentalTypeInference
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
flow {
|
||||||
|
emit(1)
|
||||||
|
}.flatMapLatest<Int, Long> {
|
||||||
|
flow {}
|
||||||
|
}
|
||||||
|
|
||||||
|
flow {
|
||||||
|
emit(1)
|
||||||
|
}.flatMap {
|
||||||
|
if (it == 1)
|
||||||
|
flow {}
|
||||||
|
else
|
||||||
|
flow<Int> {}
|
||||||
|
}
|
||||||
|
|
||||||
|
flow {
|
||||||
|
emit(1)
|
||||||
|
}.flatMap {
|
||||||
|
if (it == 1)
|
||||||
|
flow {}
|
||||||
|
else flow {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> Flow<T>.flatMap(mapper: suspend (T) -> Flow<T>): Flow<T> = TODO()
|
||||||
|
|
||||||
|
@OptIn(ExperimentalTypeInference::class)
|
||||||
|
fun <T> flow(@BuilderInference block: suspend FlowCollector<T>.() -> Unit): Flow<T> = TODO()
|
||||||
|
|
||||||
|
@OptIn(ExperimentalTypeInference::class)
|
||||||
|
inline fun <T, R> Flow<T>.flatMapLatest(@BuilderInference crossinline transform: suspend (value: T) -> Flow<R>): Flow<R> = TODO()
|
||||||
|
|
||||||
|
interface Flow<out T>
|
||||||
|
|
||||||
|
interface FlowCollector<in T> {
|
||||||
|
suspend fun emit(value: T)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+5
@@ -6200,6 +6200,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyCommonConstraintSystemForCoroutineInferenceCall.kt")
|
||||||
|
public void testEmptyCommonConstraintSystemForCoroutineInferenceCall() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/coroutines/emptyCommonConstraintSystemForCoroutineInferenceCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("epam.kt")
|
@TestMetadata("epam.kt")
|
||||||
public void testEpam_1_2() throws Exception {
|
public void testEpam_1_2() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines.experimental");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines.experimental");
|
||||||
|
|||||||
+5
@@ -6200,6 +6200,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyCommonConstraintSystemForCoroutineInferenceCall.kt")
|
||||||
|
public void testEmptyCommonConstraintSystemForCoroutineInferenceCall() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/coroutines/emptyCommonConstraintSystemForCoroutineInferenceCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("epam.kt")
|
@TestMetadata("epam.kt")
|
||||||
public void testEpam_1_2() throws Exception {
|
public void testEpam_1_2() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines.experimental");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines.experimental");
|
||||||
|
|||||||
+5
@@ -6080,6 +6080,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyCommonConstraintSystemForCoroutineInferenceCall.kt")
|
||||||
|
public void testEmptyCommonConstraintSystemForCoroutineInferenceCall() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/coroutines/emptyCommonConstraintSystemForCoroutineInferenceCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("epam.kt")
|
@TestMetadata("epam.kt")
|
||||||
public void testEpam_1_3() throws Exception {
|
public void testEpam_1_3() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
||||||
|
|||||||
+5
@@ -6080,6 +6080,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyCommonConstraintSystemForCoroutineInferenceCall.kt")
|
||||||
|
public void testEmptyCommonConstraintSystemForCoroutineInferenceCall() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/coroutines/emptyCommonConstraintSystemForCoroutineInferenceCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("epam.kt")
|
@TestMetadata("epam.kt")
|
||||||
public void testEpam_1_3() throws Exception {
|
public void testEpam_1_3() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
||||||
|
|||||||
Generated
+5
@@ -5130,6 +5130,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyCommonConstraintSystemForCoroutineInferenceCall.kt")
|
||||||
|
public void testEmptyCommonConstraintSystemForCoroutineInferenceCall() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/coroutines/emptyCommonConstraintSystemForCoroutineInferenceCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("epam.kt")
|
@TestMetadata("epam.kt")
|
||||||
public void testEpam_1_3() throws Exception {
|
public void testEpam_1_3() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
||||||
|
|||||||
+5
@@ -5130,6 +5130,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/emptyClosure.kt", "kotlin.coroutines");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("emptyCommonConstraintSystemForCoroutineInferenceCall.kt")
|
||||||
|
public void testEmptyCommonConstraintSystemForCoroutineInferenceCall() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/coroutines/emptyCommonConstraintSystemForCoroutineInferenceCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("epam.kt")
|
@TestMetadata("epam.kt")
|
||||||
public void testEpam_1_3() throws Exception {
|
public void testEpam_1_3() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/epam.kt", "kotlin.coroutines");
|
||||||
|
|||||||
Reference in New Issue
Block a user