aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-03 22:21:36 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-03 22:22:04 +0000
commitc88aea4655fb8396741dba4fa13a2315e30d14d2 (patch)
treecae214b5fe5d5d91bd6f91b6781b77577f899a48 /src/main/java
parent98f33d0f843c88c404b525134986393a1b1569cb (diff)
Add subtyping between sum types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java
index 4ee16c4d..4f1a283e 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java
@@ -120,6 +120,24 @@ public class TypeCheckerSubTyping {
return Optional.of(constraints);
}
+ if (subtype instanceof SumType subtypeSum) {
+ var subtypeInfo = constraints.typeInfos
+ .sumTypeInfo(subtypeSum)
+ .orElseThrow();
+
+ for (var subtypeVariant : subtypeInfo.variants()) {
+ var result = tryAddSubtypeConstraint(subtypeVariant, supertype, constraints);
+ if (result.isPresent()) {
+ // TODO: test assignment
+ constraints = result.get();
+ } else {
+ return result;
+ }
+ }
+
+ return Optional.of(constraints);
+ }
+
if (supertype instanceof SumType supertypeSum) {
var superTypeInfo = constraints.typeInfos.sumTypeInfo(supertypeSum).orElseThrow();
return tryAddVariantSubtypeConstraint(subtype, superTypeInfo, constraints);