diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-29 11:46:49 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-29 11:46:49 +0000 |
| commit | 23d625dbaf27186dcf74014b6a25011612523178 (patch) | |
| tree | 72f084745c58a44e8ac7719936067e5ab77243d7 /src/main/java | |
| parent | c98a8de3d9cd79b37e8c69a668ebbf2a633423f3 (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.java | 20 |
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() )); |
