summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-09 16:56:52 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-09 16:56:52 +0100
commit942ca80a1f6d1cded5cb112dd347f8301567fe3f (patch)
tree401f109cadb436a27fd614b71000a46564a504fa
parent9105526554dc825095c02fdafb1fb7d1852aa134 (diff)
Add bounds to type params in Rust AST
-rw-r--r--hobgoblin/src/output/lang/rust/ast.hob1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParam.java30
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java17
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParamMatcher.java6
5 files changed, 57 insertions, 6 deletions
diff --git a/hobgoblin/src/output/lang/rust/ast.hob b/hobgoblin/src/output/lang/rust/ast.hob
index 28277b2..d2f16f9 100644
--- a/hobgoblin/src/output/lang/rust/ast.hob
+++ b/hobgoblin/src/output/lang/rust/ast.hob
@@ -102,6 +102,7 @@ struct RustTraitImpl {
struct RustTypeParam {
field name: RustIdentifier;
+ field bounds: List[RustPath];
}
// === Associated items ===
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 7ae6bcf..72d17b7 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
@@ -283,6 +283,15 @@ public class RustWriter implements AutoCloseable {
private void writeTypeParam(RustTypeParam typeParam) throws IOException {
this.writeIdentifier(typeParam.name());
+
+ if (!typeParam.bounds().isEmpty()) {
+ this.writer.write(": ");
+ writeWithSeparator(
+ typeParam.bounds(),
+ this::writeType,
+ () -> this.writer.write(" + ")
+ );
+ }
}
// === Associated items ===
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParam.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParam.java
index db689f4..f7ce00a 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParam.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParam.java
@@ -6,25 +6,43 @@ package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam imports
public record RustTypeParam(
- org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name
+ org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name,
+ java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath> bounds
) {
public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder arbitrary() {
- return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of());
}
public record Builder(
- org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name
+ org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name,
+ java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath> bounds
) {
public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam build() {
- return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam(name);
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam(name, bounds);
}
public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) {
- return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name);
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name, bounds);
}
public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) {
- return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name.build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name.build(), bounds);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder withBounds(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath> bounds) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name, bounds);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder addBound(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath bound) {
+ var bounds = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath>(this.bounds);
+ bounds.add(bound);
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name, bounds);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder addBound(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath.Builder bound) {
+ var bounds = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath>(this.bounds);
+ bounds.add(bound.build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.Builder(name, bounds);
}
// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam.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 5b1fe95..31b2c6c 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
@@ -135,6 +135,23 @@ public class RustWriterTests {
assertThat(string, equalTo("type X<T1, T2> = Y;"));
}
+ @Test
+ public void typeAliasWithBoundedTypeParam() throws IOException {
+ var rust = RustTypeAlias.arbitrary()
+ .withName(RustIdentifier.of("X"))
+ .addParam(RustTypeParam.arbitrary()
+ .withName(RustIdentifier.of("T1"))
+ .addBound(RustPath.of("B1"))
+ .addBound(RustPath.of("B2"))
+ )
+ .withType(RustPath.of("Y"))
+ .build();
+
+ var string = write(writer -> writer.writeItem(rust));
+
+ assertThat(string, equalTo("type X<T1: B1 + B2> = Y;"));
+ }
+
// === Structs ===
@Test
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParamMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParamMatcher.java
index 99e09bc..dc6eddc 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParamMatcher.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTypeParamMatcher.java
@@ -36,6 +36,12 @@ public final class RustTypeParamMatcher implements org.zwobble.precisely.Matcher
return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParamMatcher(submatchers);
}
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParamMatcher withBounds(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath>> bounds) {
+ var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam>>(this.submatchers);
+ submatchers.add(org.zwobble.precisely.Matchers.has("bounds", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParam::bounds, bounds));
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParamMatcher(submatchers);
+ }
+
// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParamMatcher body
// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypeParamMatcher body
}