diff options
Diffstat (limited to 'src')
5 files changed, 130 insertions, 1 deletions
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<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> 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<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> 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<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> 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<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType>(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<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType>(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(); diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java index 7272eea..0bf96e4 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java @@ -1070,6 +1070,19 @@ public class RustWriterTests { // == Types == @Test + public void functionPointerType() throws IOException { + var rust = RustFunctionPointerType.arbitrary() + .addParam(RustPath.of("A")) + .addParam(RustPath.of("B")) + .withReturnType(RustPath.of("C")) + .build(); + + var string = write(writer -> writer.writeType(rust)); + + assertThat(string, equalTo("fn(A, B) -> C")); + } + + @Test public void implTraitType() throws IOException { var rust = RustImplTraitType.arbitrary() .withTrait(RustPath.of("std", "io", "Read")) diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerTypeMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerTypeMatcher.java new file mode 100644 index 0000000..72ff1ab --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionPointerTypeMatcher.java @@ -0,0 +1,47 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher imports + +public final class RustFunctionPointerTypeMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher isRustFunctionPointerType() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher(java.util.List.of()); + } + + private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType>> submatchers; + + private RustFunctionPointerTypeMatcher( + java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType>> submatchers + ) { + this.submatchers = submatchers; + } + + public org.zwobble.precisely.MatchResult match(java.lang.Object actual) { + return this.toMatcher().match(actual); + } + + public org.zwobble.precisely.TextTree describe() { + return this.toMatcher().describe(); + } + + private org.zwobble.precisely.Matcher<java.lang.Object> toMatcher() { + return org.zwobble.precisely.Matchers.instanceOf(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType.class, this.submatchers); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher withParams(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType>> params) { + var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType>>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("params", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType::params, params)); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher(submatchers); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher withReturnType(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType) { + var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType>>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("returnType", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerType::returnType, returnType)); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher(submatchers); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionPointerTypeMatcher body +} |
