From 57d7f43d0944db2edd140e2380f5114229ae334d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 9 Aug 2026 14:12:44 +0100 Subject: Add function pointer types to Rust AST --- .../compiler/output/lang/rust/RustWriter.java | 15 ++++++ .../lang/rust/ast/RustFunctionPointerType.java | 54 ++++++++++++++++++++++ .../compiler/output/lang/rust/ast/RustType.java | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerType.java (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java index ec8d70b..a101528 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java @@ -796,6 +796,10 @@ public class RustWriter implements AutoCloseable { void writeType(RustType type) throws IOException { switch (type) { + case RustFunctionPointerType functionPointerType -> { + writeFunctionPointerType(functionPointerType); + } + case RustImplTraitType implTraitType -> { writeImplTraitType(implTraitType); } @@ -822,6 +826,17 @@ public class RustWriter implements AutoCloseable { } } + private void writeFunctionPointerType(RustFunctionPointerType functionPointerType) throws IOException { + this.writer.write("fn("); + writeWithSeparator( + functionPointerType.params(), + this::writeType, + () -> this.writer.write(", ") + ); + this.writer.write(") -> "); + this.writeType(functionPointerType.returnType()); + } + private void writeImplTraitType(RustImplTraitType implTraitType) throws IOException { this.writer.write("impl "); this.writePath(implTraitType.trait()); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerType.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerType.java new file mode 100644 index 0000000..6f2e13b --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerType.java @@ -0,0 +1,54 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType imports + +public record RustFunctionPointerType( + java.util.List params, + org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType returnType +) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder(java.util.List.of(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustImplTraitType.arbitrary().build()); + } + + public record Builder( + java.util.List params, + org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType returnType + ) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType build() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType(params, returnType); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder withParams(java.util.List params) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder(params, returnType); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType param) { + var params = new java.util.ArrayList(this.params); + params.add(param); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder(params, returnType); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder param) { + var params = new java.util.ArrayList(this.params); + params.add(param.build()); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder(params, returnType); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType returnType) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder(params, returnType); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder withReturnType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder returnType) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder(params, returnType.build()); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType body +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustType.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustType.java index 92757e7..818f88f 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustType.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustType.java @@ -5,7 +5,7 @@ package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType imports // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType imports -public sealed interface RustType permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustImplTraitType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustMutableReferenceType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustSharedReferenceType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTraitObjectType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType { +public sealed interface RustType permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustImplTraitType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustMutableReferenceType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustSharedReferenceType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTraitObjectType, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType { public interface Builder { public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType build(); -- cgit v1.2.3