summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunction.java48
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java14
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustFunctionMatcher.java6
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));