summaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-02 13:17:14 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-02 13:17:14 +0100
commit3264232ee9b9b9080aeeb3c40d357f841d70556e (patch)
treee8eed2cb8675e3afa073abf6c971351116bb3db1 /src/main/java/org/zwobble
parente2081e2a469aa6539495a6f91c00fc684f36f5ce (diff)
Extract generateBuilderMethodsForField()
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java89
1 files changed, 51 insertions, 38 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 b601224..f914d76 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
@@ -198,59 +198,72 @@ public class JavaTypesGenerator implements Generator {
));
for (var field : structDefinition.fields()) {
- var withMethodName = generateFieldName("with" + lowerCamelCaseToUpperCamelCase(field.name()));
+ body.addAll(generateBuilderMethodsForField(field, components, builderJavaTypeRef, context));
+ }
- body.add(new JavaMethodDeclaration(
+ return new JavaRecordDeclaration(
+ BUILDER_TYPE_NAME,
+ components,
+ implementsTypes,
+ body,
+ JavaCustomArea.forType(builderJavaTypeRef, "body"),
+ DocComment.EMPTY
+ );
+ }
+
+ private List<JavaMethodDeclaration> generateBuilderMethodsForField(
+ TypedStructFieldDefinitionNode field,
+ List<JavaRecordComponent> components,
+ JavaTypeRef builderJavaTypeRef,
+ Context context
+ ) {
+ var methods = new ArrayList<JavaMethodDeclaration>();
+
+ var withMethodName = generateFieldName("with" + lowerCamelCaseToUpperCamelCase(field.name()));
+
+ methods.add(new JavaMethodDeclaration(
+ withMethodName,
+ JavaVisibility.PUBLIC,
+ JavaMethodKind.INSTANCE,
+ builderJavaTypeRef,
+ List.of(
+ new JavaParam(generateTypeRef(field.type(), context), generateFieldName(field.name()))
+ ),
+ new JavaBlock(List.of(
+ new JavaReturn(new JavaNewExpression(
+ builderJavaTypeRef,
+ components.stream().<JavaExpression>map(argComponent -> new JavaRef(argComponent.name())).toList()
+ ))
+ ))
+ ));
+
+ var fieldBuilderTypeRef = generateBuilderTypeRef(field.type().value());
+
+ if (fieldBuilderTypeRef.isPresent()) {
+ methods.add(new JavaMethodDeclaration(
withMethodName,
JavaVisibility.PUBLIC,
JavaMethodKind.INSTANCE,
builderJavaTypeRef,
List.of(
- new JavaParam(generateTypeRef(field.type(), context), generateFieldName(field.name()))
+ new JavaParam(fieldBuilderTypeRef.get(), generateFieldName(field.name()))
),
new JavaBlock(List.of(
new JavaReturn(new JavaNewExpression(
builderJavaTypeRef,
- components.stream().<JavaExpression>map(argComponent -> new JavaRef(argComponent.name())).toList()
+ components.stream().<JavaExpression>map(argComponent -> {
+ if (argComponent.name().equals(generateFieldName(field.name()))) {
+ return new JavaMethodCall(new JavaRef(generateFieldName(field.name())), BUILD_METHOD_NAME, List.of());
+ } else {
+ return new JavaRef(argComponent.name());
+ }
+ }).toList()
))
))
));
-
- var fieldBuilderTypeRef = generateBuilderTypeRef(field.type().value());
-
- if (fieldBuilderTypeRef.isPresent()) {
- body.add(new JavaMethodDeclaration(
- withMethodName,
- JavaVisibility.PUBLIC,
- JavaMethodKind.INSTANCE,
- builderJavaTypeRef,
- List.of(
- new JavaParam(fieldBuilderTypeRef.get(), generateFieldName(field.name()))
- ),
- new JavaBlock(List.of(
- new JavaReturn(new JavaNewExpression(
- builderJavaTypeRef,
- components.stream().<JavaExpression>map(argComponent -> {
- if (argComponent.name().equals(generateFieldName(field.name()))) {
- return new JavaMethodCall(new JavaRef(generateFieldName(field.name())), BUILD_METHOD_NAME, List.of());
- } else {
- return new JavaRef(argComponent.name());
- }
- }).toList()
- ))
- ))
- ));
- }
}
- return new JavaRecordDeclaration(
- BUILDER_TYPE_NAME,
- components,
- implementsTypes,
- body,
- JavaCustomArea.forType(builderJavaTypeRef, "body"),
- DocComment.EMPTY
- );
+ return methods;
}
private JavaInterfaceDeclaration generateSumDefinition(