From ce8dfcfecd0937fbf2f4d5b941517f3750f29af2 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 30 Sep 2023 17:31:10 +0100 Subject: Add subtyping for bottom type --- .../compiler/typechecker/TypeCheckerSubTyping.java | 14 ++++++- .../typechecker/TypeCheckerIsSubTypeTests.java | 48 ++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java index c9576191..b73011ce 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java @@ -8,6 +8,18 @@ public class TypeCheckerSubTyping { } static boolean isSubType(Type subType, Type superType, TypeCheckerContext context) { - return superType == Types.TOP || subType.equals(superType); + if (superType == Types.TOP) { + return true; + } + + if (subType == Types.BOTTOM) { + return true; + } + + if (subType.equals(superType)) { + return true; + } + + return false; } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java index c80a861a..b7da683c 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java @@ -57,4 +57,52 @@ public class TypeCheckerIsSubTypeTests { equalTo(true) ); } + + @Test + public void topTypeIsSubTypeOfNoOtherTypes() { + var namespaceName = NamespaceName.of("Example", "Project"); + var context = TypeCheckerContext.EMPTY; + + assertThat(isSubType(Types.TOP, Types.INT, context), equalTo(false)); + assertThat( + isSubType( + Types.TOP, + new StructType(namespaceName, "X"), + context + ), + equalTo(false) + ); + } + + @Test + public void bottomTypeIsSubTypeOfAllTypes() { + var namespaceName = NamespaceName.of("Example", "Project"); + var context = TypeCheckerContext.EMPTY; + + assertThat(isSubType(Types.BOTTOM, Types.INT, context), equalTo(true)); + assertThat( + isSubType( + Types.BOTTOM, + new StructType(namespaceName, "X"), + context + ), + equalTo(true) + ); + } + + @Test + public void bottomTypeIsSuperTypeOfNoOtherTypes() { + var namespaceName = NamespaceName.of("Example", "Project"); + var context = TypeCheckerContext.EMPTY; + + assertThat(isSubType(Types.INT, Types.BOTTOM, context), equalTo(false)); + assertThat( + isSubType( + new StructType(namespaceName, "X"), + Types.BOTTOM, + context + ), + equalTo(false) + ); + } } -- cgit v1.2.3