diff options
Diffstat (limited to 'src')
6 files changed, 57 insertions, 15 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java index 421366f..78f2e91 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java @@ -571,6 +571,7 @@ public class RustTransient0Generator implements Generator { return new RustFunction( Optional.of(RustVisibility.PUB), encodeMethodName(type), + List.of(), generateEncodeParams(rustType), Optional.of( RustTypes.ioResult(RustTypes.UNIT) @@ -610,6 +611,7 @@ public class RustTransient0Generator implements Generator { return new RustFunction( Optional.of(RustVisibility.PUB), decodeMethodName(type), + List.of(), generateDecodeParams(), Optional.of(RustTypes.ioResult(rustType)), Optional.of(new RustBlockExpression( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index a5c2118..4df01d1 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -221,6 +221,7 @@ public class RustTypesGenerator implements Generator { new RustFunction( Optional.empty(), new RustIdentifier("from"), + List.of(), List.of(new RustFunctionParam(innerValueName, fromRustType)), Optional.of(RustPath.selfType()), Optional.of(new RustBlockExpression( 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 da534b2..df8aa8c 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 @@ -103,6 +103,7 @@ public class RustWriter implements AutoCloseable { this.writer.write("fn "); this.writeIdentifier(function.name()); + this.writeTypeParams(function.typeParams()); this.writer.write("("); writeWithSeparator( 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 438dfa8..d5ebb38 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 @@ -8,79 +8,97 @@ package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; public record RustFunction( java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility> visibility, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, + java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam> typeParams, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body ) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustAssociatedItem { public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder arbitrary() { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(java.util.Optional.empty(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of(), java.util.Optional.empty(), java.util.Optional.empty()); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(java.util.Optional.empty(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of(), java.util.List.of(), java.util.Optional.empty(), java.util.Optional.empty()); } public record Builder( java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility> visibility, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, + java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam> typeParams, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType, java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body ) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem.Builder, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustAssociatedItem.Builder { public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction build() { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withVisibility(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility> visibility) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withVisibility(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVisibility visibility) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(java.util.Optional.of(visibility), name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(java.util.Optional.of(visibility), name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name.build(), params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name.build(), typeParams, params, returnType, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withTypeParams(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam> typeParams) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder addTypeParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam typeParam) { + var typeParams = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam>(this.typeParams); + typeParams.add(typeParam); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder addTypeParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder typeParam) { + var typeParams = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam>(this.typeParams); + typeParams.add(typeParam.build()); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withParams(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam> params) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam param) { var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam>(this.params); params.add(param); - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder addParam(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam.Builder param) { var params = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam>(this.params); params.add(param.build()); - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withReturnType(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> returnType) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } 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(visibility, name, params, java.util.Optional.of(returnType), body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, java.util.Optional.of(returnType), body); } 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(visibility, name, params, java.util.Optional.of(returnType.build()), body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, java.util.Optional.of(returnType.build()), body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withBody(java.util.Optional<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression> body) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, body); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, body); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression body) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, java.util.Optional.of(body)); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, java.util.Optional.of(body)); } public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder body) { - return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, params, returnType, java.util.Optional.of(body.build())); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder(visibility, name, typeParams, params, returnType, java.util.Optional.of(body.build())); } // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction.Builder body 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 feabc12..15bb5c8 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 @@ -64,6 +64,20 @@ public class RustWriterTests { } @Test + public void functionWithTypeParams() throws IOException { + var rust = RustFunction.arbitrary() + .withName(new RustIdentifier("f")) + .addTypeParam(RustTypeParam.arbitrary().withName(RustIdentifier.of("T1"))) + .addTypeParam(RustTypeParam.arbitrary().withName(RustIdentifier.of("T2"))) + .build(); + + var string = write(writer -> writer.writeAssociatedItem(rust)); + + assertThat(string, equalTo(""" + fn f<T1, T2>();""")); + } + + @Test public void functionWithParams() throws IOException { var rust = RustFunction.arbitrary() .withName(new RustIdentifier("area")) diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java index 3b07f1d..2254ad9 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java @@ -42,6 +42,12 @@ public final class RustFunctionMatcher implements org.zwobble.precisely.Matcher< return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher(submatchers); } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher withTypeParams(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam>> typeParams) { + var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction>>(this.submatchers); + submatchers.add(org.zwobble.precisely.Matchers.has("typeParams", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction::typeParams, typeParams)); + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher(submatchers); + } + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionMatcher withParams(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunctionParam>> params) { var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction>>(this.submatchers); submatchers.add(org.zwobble.precisely.Matchers.has("params", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFunction::params, params)); |
