diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-03 12:27:06 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-03 12:31:33 +0100 |
| commit | aa397d67f7948d2ee0c89310147390eb0e288a73 (patch) | |
| tree | 22689bbb67fca06051065ccc440d2ca04c0854c0 /src/main | |
| parent | 5cafba08830a07cbe59ac61c9f5c06bc04d0022b (diff) | |
Add Java builder methods when field is option
Diffstat (limited to 'src/main')
6 files changed, 96 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedImportNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedImportNode.java index b500912..71e57db 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedImportNode.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedImportNode.java @@ -29,6 +29,10 @@ public record UntypedImportNode(java.util.List<String> importedNames, java.util. return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedImportNode.Builder(importedNames, ancestorDepth, namespaceName, source); } + public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedImportNode.Builder withAncestorDepth(int ancestorDepth) { + return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedImportNode.Builder(importedNames, java.util.Optional.of(ancestorDepth), namespaceName, source); + } + public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedImportNode.Builder withNamespaceName(org.zwobble.hobgoblin.compiler.types.NamespaceName namespaceName) { return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedImportNode.Builder(importedNames, ancestorDepth, namespaceName, source); } 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 c01a31f..1aa88b2 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 @@ -341,6 +341,70 @@ public class JavaTypesGenerator implements Generator { } } + if ( + field.type().value() instanceof ConstructedNativeType fieldConstructedNativeType && + fieldConstructedNativeType.constructor().equals(NativeTypes.OPTION) + ) { + var elementType = fieldConstructedNativeType.args().getFirst(); + var javaElementType = generateTypeRef(elementType, context); + + methods.add(new JavaMethodDeclaration( + withMethodName, + JavaVisibility.PUBLIC, + JavaMethodKind.INSTANCE, + builderJavaTypeRef, + List.of( + new JavaParam(javaElementType, javaFieldName) + ), + new JavaBlock(List.of( + new JavaReturn(new JavaNewExpression( + builderJavaTypeRef, + components.stream().<JavaExpression>map(argComponent -> { + if (argComponent.name().equals(javaFieldName)) { + return new JavaStaticMethodCall( + JavaTypeRef.OPTIONAL, + JavaIdentifier.of("of"), + List.of(new JavaRef(javaFieldName)) + ); + } else { + return new JavaRef(argComponent.name()); + } + }).toList() + )) + )) + )); + + var elementBuilderTypeRef = generateBuilderTypeRef(elementType); + + if (elementBuilderTypeRef.isPresent()) { + methods.add(new JavaMethodDeclaration( + withMethodName, + JavaVisibility.PUBLIC, + JavaMethodKind.INSTANCE, + builderJavaTypeRef, + List.of( + new JavaParam(elementBuilderTypeRef.get(), javaFieldName) + ), + new JavaBlock(List.of( + new JavaReturn(new JavaNewExpression( + builderJavaTypeRef, + components.stream().<JavaExpression>map(argComponent -> { + if (argComponent.name().equals(javaFieldName)) { + return new JavaStaticMethodCall( + JavaTypeRef.OPTIONAL, + JavaIdentifier.of("of"), + List.of(new JavaMethodCall(new JavaRef(javaFieldName), BUILD_METHOD_NAME, List.of())) + ); + } else { + return new JavaRef(argComponent.name()); + } + }).toList() + )) + )) + )); + } + } + return methods; } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java index 617a7e1..b3f7057 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java @@ -55,6 +55,14 @@ public record JavaMethodDeclaration(org.zwobble.hobgoblin.compiler.output.lang.j return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, body); } + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock body) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, java.util.Optional.of(body)); + } + + public org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaBlock.Builder body) { + return new org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder(name, visibility, kind, returnType, params, java.util.Optional.of(body.build())); + } + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder body // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.java.ast.JavaMethodDeclaration.Builder body } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustBlockExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustBlockExpression.java index 794290d..8dc7e69 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustBlockExpression.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustBlockExpression.java @@ -35,6 +35,14 @@ public record RustBlockExpression(java.util.List<org.zwobble.hobgoblin.compiler. return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder(statements, finalOperand); } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder withFinalOperand(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression finalOperand) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder(statements, java.util.Optional.of(finalOperand)); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder withFinalOperand(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression.Builder finalOperand) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder(statements, java.util.Optional.of(finalOperand.build())); + } + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder body // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder body } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java index b0dda9d..311da08 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java @@ -43,6 +43,14 @@ public record RustFunction(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.R return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, returnType); } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType returnType) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, java.util.Optional.of(returnType)); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder returnType) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(name, params, java.util.Optional.of(returnType.build())); + } + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder body // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder body } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePathSegment.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePathSegment.java index beb4c64..553e875 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePathSegment.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePathSegment.java @@ -29,6 +29,10 @@ public record RustTypePathSegment(org.zwobble.hobgoblin.compiler.output.lang.rus return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePathSegment.Builder(pathIdentSegment, args); } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePathSegment.Builder withArgs(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> args) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePathSegment.Builder(pathIdentSegment, java.util.Optional.of(args)); + } + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePathSegment.Builder body // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePathSegment.Builder body } |
