summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-03 12:27:06 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-03 12:31:33 +0100
commitaa397d67f7948d2ee0c89310147390eb0e288a73 (patch)
tree22689bbb67fca06051065ccc440d2ca04c0854c0 /src/main
parent5cafba08830a07cbe59ac61c9f5c06bc04d0022b (diff)
Add Java builder methods when field is option
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedImportNode.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java64
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaMethodDeclaration.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustBlockExpression.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypePathSegment.java4
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
}