diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-03 22:21:36 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-03 22:22:04 +0000 |
| commit | c88aea4655fb8396741dba4fa13a2315e30d14d2 (patch) | |
| tree | cae214b5fe5d5d91bd6f91b6781b77577f899a48 /src/main/java | |
| parent | 98f33d0f843c88c404b525134986393a1b1569cb (diff) | |
Add subtyping between sum types
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeCheckerSubTyping.java | 18 |
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); |
