Fix common super type calculation for captured dynamic types

^KT-32499 Fixed
This commit is contained in:
victor.petukhov
2019-11-25 19:03:43 +03:00
parent 1c4c5520a2
commit dbacae94d0
5 changed files with 73 additions and 1 deletions
@@ -41,7 +41,11 @@ object NewCommonSuperTypeCalculator {
val lowers = types.map { val lowers = types.map {
when (it) { when (it) {
is SimpleTypeMarker -> it is SimpleTypeMarker -> {
if (it.isCapturedDynamic()) return it
it
}
is FlexibleTypeMarker -> { is FlexibleTypeMarker -> {
if (it.isDynamic()) return it if (it.isDynamic()) return it
// raw types are allowed here and will be transformed to FlexibleTypes // raw types are allowed here and will be transformed to FlexibleTypes
@@ -0,0 +1,27 @@
// SKIP_TXT
fun case_1(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf(null) + args<!>).toTypedArray()
}
fun case_2(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf<Nothing>() + args<!>).toTypedArray()
}
fun case_3(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf(1) + args<!>).toTypedArray()
}
fun case_4(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf<Any?>() + args<!>).toTypedArray()
}
fun case_5(x: Any?) {
fun foo(x: List<dynamic>) = x
foo(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf(null) + x as MutableList<out dynamic><!>)
}
fun case_6(x: Any?) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<kotlin.Any?>")!>listOf(null) + x as MutableList<in dynamic><!>).toTypedArray()
}
@@ -0,0 +1,28 @@
// !LANGUAGE: +NewInference
// SKIP_TXT
fun case_1(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf(null) + args<!>).toTypedArray()
}
fun case_2(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf<Nothing>() + args<!>).toTypedArray()
}
fun case_3(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf(1) + args<!>).toTypedArray()
}
fun case_4(vararg args: dynamic) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf<Any?>() + args<!>).toTypedArray()
}
fun case_5(x: Any?) {
fun foo(x: List<dynamic>) = x
foo(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<dynamic>")!>listOf(null) + x as MutableList<out dynamic><!>)
}
fun case_6(x: Any?) {
(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.List<kotlin.Any?>")!>listOf(null) + x as MutableList<in dynamic><!>).toTypedArray()
}
@@ -113,6 +113,16 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes
runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/callableReferences.kt"); runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/callableReferences.kt");
} }
@TestMetadata("capturedDynamic.kt")
public void testСapturedDynamic() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/capturedDynamic.kt");
}
@TestMetadata("capturedDynamicNI.kt")
public void testCapturedDynamicNI() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/capturedDynamicNI.kt");
}
@TestMetadata("classDelegateBy.kt") @TestMetadata("classDelegateBy.kt")
public void testClassDelegateBy() throws Exception { public void testClassDelegateBy() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/classDelegateBy.kt"); runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/classDelegateBy.kt");
@@ -232,6 +232,9 @@ interface TypeSystemContext : TypeSystemOptimizationContext {
fun KotlinTypeMarker.isFlexible(): Boolean = asFlexibleType() != null fun KotlinTypeMarker.isFlexible(): Boolean = asFlexibleType() != null
fun KotlinTypeMarker.isDynamic(): Boolean = asFlexibleType()?.asDynamicType() != null fun KotlinTypeMarker.isDynamic(): Boolean = asFlexibleType()?.asDynamicType() != null
fun KotlinTypeMarker.isCapturedDynamic(): Boolean =
asSimpleType()?.asCapturedType()?.typeConstructor()?.projection()?.getType()?.isDynamic() == true
fun KotlinTypeMarker.isDefinitelyNotNullType(): Boolean = asSimpleType()?.asDefinitelyNotNullType() != null fun KotlinTypeMarker.isDefinitelyNotNullType(): Boolean = asSimpleType()?.asDefinitelyNotNullType() != null
fun KotlinTypeMarker.hasFlexibleNullability() = fun KotlinTypeMarker.hasFlexibleNullability() =