aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-29 11:46:49 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-29 11:46:49 +0000
commit23d625dbaf27186dcf74014b6a25011612523178 (patch)
tree72f084745c58a44e8ac7719936067e5ab77243d7 /src/main/java
parentc98a8de3d9cd79b37e8c69a668ebbf2a633423f3 (diff)
Support constructed struct type as case in when expression
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 3ca2b5ae..3695a255 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -2118,11 +2118,27 @@ public class TypeChecker {
TypeCheckerContext context
) {
var typedCaseType = typeCheckTypeLevelExpression(
- TypeSets.STRUCT_META_TYPE,
+ TypeSets.META_TYPE,
untyped.caseType(),
context
);
+ var variant = switch (typedCaseType.value()) {
+ case ConstructedType<?> constructedType when constructedType.genericType() instanceof StructType ->
+ SumVariant.constructedStruct((ConstructedType<StructType>) constructedType);
+
+ case StructType structType ->
+ SumVariant.struct(structType);
+
+ default ->
+ throw new UnexpectedTypeError(
+ // TODO: somehow update TypeSets.STRUCT_META_TYPE to allow constructed struct types
+ TypeSets.STRUCT_META_TYPE,
+ typedCaseType.value(),
+ untyped.caseType().source()
+ );
+ };
+
var declaredVariables = DeclaredVariables.forFunctionStatements(
untyped.body().statements(),
P.vector()
@@ -2142,7 +2158,7 @@ public class TypeChecker {
context = context.exit();
return context.toResult(new TypedWhenCaseNode(
- SumVariant.struct(typedCaseType.value()),
+ variant,
typedBody,
untyped.source()
));