[NI] Decrease priority of Integer Literal Types in type checking
#KT-30446
This commit is contained in:
+13
-1
@@ -25,6 +25,9 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.checkConstraint
|
|||||||
import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
|
import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.checker.intersectTypes
|
import org.jetbrains.kotlin.types.checker.intersectTypes
|
||||||
|
import org.jetbrains.kotlin.types.checker.isIntegerLiteralType
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.contains
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
class ResultTypeResolver(
|
class ResultTypeResolver(
|
||||||
val typeApproximator: TypeApproximator,
|
val typeApproximator: TypeApproximator,
|
||||||
@@ -87,7 +90,8 @@ class ResultTypeResolver(
|
|||||||
private fun findSubType(c: Context, variableWithConstraints: VariableWithConstraints): UnwrappedType? {
|
private fun findSubType(c: Context, variableWithConstraints: VariableWithConstraints): UnwrappedType? {
|
||||||
val lowerConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.LOWER && c.isProperType(it.type) }
|
val lowerConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.LOWER && c.isProperType(it.type) }
|
||||||
if (lowerConstraints.isNotEmpty()) {
|
if (lowerConstraints.isNotEmpty()) {
|
||||||
val commonSuperType = NewCommonSuperTypeCalculator.commonSuperType(lowerConstraints.map { it.type })
|
val types = sinkIntegerLiteralTypes(lowerConstraints.map { it.type })
|
||||||
|
val commonSuperType = NewCommonSuperTypeCalculator.commonSuperType(types)
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* fun <T> Array<out T>.intersect(other: Iterable<T>) {
|
* fun <T> Array<out T>.intersect(other: Iterable<T>) {
|
||||||
@@ -115,6 +119,14 @@ class ResultTypeResolver(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun sinkIntegerLiteralTypes(types: List<UnwrappedType>): List<UnwrappedType> {
|
||||||
|
return types.sortedBy { type ->
|
||||||
|
|
||||||
|
val containsILT = type.contains { it.unwrap().safeAs<SimpleType>()?.isIntegerLiteralType ?: false }
|
||||||
|
if (containsILT) 1 else 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun findSuperType(c: Context, variableWithConstraints: VariableWithConstraints): UnwrappedType? {
|
private fun findSuperType(c: Context, variableWithConstraints: VariableWithConstraints): UnwrappedType? {
|
||||||
val upperConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.UPPER && c.isProperType(it.type) }
|
val upperConstraints = variableWithConstraints.constraints.filter { it.kind == ConstraintKind.UPPER && c.isProperType(it.type) }
|
||||||
if (upperConstraints.isNotEmpty()) {
|
if (upperConstraints.isNotEmpty()) {
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
// !WITH_NEW_INFERENCE
|
||||||
|
// !DIAGNOSTICS: -USELESS_ELVIS -UNUSED_EXPRESSION
|
||||||
|
|
||||||
|
class X {
|
||||||
|
fun toLong(): Long? = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getLong(): Long = TODO()
|
||||||
|
|
||||||
|
fun test_1(list: List<X>) {
|
||||||
|
val props = list.map { <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Long?")!>it.toLong()<!> ?: <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Long")!>0<!> }
|
||||||
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<kotlin.Long>")!>props<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test_2(cond: Boolean) {
|
||||||
|
val props = if (cond) getLong() else 0
|
||||||
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Long")!>props<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test_3(list: List<X>) {
|
||||||
|
val props = list.map { Pair(it.toLong() ?: 0, it.toLong() ?: 0) }
|
||||||
|
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<kotlin.Pair<kotlin.Long, kotlin.Long>>")!>props<!>
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun getLong(): kotlin.Long
|
||||||
|
public fun test_1(/*0*/ list: kotlin.collections.List<X>): kotlin.Unit
|
||||||
|
public fun test_2(/*0*/ cond: kotlin.Boolean): kotlin.Unit
|
||||||
|
public fun test_3(/*0*/ list: kotlin.collections.List<X>): kotlin.Unit
|
||||||
|
|
||||||
|
public final class X {
|
||||||
|
public constructor X()
|
||||||
|
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 final fun toLong(): kotlin.Long?
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
+5
@@ -2646,6 +2646,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
|
|||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/arrayConstructor.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/arrayConstructor.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("integerLiterals.kt")
|
||||||
|
public void testIntegerLiterals() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt11266.kt")
|
@TestMetadata("kt11266.kt")
|
||||||
public void testKt11266() throws Exception {
|
public void testKt11266() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");
|
||||||
|
|||||||
compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java
Generated
+5
@@ -2646,6 +2646,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno
|
|||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/arrayConstructor.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/arrayConstructor.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("integerLiterals.kt")
|
||||||
|
public void testIntegerLiterals() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/integerLiterals.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt11266.kt")
|
@TestMetadata("kt11266.kt")
|
||||||
public void testKt11266() throws Exception {
|
public void testKt11266() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user