summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-10-10 11:40:25 +0100
committerMichael Williamson <mike@zwobble.org>2026-10-10 11:40:25 +0100
commit864c5b173a72e269fa6f009c51326c78a042d260 (patch)
treee525485fc4b67459dc8d4e30aa9691f2127eb48c /src/main/java
parent78e75def13c9a0890f6a3880a95184fedc7ee13d (diff)
Parse empty table definition
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaDefinitionNode.java28
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaStatementNode.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTableDefinitionNode.java44
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java36
4 files changed, 121 insertions, 5 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaDefinitionNode.java
index 7695a42..8f9b2e4 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaDefinitionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaDefinitionNode.java
@@ -7,32 +7,50 @@ package org.zwobble.hobgoblin.compiler.ast.untyped;
public record UntypedDatabaseSchemaDefinitionNode(
String name,
+ java.util.List<org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
org.zwobble.hobgoblin.compiler.sources.Source source
) implements org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNamespaceStatementNode {
public static org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder("", org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.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.untyped.UntypedDatabaseSchemaStatementNode> body,
org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
org.zwobble.hobgoblin.compiler.sources.Source source
) implements org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNamespaceStatementNode.Builder {
public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode build() {
- return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode(name, body, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder withName(String name) {
- return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder withBody(java.util.List<org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode> body) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder addBodyElement(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode bodyElement) {
+ var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode>(this.body);
+ body.add(bodyElement);
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder addBodyElement(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode.Builder bodyElement) {
+ var body = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode>(this.body);
+ body.add(bodyElement.build());
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
- return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
}
public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) {
- return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, docComment, source);
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder(name, body, docComment, source);
}
// Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaDefinitionNode.Builder body
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaStatementNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaStatementNode.java
new file mode 100644
index 0000000..da1400c
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaStatementNode.java
@@ -0,0 +1,18 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode imports
+// Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode imports
+
+public sealed interface UntypedDatabaseSchemaStatementNode permits org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode {
+ public interface Builder {
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode build();
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTableDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTableDefinitionNode.java
new file mode 100644
index 0000000..4841ef8
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTableDefinitionNode.java
@@ -0,0 +1,44 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode imports
+// Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode imports
+
+public record UntypedTableDefinitionNode(
+ String name,
+ org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
+ org.zwobble.hobgoblin.compiler.sources.Source source
+) implements org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode {
+ public static org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder("", org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
+ }
+
+ public record Builder(
+ String name,
+ org.zwobble.hobgoblin.compiler.ast.DocComment docComment,
+ org.zwobble.hobgoblin.compiler.sources.Source source
+ ) implements org.zwobble.hobgoblin.compiler.ast.untyped.UntypedDatabaseSchemaStatementNode.Builder {
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode build() {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode(name, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder withName(String name) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder(name, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder(name, docComment, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder(name, docComment, source);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTableDefinitionNode body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
index 9e3c423..96448c6 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -19,6 +19,8 @@ public class Parser {
private Parser() {
}
+ // == Namespaces ==
+
public static UntypedNamespaceNode parseNamespace(
SourceText sourceText,
NamespaceName namespaceName
@@ -98,6 +100,8 @@ public class Parser {
return new UntypedImportNode(importedNames, ancestorDepth, namespaceName, source);
}
+ // == Namespace statements ==
+
static UntypedNamespaceStatementNode parseNamespaceStatement(
TokenIterator tokens
) {
@@ -128,6 +132,12 @@ public class Parser {
var name = parseIdentifier(tokens);
tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+ var body = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE),
+ () -> parseDatabaseSchemaStatement(tokens),
+ () -> true
+ );
+
tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
var end = tokens.endPosition();
@@ -135,6 +145,7 @@ public class Parser {
return new UntypedDatabaseSchemaDefinitionNode(
name,
+ body,
docComment,
source
);
@@ -345,6 +356,29 @@ public class Parser {
);
}
+ // == Database schema statements ==
+
+ static UntypedDatabaseSchemaStatementNode parseDatabaseSchemaStatement(TokenIterator tokens) {
+ var start = tokens.startPosition();
+
+ var docComment = parseDocComment(tokens);
+ tokens.skip(TokenType.IDENTIFIER, "table");
+ var name = parseIdentifier(tokens);
+ tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+ tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
+
+ var end = tokens.endPosition();
+ var source = createSource(start, end);
+
+ return new UntypedTableDefinitionNode(
+ name,
+ docComment,
+ source
+ );
+ }
+
+ // == Type params ==
+
private static Optional<List<UntypedTypeParamNode>> parseTypeParams(TokenIterator tokens) {
if (!tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) {
return Optional.empty();
@@ -370,6 +404,8 @@ public class Parser {
return Optional.of(typeParams);
}
+ // == Type-level expressions ==
+
static UntypedTypeLevelExpressionNode parseTypeLevelExpression(
TokenIterator tokens
) {