diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-02 13:38:58 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-02 13:38:58 +0100 |
| commit | b377ed25b102b5f0fa3ee870e694442d7a280134 (patch) | |
| tree | 8cee527d297ff9cc8b4107395701b3b76460503c /src/main/java/org | |
| parent | cdee6e9c77496cc6873565462b949dc543d5822b (diff) | |
Generate add methods for Java builders when field has list type
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java | 54 |
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; } |
