From 253f5b2d06475170e9f8bc0bf30a31cd0d5ff099 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 3 Feb 2011 14:30:25 +0300 Subject: [PATCH] Tests for common supertype inference --- .../inspectionProfiles/profiles_settings.xml | 1 + .../jet/lang/types/JetTypeChecker.java | 2 +- .../jetbrains/jet/lang/types/TypeUtils.java | 5 ++- .../jet/types/JetTypeCheckerTest.java | 40 ++++++++++++++----- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml index e1948e328b8..78f1346b901 100644 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -1,6 +1,7 @@ \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java index 08c34617f29..a489dd7e1ea 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java @@ -150,7 +150,7 @@ public class JetTypeChecker { return result[0]; } - private Type commonSupertype(Collection types) { + public Type commonSupertype(Collection types) { Collection typeSet = new HashSet(types); assert !typeSet.isEmpty(); boolean nullable = false; diff --git a/idea/src/org/jetbrains/jet/lang/types/TypeUtils.java b/idea/src/org/jetbrains/jet/lang/types/TypeUtils.java index 41851d31516..1ebddf4cde6 100644 --- a/idea/src/org/jetbrains/jet/lang/types/TypeUtils.java +++ b/idea/src/org/jetbrains/jet/lang/types/TypeUtils.java @@ -59,8 +59,9 @@ public class TypeUtils { } private static boolean canHaveSubtypes(Type type) { - // TODO : a nullable type can have a subtype -- a non-nullable version - + if (type.isNullable()) { + return true; + } if (!type.getConstructor().isSealed()) { return true; } diff --git a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 3086329c0fc..77f61d8f66d 100644 --- a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -87,17 +87,30 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { assertType("if (true) null else null", "Nothing?"); assertType("if (true) 1 else '1'", "Any"); + } - assertType("if (true) null : Base_T<*>? else null : Derived_T<*>?", "Base_T<*>?"); - assertType("if (true) null : Base_inT<*>? else null : Derived_T<*>?", "Any?"); - assertType("if (true) null : DDerived_T? else null : Derived_T?", "Derived_T?"); - assertType("if (true) null : DDerived_T? else null : DDerived1_T?", "Derived_T?"); + public void testCommonSupertypes() throws Exception { + assertCommonSupertype("Int", "Int", "Int"); - assertType("if (true) null : Base_T? else null : Base_T?", "Base_T?"); - assertType("if (true) null : Base_T? else null : Base_T?", "Base_T?"); - assertType("if (true) null : Derived_T? else null : Base_T?", "Base_T?"); - assertType("if (true) null : Derived_T? else null : Base_T?", "Base_T?"); - assertType("if (true) null : Base_T? else null : Base_T<*>?", "Base_T<*>?"); + assertCommonSupertype("Int", "Int", "Nothing"); + assertCommonSupertype("Int", "Nothing", "Int"); + assertCommonSupertype("Nothing", "Nothing", "Nothing"); + + assertCommonSupertype("Int?", "Int", "Nothing?"); + assertCommonSupertype("Nothing?", "Nothing?", "Nothing?"); + + assertCommonSupertype("Any", "Int", "Char"); + + assertCommonSupertype("Base_T<*>", "Base_T<*>", "Derived_T<*>"); + assertCommonSupertype("Any", "Base_inT<*>", "Derived_T<*>"); + assertCommonSupertype("Derived_T", "DDerived_T", "Derived_T"); + assertCommonSupertype("Derived_T", "DDerived_T", "DDerived1_T"); + + assertCommonSupertype("Base_T", "Base_T", "Base_T"); + assertCommonSupertype("Base_T", "Base_T", "Base_T"); + assertCommonSupertype("Base_T", "Derived_T", "Base_T"); + assertCommonSupertype("Base_T", "Derived_T", "Base_T"); + assertCommonSupertype("Base_T<*>", "Base_T", "Base_T<*>"); } public void testBasicSubtyping() throws Exception { @@ -246,6 +259,15 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { assertSubtypingRelation(type1, type2, false); } + private void assertCommonSupertype(String expected, String... types) { + Collection subtypes = new ArrayList(); + for (String type : types) { + subtypes.add(makeType(type)); + } + Type result = JetTypeChecker.INSTANCE.commonSupertype(subtypes); + assertTrue(result + " != " + expected, JetTypeChecker.INSTANCE.equalTypes(result, makeType(expected))); + } + private static void assertSubtypingRelation(String type1, String type2, boolean expected) { Type typeNode1 = makeType(type1); Type typeNode2 = makeType(type2);