[NI] Resolve type variable to Nothing for TO_SUBTYPE direction.
This commit is contained in:
+5
-1
@@ -38,6 +38,8 @@ class ResultTypeResolver(
|
||||
fun findResultType(c: Context, variableWithConstraints: VariableWithConstraints, direction: ResolveDirection): UnwrappedType? {
|
||||
findResultIfThereIsEqualsConstraint(c, variableWithConstraints, allowedFixToNotProperType = false)?.let { return it }
|
||||
|
||||
val builtIns = variableWithConstraints.typeVariable.freshTypeConstructor.builtIns
|
||||
|
||||
if (direction == ResolveDirection.TO_SUBTYPE || direction == ResolveDirection.UNKNOWN) {
|
||||
val lowerConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.LOWER && c.isProperType(it.type) }
|
||||
if (lowerConstraints.isNotEmpty()) {
|
||||
@@ -64,6 +66,8 @@ class ResultTypeResolver(
|
||||
}
|
||||
}
|
||||
|
||||
if (direction == ResolveDirection.TO_SUBTYPE) return builtIns.nothingType
|
||||
|
||||
// direction == TO_SUPER or there is no LOWER bounds
|
||||
val upperConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.UPPER && c.isProperType(it.type) }
|
||||
if (upperConstraints.isNotEmpty()) {
|
||||
@@ -72,7 +76,7 @@ class ResultTypeResolver(
|
||||
return typeApproximator.approximateToSubType(upperType, TypeApproximatorConfiguration.CapturedTypesApproximation) ?: upperType
|
||||
}
|
||||
|
||||
return null
|
||||
return return builtIns.anyType
|
||||
}
|
||||
|
||||
fun findResultIfThereIsEqualsConstraint(
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
// completion order here: X, Y, WHEN_VARIABLE
|
||||
fun <T> List<T>.optimizeReadOnlyList() = when (size) {
|
||||
0 -> emptyList() // here type variable Y will be fixed to Nothing
|
||||
1 -> listOf(this[0])
|
||||
else -> this
|
||||
}
|
||||
fun <X> listOf(<!UNUSED_PARAMETER!>element<!>: X): List<X> = TODO()
|
||||
fun <Y> emptyList(): List<Y> = TODO()
|
||||
|
||||
|
||||
fun test(l: List<String>): List<String> {
|
||||
val foo = l.optimizeReadOnlyList()
|
||||
return foo
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ Y> emptyList(): kotlin.collections.List<Y>
|
||||
public fun </*0*/ X> listOf(/*0*/ element: X): kotlin.collections.List<X>
|
||||
public fun test(/*0*/ l: kotlin.collections.List<kotlin.String>): kotlin.collections.List<kotlin.String>
|
||||
public fun </*0*/ T> kotlin.collections.List<T>.optimizeReadOnlyList(): kotlin.collections.List<T>
|
||||
@@ -10048,6 +10048,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("fixVariableToNothing.kt")
|
||||
public void testFixVariableToNothing() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/fixVariableToNothing.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("flexibleTypesAsUpperBound.kt")
|
||||
public void testFlexibleTypesAsUpperBound() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/flexibleTypesAsUpperBound.kt");
|
||||
|
||||
Reference in New Issue
Block a user