diff options
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java | 89 |
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( |
