summaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-02 13:38:58 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-02 13:38:58 +0100
commitb377ed25b102b5f0fa3ee870e694442d7a280134 (patch)
tree8cee527d297ff9cc8b4107395701b3b76460503c /src/main/java/org/zwobble
parentcdee6e9c77496cc6873565462b949dc543d5822b (diff)
Generate add methods for Java builders when field has list type
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java54
1 files changed, 50 insertions, 4 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 f914d76..0beed42 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
@@ -2,6 +2,7 @@ package org.zwobble.hobgoblin.compiler.output.generators.javatypes;
import org.zwobble.hobgoblin.compiler.ast.DocComment;
import org.zwobble.hobgoblin.compiler.ast.typed.*;
+import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
import org.zwobble.hobgoblin.compiler.config.OutputConfig;
import org.zwobble.hobgoblin.compiler.output.generators.Generator;
import org.zwobble.hobgoblin.compiler.output.generators.java.JavaGenerator;
@@ -10,6 +11,7 @@ import org.zwobble.hobgoblin.compiler.output.generators.java.JavaNativeTypeConfi
import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*;
import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo;
import org.zwobble.hobgoblin.compiler.types.*;
+import org.zwobble.hobgoblin.compiler.util.Casing;
import org.zwobble.json5.reader.Json5ObjectReader;
import java.io.IOException;
@@ -219,6 +221,7 @@ public class JavaTypesGenerator implements Generator {
) {
var methods = new ArrayList<JavaMethodDeclaration>();
+ var javaFieldName = generateFieldName(field.name());
var withMethodName = generateFieldName("with" + lowerCamelCaseToUpperCamelCase(field.name()));
methods.add(new JavaMethodDeclaration(
@@ -227,7 +230,7 @@ public class JavaTypesGenerator implements Generator {
JavaMethodKind.INSTANCE,
builderJavaTypeRef,
List.of(
- new JavaParam(generateTypeRef(field.type(), context), generateFieldName(field.name()))
+ new JavaParam(generateTypeRef(field.type(), context), javaFieldName)
),
new JavaBlock(List.of(
new JavaReturn(new JavaNewExpression(
@@ -246,14 +249,14 @@ public class JavaTypesGenerator implements Generator {
JavaMethodKind.INSTANCE,
builderJavaTypeRef,
List.of(
- new JavaParam(fieldBuilderTypeRef.get(), generateFieldName(field.name()))
+ new JavaParam(fieldBuilderTypeRef.get(), javaFieldName)
),
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());
+ if (argComponent.name().equals(javaFieldName)) {
+ return new JavaMethodCall(new JavaRef(javaFieldName), BUILD_METHOD_NAME, List.of());
} else {
return new JavaRef(argComponent.name());
}
@@ -263,6 +266,49 @@ public class JavaTypesGenerator implements Generator {
));
}
+ if (
+ field.type().value() instanceof ConstructedNativeType fieldConstructedNativeType &&
+ fieldConstructedNativeType.constructor().equals(NativeTypes.LIST)
+ ) {
+ var elementType = fieldConstructedNativeType.args().getFirst();
+ var javaElementType = generateTypeRef(elementType, context);
+
+ var singularFieldName = field.name().endsWith("s")
+ ? field.name().substring(0, field.name().length() - 1)
+ : field.name();
+
+ var addElementMethodName = generateFieldName("add" + Casing.lowerCamelCaseToUpperCamelCase(singularFieldName));
+ var javaElementName = generateFieldName(singularFieldName);
+
+ methods.add(new JavaMethodDeclaration(
+ addElementMethodName,
+ JavaVisibility.PUBLIC,
+ JavaMethodKind.INSTANCE,
+ builderJavaTypeRef,
+ List.of(
+ new JavaParam(javaElementType, javaElementName)
+ ),
+ new JavaBlock(List.of(
+ new JavaLocalVariableDeclaration(
+ javaFieldName,
+ new JavaNewExpression(
+ JavaTypeRef.arrayList(javaElementType),
+ List.of(new JavaFieldAccess(JavaRef.THIS, javaFieldName))
+ )
+ ),
+ new JavaExpressionStatement(new JavaMethodCall(
+ new JavaRef(javaFieldName),
+ JavaIdentifier.of("add"),
+ List.of(new JavaRef(javaElementName))
+ )),
+ new JavaReturn(new JavaNewExpression(
+ builderJavaTypeRef,
+ components.stream().<JavaExpression>map(argComponent -> new JavaRef(argComponent.name())).toList()
+ ))
+ ))
+ ));
+ }
+
return methods;
}