From 8fe3ffe8c7aad4c3270b889bce0efaf4ab912157 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 16 Oct 2026 08:21:19 +0100 Subject: Check row type is struct --- .../hobgoblin/compiler/typechecker/TypeChecker.java | 12 +++++++++--- .../errors/TableRowTypeMustBeStructError.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/TableRowTypeMustBeStructError.java (limited to 'src/main/java') 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 eb3e09d..211726b 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -468,12 +468,18 @@ public class TypeChecker { UntypedTableDefinitionNode untyped, TypeCheckerNamespaceContext context ) { - var rowType = typeCheckMetaType(untyped.rowType(), context); + var rowTypeTypedNode = typeCheckMetaType(untyped.rowType(), context); + + if (!(rowTypeTypedNode.value() instanceof StructType rowType)) { + throw new TableRowTypeMustBeStructError( + rowTypeTypedNode.value(), + rowTypeTypedNode.source() + ); + } return new TypedTableDefinitionNode( untyped.name(), - // TODO: handle not struct type. - (StructType) rowType.value(), + rowType, // TODO: check primary key is valid. untyped.primaryKey(), untyped.docComment(), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/TableRowTypeMustBeStructError.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/TableRowTypeMustBeStructError.java new file mode 100644 index 0000000..17b93d4 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/errors/TableRowTypeMustBeStructError.java @@ -0,0 +1,18 @@ +package org.zwobble.hobgoblin.compiler.typechecker.errors; + +import org.zwobble.hobgoblin.compiler.errors.SourceError; +import org.zwobble.hobgoblin.compiler.sources.Source; +import org.zwobble.hobgoblin.compiler.types.Type; + +public class TableRowTypeMustBeStructError extends SourceError { + private final Type rowType; + + public TableRowTypeMustBeStructError(Type rowType, Source source) { + super("row types must be structs, but was " + rowType.describe(), source); + this.rowType = rowType; + } + + public Type rowType() { + return rowType; + } +} -- cgit v1.2.3