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);