summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-02 09:51:11 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-02 09:57:26 +0100
commit3d6034f51eba69de538ce2b7ccdd59654870db1d (patch)
treefb729409d57958a01b0755defbb77eb1293e88d7 /src
parent514a0eefe86174ba535f46f3fb3481c539b79f96 (diff)
Add rust enums
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java40
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java40
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java40
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java28
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java32
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java64
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumMatcher.java45
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantMatcher.java41
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTupleMatcher.java37
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleFieldMatcher.java37
12 files changed, 423 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 514e3f5..51de98a 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
@@ -56,12 +56,52 @@ public class RustWriter implements AutoCloseable {
void writeItem(RustItem item) throws IOException {
switch (item) {
+ case RustEnum enum_ -> {
+ writeEnum(enum_);
+ }
+
case RustStructStruct structStruct -> {
writeStructStruct(structStruct);
}
}
}
+ private void writeEnum(RustEnum enum_) throws IOException {
+ this.writeDocComment(enum_.docComment());
+ this.writer.write("pub enum ");
+ this.writeIdentifier(enum_.name());
+ this.writer.write(" {");
+
+ if (!enum_.variants().isEmpty()) {
+ this.writer.indent();
+
+ for (var variant : enum_.variants()) {
+ this.writer.newLine();
+ writeIdentifier(variant.name());
+ this.writer.write("(");
+
+ switch (variant.fields()) {
+ case RustEnumVariantTuple tuple -> {
+ writeWithSeparator(
+ tuple.fields(),
+ field -> {
+ this.writeType(field.type());
+ },
+ () -> this.writer.write(", ")
+ );
+ }
+ }
+
+ this.writer.write("),");
+ }
+
+ this.writer.dedent();
+ }
+
+ this.writer.newLine();
+ this.writer.write("}");
+ }
+
private void writeStructStruct(RustStructStruct structStruct) throws IOException {
this.writeDocComment(structStruct.docComment());
this.writer.write("pub struct ");
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java
new file mode 100644
index 0000000..338bdb4
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnum.java
@@ -0,0 +1,40 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum imports
+
+public record RustEnum(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant> variants, org.zwobble.hobgoblin.compiler.ast.DocComment docComment) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), java.util.List.of(), org.zwobble.hobgoblin.compiler.ast.HobgoblinNativeAst.arbitraryDocComment());
+ }
+
+ public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant> variants, org.zwobble.hobgoblin.compiler.ast.DocComment docComment) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem.Builder {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum(name, variants, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name, variants, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name.build(), variants, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withVariants(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant> variants) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name, variants, docComment);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder withDocComment(org.zwobble.hobgoblin.compiler.ast.DocComment docComment) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder(name, variants, docComment);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java
new file mode 100644
index 0000000..3eff7a1
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariant.java
@@ -0,0 +1,40 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant imports
+
+public record RustEnumVariant(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields fields) {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.arbitrary().build());
+ }
+
+ public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields fields) {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant(name, fields);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name, fields);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name.build(), fields);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withFields(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields fields) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name, fields);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder withFields(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder fields) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder(name, fields.build());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java
new file mode 100644
index 0000000..56d39e6
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantFields.java
@@ -0,0 +1,18 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields imports
+
+public sealed interface RustEnumVariantFields permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple {
+ public interface Builder {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields build();
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java
new file mode 100644
index 0000000..a8b1e68
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTuple.java
@@ -0,0 +1,28 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple imports
+
+public record RustEnumVariantTuple(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField> fields) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder(java.util.List.of());
+ }
+
+ public record Builder(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField> fields) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields.Builder {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple(fields);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder withFields(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField> fields) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder(fields);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java
index d1fa342..4471b49 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustItem.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.RustItem imports
// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem imports
-public sealed interface RustItem permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustStructStruct {
+public sealed interface RustItem permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustStructStruct {
public interface Builder {
public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustItem build();
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java
new file mode 100644
index 0000000..4a2eb76
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleField.java
@@ -0,0 +1,32 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField imports
+
+public record RustTupleField(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType type) {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePath.arbitrary().build());
+ }
+
+ public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType type) {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField(type);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder withType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType type) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder(type);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder withType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder type) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder(type.build());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField 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 f4103c2..84a1056 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
@@ -37,6 +37,70 @@ public class RustWriterTests {
// == Items ==
@Test
+ public void emptyEnum() throws IOException {
+ var rust = RustEnum.arbitrary().withName(new RustIdentifier("Shape")).build();
+
+ var string = write(writer -> writer.writeItem(rust));
+
+ assertThat(string, equalTo("""
+ pub enum Shape {
+ }"""));
+ }
+
+ @Test
+ public void enumWithTupleVariants() throws IOException {
+ var rust = RustEnum.arbitrary()
+ .withName(new RustIdentifier("Shape"))
+ .withVariants(List.of(
+ RustEnumVariant.arbitrary()
+ .withName(new RustIdentifier("Rectangle"))
+ .withFields(
+ RustEnumVariantTuple.arbitrary()
+ .withFields(List.of(
+ RustTupleField.arbitrary().withType(RustTypePath.of("i32")).build(),
+ RustTupleField.arbitrary().withType(RustTypePath.of("i32")).build()
+ ))
+ .build()
+ )
+ .build(),
+ RustEnumVariant.arbitrary()
+ .withName(new RustIdentifier("Circle"))
+ .withFields(
+ RustEnumVariantTuple.arbitrary()
+ .withFields(List.of(
+ RustTupleField.arbitrary().withType(RustTypePath.of("u64")).build()
+ ))
+ .build()
+ )
+ .build()
+ ))
+ .build();
+
+ var string = write(writer -> writer.writeItem(rust));
+
+ assertThat(string, equalTo("""
+ pub enum Shape {
+ Rectangle(i32, i32),
+ Circle(u64),
+ }"""));
+ }
+
+ @Test
+ public void enumWithDocComment() throws IOException {
+ var rust = RustEnum.arbitrary()
+ .withName(new RustIdentifier("Shape"))
+ .withDocComment(new DocComment("A 2D shape."))
+ .build();
+
+ var string = write(writer -> writer.writeItem(rust));
+
+ assertThat(string, equalTo("""
+ /// A 2D shape.
+ pub enum Shape {
+ }"""));
+ }
+
+ @Test
public void emptyStruct() throws IOException {
var rust = RustStructStruct.arbitrary().withName(new RustIdentifier("Rectangle")).build();
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumMatcher.java
new file mode 100644
index 0000000..c4668d0
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumMatcher.java
@@ -0,0 +1,45 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher imports
+
+public class RustEnumMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher isRustEnum() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum>> submatchers;
+
+ private RustEnumMatcher(java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum>> 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.RustEnum.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher withName(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier> name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("name", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum::name, name))).toList());
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher withVariants(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant>> variants) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("variants", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum::variants, variants))).toList());
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher withDocComment(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.ast.DocComment> docComment) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("docComment", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnum::docComment, docComment))).toList());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumMatcher body
+}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantMatcher.java
new file mode 100644
index 0000000..2d38854
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantMatcher.java
@@ -0,0 +1,41 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher imports
+
+public class RustEnumVariantMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher isRustEnumVariant() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant>> submatchers;
+
+ private RustEnumVariantMatcher(java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant>> 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.RustEnumVariant.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher withName(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier> name) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("name", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant::name, name))).toList());
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher withFields(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantFields> fields) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("fields", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariant::fields, fields))).toList());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantMatcher body
+}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTupleMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTupleMatcher.java
new file mode 100644
index 0000000..fd168be
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustEnumVariantTupleMatcher.java
@@ -0,0 +1,37 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher imports
+
+public class RustEnumVariantTupleMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher isRustEnumVariantTuple() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple>> submatchers;
+
+ private RustEnumVariantTupleMatcher(java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple>> 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.RustEnumVariantTuple.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher withFields(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField>> fields) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("fields", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTuple::fields, fields))).toList());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustEnumVariantTupleMatcher body
+}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleFieldMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleFieldMatcher.java
new file mode 100644
index 0000000..bfbf63e
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleFieldMatcher.java
@@ -0,0 +1,37 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher imports
+
+public class RustTupleFieldMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher isRustTupleField() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField>> submatchers;
+
+ private RustTupleFieldMatcher(java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField>> 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.RustTupleField.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher withType(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> type) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher(java.util.stream.Stream.concat(this.submatchers.stream(), java.util.stream.Stream.of(org.zwobble.precisely.Matchers.has("type", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleField::type, type))).toList());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleFieldMatcher body
+}