[FE 1.0] Fix subtyping for captured integer literal types

^KT-50877 Fixed
This commit is contained in:
Victor Petukhov
2022-01-20 12:46:46 +03:00
committed by teamcity
parent 7395f8e019
commit ec6ec20728
10 changed files with 118 additions and 1 deletions
@@ -22956,6 +22956,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/platformTypes/javaEmptyList.kt");
}
@Test
@TestMetadata("kt50877.kt")
public void testKt50877() throws Exception {
runTest("compiler/testData/diagnostics/tests/platformTypes/kt50877.kt");
}
@Test
@TestMetadata("methodTypeParameterDefaultBound.kt")
public void testMethodTypeParameterDefaultBound() throws Exception {
@@ -22956,6 +22956,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/platformTypes/javaEmptyList.kt");
}
@Test
@TestMetadata("kt50877.kt")
public void testKt50877() throws Exception {
runTest("compiler/testData/diagnostics/tests/platformTypes/kt50877.kt");
}
@Test
@TestMetadata("methodTypeParameterDefaultBound.kt")
public void testMethodTypeParameterDefaultBound() throws Exception {
@@ -22956,6 +22956,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/platformTypes/javaEmptyList.kt");
}
@Test
@TestMetadata("kt50877.kt")
public void testKt50877() throws Exception {
runTest("compiler/testData/diagnostics/tests/platformTypes/kt50877.kt");
}
@Test
@TestMetadata("methodTypeParameterDefaultBound.kt")
public void testMethodTypeParameterDefaultBound() throws Exception {
@@ -2,6 +2,8 @@
// IGNORE_BACKEND: JVM, JVM_IR, ANDROID, ANDROID_IR
// IGNORE_LIGHT_ANALYSIS
// WITH_STDLIB
// JVM_TARGET: 1.8
// IGNORE_BACKEND: ANDROID
// FULL_JDK
// This test fails on FE 1.0, but works in production compiler (see KT-49191):
@@ -0,0 +1,31 @@
// FULL_JDK
// WITH_STDLIB
// FILE: Schematic.kt
class Schematic {
var name: String? = null
var error: String? = null
override fun toString(): String {
return name!!
}
}
// FILE: SortedListModel.java
import java.util.Comparator;
public class SortedListModel<T> {
public SortedListModel(Comparator<? super T> comparator) {
}
}
// FILE: main.kt
val model = SortedListModel<Schematic>(Comparator.comparing { b1: Schematic ->
when {
b1.error != null -> 2
b1.name!!.contains(":") -> 1
else -> 0
}
}.thenComparing { b1: Schematic -> b1.name!! })
@@ -0,0 +1,31 @@
// FULL_JDK
// WITH_STDLIB
// FILE: Schematic.kt
class Schematic {
var name: String? = null
var error: String? = null
override fun toString(): String {
return name!!
}
}
// FILE: SortedListModel.java
import java.util.Comparator;
public class SortedListModel<T> {
public SortedListModel(Comparator<? super T> comparator) {
}
}
// FILE: main.kt
val model = SortedListModel<Schematic>(Comparator.comparing { b1: Schematic ->
when {
b1.error != null -> 2
b1.name!!.contains(":") -> 1
else -> 0
}
}.thenComparing { b1: Schematic -> b1.name!! })
@@ -0,0 +1,19 @@
package
public val model: SortedListModel<Schematic>
public final class Schematic {
public constructor Schematic()
public final var error: kotlin.String?
public final var name: kotlin.String?
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*/ fun toString(): kotlin.String
}
public open class SortedListModel</*0*/ T : kotlin.Any!> {
public constructor SortedListModel</*0*/ T : kotlin.Any!>(/*0*/ comparator: java.util.Comparator<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
}
@@ -22962,6 +22962,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/platformTypes/javaEmptyList.kt");
}
@Test
@TestMetadata("kt50877.kt")
public void testKt50877() throws Exception {
runTest("compiler/testData/diagnostics/tests/platformTypes/kt50877.kt");
}
@Test
@TestMetadata("methodTypeParameterDefaultBound.kt")
public void testMethodTypeParameterDefaultBound() throws Exception {
@@ -313,8 +313,16 @@ object AbstractTypeChecker {
&& typeConstructor.supertypes().any { it.asSimpleType()?.isIntegerLiteralType() == true }
}
fun isCapturedIntegerLiteralType(type: SimpleTypeMarker): Boolean {
if (type !is CapturedTypeMarker) return false
val projection = type.typeConstructor().projection()
return !projection.isStarProjection() && projection.getType().upperBoundIfFlexible().isIntegerLiteralType()
}
fun isIntegerLiteralTypeOrCapturedOne(type: SimpleTypeMarker) = type.isIntegerLiteralType() || isCapturedIntegerLiteralType(type)
when {
subType.isIntegerLiteralType() && superType.isIntegerLiteralType() -> {
isIntegerLiteralTypeOrCapturedOne(subType) && isIntegerLiteralTypeOrCapturedOne(superType) -> {
return true
}
@@ -900,6 +900,8 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy
override fun KotlinTypeMarker.isTypeVariableType(): Boolean {
return this is UnwrappedType && constructor is NewTypeVariableConstructor
}
class WA // Workaround for KT-52313
}
fun TypeVariance.convertVariance(): Variance {