From 612ac53d6d58d0317ab5cec4f3568839ffccdc1b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 18 May 2026 18:45:49 +0100 Subject: Add empty Builder to structs --- .../generators/javatypes/JavaTypesGenerator.java | 25 ++++++++++++++++------ .../compiler/output/lang/java/JavaWriter.java | 4 ++++ .../lang/java/ast/JavaClassBodyDeclaration.java | 2 +- .../output/lang/java/ast/JavaTypeDeclaration.java | 2 +- 4 files changed, 24 insertions(+), 9 deletions(-) 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 1259552..c4bdccc 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 @@ -1,5 +1,6 @@ package org.zwobble.hobgoblin.compiler.output.generators.javatypes; +import org.zwobble.hobgoblin.compiler.ast.DocComment; import org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceNode; import org.zwobble.hobgoblin.compiler.ast.typed.TypedStructDefinitionNode; import org.zwobble.hobgoblin.compiler.ast.typed.TypedSumDefinitionNode; @@ -116,16 +117,26 @@ public class JavaTypesGenerator implements Generator { TypedStructDefinitionNode structDefinition, HashMap> javaClassToImplementsType ) { + var components = structDefinition.fields().stream() + .map(field -> new JavaRecordComponent( + generateTypeRef(field.type()), + field.name() + )) + .toList(); + return new JavaRecordDeclaration( structDefinition.name(), - structDefinition.fields().stream() - .map(field -> new JavaRecordComponent( - generateTypeRef(field.type()), - field.name() - )) - .toList(), + components, javaClassToImplementsType.getOrDefault(structDefinition.name(), List.of()), - List.of(), + List.of( + new JavaRecordDeclaration( + "Builder", + components, + List.of(), + List.of(), + DocComment.EMPTY + ) + ), structDefinition.docComment() ); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java index 2b2cb58..0d25a0e 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/JavaWriter.java @@ -96,6 +96,10 @@ public class JavaWriter implements AutoCloseable { case JavaMethodDeclaration methodDeclaration -> { writeMethodDeclaration(methodDeclaration); } + + case JavaTypeDeclaration typeDeclaration -> { + writeTypeDeclaration(typeDeclaration); + } } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java index eb7a0e4..ee2a3a7 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaClassBodyDeclaration.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; -public sealed interface JavaClassBodyDeclaration permits JavaMethodDeclaration { +public sealed interface JavaClassBodyDeclaration permits JavaMethodDeclaration, JavaTypeDeclaration { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java index da6481e..2ad8967 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeDeclaration.java @@ -1,5 +1,5 @@ package org.zwobble.hobgoblin.compiler.output.lang.java.ast; -public sealed interface JavaTypeDeclaration permits JavaClassDeclaration, JavaInterfaceDeclaration, JavaRecordDeclaration { +public sealed interface JavaTypeDeclaration extends JavaClassBodyDeclaration permits JavaClassDeclaration, JavaInterfaceDeclaration, JavaRecordDeclaration { String name(); } -- cgit v1.2.3