From 864c5b173a72e269fa6f009c51326c78a042d260 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Oct 2026 11:40:25 +0100 Subject: Parse empty table definition --- .../UntypedDatabaseSchemaDefinitionNode.java | 28 +++++++++++--- .../UntypedDatabaseSchemaStatementNode.java | 18 +++++++++ .../ast/untyped/UntypedTableDefinitionNode.java | 44 ++++++++++++++++++++++ .../zwobble/hobgoblin/compiler/parser/Parser.java | 36 ++++++++++++++++++ 4 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedDatabaseSchemaStatementNode.java create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTableDefinitionNode.java (limited to 'src/main/java') 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 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 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 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(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(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> 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 ) { -- cgit v1.2.3