aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java
index 22f68b38..4547c895 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java
@@ -145,6 +145,21 @@ public class TypeInfos {
return supertypes;
}
+ /**
+ * Get the subtypes of a type, from most specific to least specific.
+ */
+ public Set<Type> subtypes(Type type) {
+ var subtypes = P.orderedSet(type);
+ if (type instanceof SumType sumType) {
+ var sumTypeInfo = sumTypeInfo(sumType);
+ subtypes = subtypes.plusAll(
+ sumTypeInfo.orElseThrow().variants()
+ );
+ }
+ subtypes = subtypes.plus(Types.BOTTOM);
+ return subtypes;
+ }
+
private Optional<SumTypeInfo> simpleSumTypeInfo(SimpleSumType type) {
return Optional.ofNullable(sumTypeInfos.get(type));
}