From 2b4b4fe180b23da67d05ef7376e879c00201e22c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 27 Sep 2026 23:02:47 +0100 Subject: Add TypedDatabaseSchemaDefinitionNode --- hobgoblin/src/ast/typed.hob | 7 +++ .../typed/TypedDatabaseSchemaDefinitionNode.java | 44 ++++++++++++++++++ .../ast/typed/TypedNamespaceStatementNode.java | 2 +- .../JavaPreciselyMatchersGenerator.java | 3 ++ .../javatransient0/JavaTransient0Generator.java | 4 ++ .../generators/javatypes/JavaTypesGenerator.java | 3 ++ .../rusttransient0/RustTransient0Generator.java | 4 ++ .../generators/rusttypes/RustTypesGenerator.java | 4 ++ .../typescripttypes/TypescriptTypesGenerator.java | 4 ++ .../compiler/typechecker/TypeChecker.java | 15 +++++- .../TypedDatabaseSchemaDefinitionNodeMatcher.java | 53 ++++++++++++++++++++++ 11 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java create mode 100644 src/test/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNodeMatcher.java diff --git a/hobgoblin/src/ast/typed.hob b/hobgoblin/src/ast/typed.hob index e7dd72d..5581940 100644 --- a/hobgoblin/src/ast/typed.hob +++ b/hobgoblin/src/ast/typed.hob @@ -17,12 +17,19 @@ struct TypedNamespaceNode { } sum TypedNamespaceStatementNode { + variant TypedDatabaseSchemaDefinitionNode; variant TypedEnumDefinitionNode; variant TypedNativeTypeDefinitionNode; variant TypedStructDefinitionNode; variant TypedSumDefinitionNode; } +struct TypedDatabaseSchemaDefinitionNode { + field name: String; + field docComment: DocComment; + field source: Source; +} + struct TypedEnumDefinitionNode { field type: EnumType; field variants: List[TypedEnumVariantDefinitionNode]; 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 new file mode 100644 index 0000000..2b9f394 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNode.java @@ -0,0 +1,44 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.ast.typed; + +// Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode imports +// Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode imports + +public record TypedDatabaseSchemaDefinitionNode( + String name, + 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()); + } + + 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.typed.TypedNamespaceStatementNode.Builder { + public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode build() { + return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode(name, 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); + } + + 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); + } + + 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); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode body + // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java index ac01a37..8e8bd77 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNamespaceStatementNode.java @@ -5,7 +5,7 @@ package org.zwobble.hobgoblin.compiler.ast.typed; // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode imports // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode imports -public sealed interface TypedNamespaceStatementNode permits org.zwobble.hobgoblin.compiler.ast.typed.TypedEnumDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedNativeTypeDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedStructDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedSumDefinitionNode { +public sealed interface TypedNamespaceStatementNode permits org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedEnumDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedNativeTypeDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedStructDefinitionNode, org.zwobble.hobgoblin.compiler.ast.typed.TypedSumDefinitionNode { public interface Builder { public org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceStatementNode build(); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java index 6eb3ac1..1ae368e 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java @@ -85,6 +85,9 @@ public class JavaPreciselyMatchersGenerator implements Generator { for (var statement : namespace.body()) { switch (statement) { + case TypedDatabaseSchemaDefinitionNode _ -> { + } + case TypedEnumDefinitionNode _ -> { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java index 40bfbdf..38bf9b6 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java @@ -647,6 +647,10 @@ public class JavaTransient0Generator implements Generator { Context context ) { return switch (statement) { + case TypedDatabaseSchemaDefinitionNode _ -> { + yield List.of(); + } + case TypedEnumDefinitionNode enumDefinition -> { yield Lists.concat(List.of( List.of(generateEncodeEnumMethod(enumDefinition, context)), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index 01a05d0..e3f54cf 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -95,6 +95,9 @@ public class JavaTypesGenerator implements Generator { for (var statement : namespace.body()) { switch (statement) { + case TypedDatabaseSchemaDefinitionNode _ -> { + } + case TypedEnumDefinitionNode enumDefinition -> { var javaCompilationUnit = new JavaCompilationUnit( generateEnumDefinition(enumDefinition, context) diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java index 6f6740c..8ecc7cc 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java @@ -402,6 +402,10 @@ public class RustTransient0Generator implements Generator { TypesInfo typesInfo ) { return switch (statement) { + case TypedDatabaseSchemaDefinitionNode _ -> { + yield Stream.of(); + } + case TypedEnumDefinitionNode enumDefinition -> { yield Stream.of( generateEncodeEnumFunction(enumDefinition), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index 634dbff..f01e143 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -91,6 +91,10 @@ public class RustTypesGenerator implements Generator { TypesInfo typesInfo ) { return switch (statement) { + case TypedDatabaseSchemaDefinitionNode _ -> { + yield List.of(); + } + case TypedEnumDefinitionNode enumDefinition -> { yield generateEnumDefinition(enumDefinition); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java index 10217fb..6dd8592 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java @@ -136,6 +136,10 @@ public class TypescriptTypesGenerator implements Generator { TypescriptGenerator.Context context ) { switch (statement) { + case TypedDatabaseSchemaDefinitionNode _ -> { + return List.of(); + } + case TypedEnumDefinitionNode enumDefinition -> { return generateEnumDefinition(enumDefinition); } 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 2a09a7e..e1c6854 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -112,8 +112,8 @@ public class TypeChecker { TypeCheckerNamespaceContext context ) { return switch (untyped) { - case UntypedDatabaseSchemaDefinitionNode _ -> - throw new UnsupportedOperationException("TODO"); + case UntypedDatabaseSchemaDefinitionNode untypedDatabaseSchemaDefinitionNode -> + defineDatabaseSchemaDefinition(untypedDatabaseSchemaDefinitionNode, context); case UntypedEnumDefinitionNode untypedEnumDefinitionNode -> defineEnumDefinition(untypedEnumDefinitionNode, context); @@ -129,6 +129,17 @@ public class TypeChecker { }; } + private static TypedNamespaceStatementNode defineDatabaseSchemaDefinition( + UntypedDatabaseSchemaDefinitionNode untyped, + TypeCheckerNamespaceContext context + ) { + return new TypedDatabaseSchemaDefinitionNode( + untyped.name(), + untyped.docComment(), + untyped.source() + ); + } + private static Type declareEnumDefinitionNode( UntypedNamespaceStatementNode untyped, TypeCheckerNamespaceContext context diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNodeMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNodeMatcher.java new file mode 100644 index 0000000..107873f --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedDatabaseSchemaDefinitionNodeMatcher.java @@ -0,0 +1,53 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.ast.typed; + +// Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher imports +// Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher imports + +public final class TypedDatabaseSchemaDefinitionNodeMatcher implements org.zwobble.precisely.Matcher { + public static org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher isTypedDatabaseSchemaDefinitionNode() { + return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher(java.util.List.of()); + } + + private final java.util.List> submatchers; + + private TypedDatabaseSchemaDefinitionNodeMatcher( + java.util.List> submatchers + ) { + this.submatchers = submatchers; + } + + public org.zwobble.precisely.MatchResult match(java.lang.Object actual) { + return this.toMatcher().match(actual); + } + + public org.zwobble.precisely.TextTree describe() { + return this.toMatcher().describe(); + } + + private org.zwobble.precisely.Matcher toMatcher() { + return org.zwobble.precisely.Matchers.instanceOf(org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode.class, this.submatchers); + } + + public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher withName(org.zwobble.precisely.Matcher name) { + var submatchers = new java.util.ArrayList>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("name", org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode::name, (org.zwobble.precisely.Matcher) name)); + return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher(submatchers); + } + + public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher withDocComment(org.zwobble.precisely.Matcher docComment) { + var submatchers = new java.util.ArrayList>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("docComment", org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode::docComment, (org.zwobble.precisely.Matcher) docComment)); + return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher(submatchers); + } + + public org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher withSource(org.zwobble.precisely.Matcher source) { + var submatchers = new java.util.ArrayList>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("source", org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNode::source, (org.zwobble.precisely.Matcher) source)); + return new org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher(submatchers); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher body + // Custom area end: org.zwobble.hobgoblin.compiler.ast.typed.TypedDatabaseSchemaDefinitionNodeMatcher body +} -- cgit v1.2.3