From 23d625dbaf27186dcf74014b6a25011612523178 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 29 Dec 2023 11:46:49 +0000 Subject: Support constructed struct type as case in when expression --- .../shedlang/compiler/typechecker/TypeChecker.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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) 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() )); -- cgit v1.2.3