summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-28 23:43:29 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-28 23:43:29 +0100
commite49744ff95e24ad4282c29634fa58a4241c66c82 (patch)
tree4f5969e73ddd6c9871a525bb62fdee9e574852eb /src/main/java/org
parent0df2137ae4f03069398f6417d46d9a6d5bea1ce2 (diff)
Type check sum definitions
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
index 84cb6aa..c713c70 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -97,14 +97,32 @@ public class TypeChecker {
UntypedSumDefinitionNode untyped,
TypeCheckerNamespaceContext context
) {
- throw new UnsupportedOperationException("TODO");
+ var sumType = new SumType(context.namespaceName(), untyped.name());
+ // TODO: tidy up declare vs define
+ context.declare(untyped.name());
+ context.define(untyped.name(), new TypeLevelValueType(sumType));
}
private static TypedNamespaceStatementNode defineSumDefinition(
UntypedSumDefinitionNode untyped,
TypeCheckerNamespaceContext context
) {
- throw new UnsupportedOperationException("TODO");
+ var sumType = (SumType) lookupMetaType(untyped.name(), untyped.source(), context);
+
+ var typedVariants = new ArrayList<TypedSumVariantDefinitionNode>();
+ for (var untypedVariant : untyped.variants()) {
+ var typedVariant = new TypedSumVariantDefinitionNode(
+ typeCheckMetaType(untypedVariant.type(), context),
+ untyped.source()
+ );
+ typedVariants.add(typedVariant);
+ }
+
+ return new TypedSumDefinitionNode(
+ sumType,
+ typedVariants,
+ untyped.source()
+ );
}
private static TypedTypeLevelExpressionNode<Type> typeCheckMetaType(