summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-10-15 21:29:01 +0100
committerMichael Williamson <mike@zwobble.org>2026-10-15 21:29:01 +0100
commitd669d1f0b4ab34aec751d27812a558783bbbf4f1 (patch)
tree6425afe5ed62020225f2e15ebc8d5d3eea7d6a56 /src/main/java
parent3afb8859dabdaaa81a6bbbe530d75a4186cc039c (diff)
Type check table definitions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java28
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaStatementNode.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTableDefinitionNode.java56
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java37
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/ConstructedStructType.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/SimpleStructType.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java2
9 files changed, 141 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java
index 2b9f394..9b0edd9 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java
@@ -7,32 +7,50 @@ package org.zwobble.hobgoblin.compiler.ast.typed;
public record TypedDatabaseSchemaDefinitionNode(
String name,
+ java.util.List<org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
org.zwobble.hobgoblin.compiler.sources.Source source
) implements org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode {
public static org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder("", org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder("", java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
}
public record Builder(
String name,
+ java.util.List<org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
org.zwobble.hobgoblin.compiler.sources.Source source
) implements org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode.Builder {
public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode build() {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode(name, body, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder withName(String name) {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder withBody(java.util.List<org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode> body) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder addBodyElement(org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode bodyElement) {
+ var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode>(this.body);
+ body.add(bodyElement);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder addBodyElement(org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode.Builder bodyElement) {
+ var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode>(this.body);
+ body.add(bodyElement.build());
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) {
- return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
}
// Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder body
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaStatementNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaStatementNode.java
new file mode 100644
index 0000000..4c11011
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaStatementNode.java
@@ -0,0 +1,18 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.ast.typed;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode imports
+// Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode imports
+
+public sealed interface TypedDatabaseSchemaStatementNode permits org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode {
+ public interface Builder {
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode build();
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTableDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTableDefinitionNode.java
new file mode 100644
index 0000000..315aeef
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedTableDefinitionNode.java
@@ -0,0 +1,56 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.ast.typed;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode imports
+// Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode imports
+
+public record TypedTableDefinitionNode(
+ String name,
+ org.zwobble.hobgoblin.compiler.types.StructType rowType,
+ String primaryKey,
+ org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
+ org.zwobble.hobgoblin.compiler.sources.Source source
+) implements org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode {
+ public static org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder("", org.zwobble.hobgoblin.compiler.types.HobgoblinNativeTypes.arbitraryStructType(), "", org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
+ }
+
+ public record Builder(
+ String name,
+ org.zwobble.hobgoblin.compiler.types.StructType rowType,
+ String primaryKey,
+ org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
+ org.zwobble.hobgoblin.compiler.sources.Source source
+ ) implements org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaStatementNode.Builder {
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode build() {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode(name, rowType, primaryKey, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder withName(String name) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder(name, rowType, primaryKey, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder withRowType(org.zwobble.hobgoblin.compiler.types.StructType rowType) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder(name, rowType, primaryKey, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder withPrimaryKey(String primaryKey) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder(name, rowType, primaryKey, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder(name, rowType, primaryKey, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) {
+ return new org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder(name, rowType, primaryKey, docComment, source);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedTableDefinitionNode body
+}
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 8178d8d..3022814 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -115,11 +115,11 @@ public class TypeChecker {
TypeCheckerNamespaceContext context
) {
return switch (untyped) {
- case UntypedDatabaseSchemaDefinitionNode untypedDatabaseSchemaDefinitionNode ->
- defineDatabaseSchemaDefinition(untypedDatabaseSchemaDefinitionNode, context);
+ case UntypedDatabaseSchemaDefinitionNode untypedDatabaseSchemaDefinition ->
+ defineDatabaseSchemaDefinition(untypedDatabaseSchemaDefinition, context);
- case UntypedEnumDefinitionNode untypedEnumDefinitionNode ->
- defineEnumDefinition(untypedEnumDefinitionNode, context);
+ case UntypedEnumDefinitionNode untypedEnumDefinition ->
+ defineEnumDefinition(untypedEnumDefinition, context);
case UntypedNativeTypeDefinitionNode untypedNativeTypeDefinition ->
defineNativeTypeDefinition(untypedNativeTypeDefinition, context);
@@ -138,6 +138,9 @@ public class TypeChecker {
) {
return new TypedDatabaseSchemaDefinitionNode(
untyped.name(),
+ untyped.body().stream()
+ .map(statement -> typeCheckDatabaseSchemaStatement(statement, context))
+ .toList(),
untyped.docComment(),
untyped.source()
);
@@ -451,6 +454,32 @@ public class TypeChecker {
}
}
+ static TypedDatabaseSchemaStatementNode typeCheckDatabaseSchemaStatement(
+ UntypedDatabaseSchemaStatementNode statement,
+ TypeCheckerNamespaceContext context
+ ) {
+ return switch (statement) {
+ case UntypedTableDefinitionNode untypedTableDefinition ->
+ typeCheckTableDefinition(untypedTableDefinition, context);
+ };
+ }
+
+ private static TypedTableDefinitionNode typeCheckTableDefinition(
+ UntypedTableDefinitionNode untyped,
+ TypeCheckerNamespaceContext context
+ ) {
+ var rowType = typeCheckMetaType(untyped.rowType(), context);
+
+ return new TypedTableDefinitionNode(
+ untyped.name(),
+ // TODO: handle not struct type.
+ (StructType) rowType.value(),
+ untyped.primaryKey(),
+ untyped.docComment(),
+ untyped.source()
+ );
+ }
+
static TypedTypeLevelExpressionNode<? extends TypeLevelValue> typeCheckTypeLevelExpression(
UntypedTypeLevelExpressionNode untyped,
TypeCheckerNamespaceContext context
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/ConstructedStructType.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/ConstructedStructType.java
index a95e07f..87f6e7c 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/ConstructedStructType.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/ConstructedStructType.java
@@ -5,5 +5,5 @@ import java.util.List;
public record ConstructedStructType(
TypeConstructor<SimpleStructType> constructor,
List<Type> args
-) implements ConstructedType, Type {
+) implements ConstructedType, Type, StructType {
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java
index 14294f9..37e6935 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/HobgoblinNativeTypes.java
@@ -23,6 +23,10 @@ public class HobgoblinNativeTypes {
return new SimpleStructType(arbitraryNamespaceName(), "");
}
+ public static SimpleStructType arbitraryStructType() {
+ return arbitrarySimpleStructType();
+ }
+
public static SumType arbitrarySumType() {
return new SumType(arbitraryNamespaceName(), "");
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/SimpleStructType.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/SimpleStructType.java
index a67eeb0..2f5e37b 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/SimpleStructType.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/SimpleStructType.java
@@ -1,6 +1,6 @@
package org.zwobble.hobgoblin.compiler.types;
-public record SimpleStructType(NamespaceName namespaceName, String name) implements Type, SimpleType, ConstructibleType {
+public record SimpleStructType(NamespaceName namespaceName, String name) implements Type, SimpleType, ConstructibleType, StructType {
@Override
public String describe() {
return namespaceName.toString() + "." + name;
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java
new file mode 100644
index 0000000..0f65574
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/StructType.java
@@ -0,0 +1,4 @@
+package org.zwobble.hobgoblin.compiler.types;
+
+public sealed interface StructType extends Type permits ConstructedStructType, SimpleStructType {
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java
index 57b85cd..ed03bc0 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Type.java
@@ -1,5 +1,5 @@
package org.zwobble.hobgoblin.compiler.types;
-public sealed interface Type extends TypeLevelValue permits ConstructedNativeType, ConstructedStructType, ConstructedType, ConstructibleType, EnumType, SimpleNativeType, SimpleType, SimpleStructType, SumType, TypeLevelValueType, TypeParam {
+public sealed interface Type extends TypeLevelValue permits ConstructedNativeType, ConstructedStructType, ConstructedType, ConstructibleType, EnumType, SimpleNativeType, SimpleStructType, SimpleType, StructType, SumType, TypeLevelValueType, TypeParam {
String name();
}