summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hobgoblin/src/output/lang/rust/ast.hob5
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java21
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleType.java40
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustType.java2
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriterTests.java33
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleTypeMatcher.java39
6 files changed, 139 insertions, 1 deletions
diff --git a/hobgoblin/src/output/lang/rust/ast.hob b/hobgoblin/src/output/lang/rust/ast.hob
index dd71430..6979b42 100644
--- a/hobgoblin/src/output/lang/rust/ast.hob
+++ b/hobgoblin/src/output/lang/rust/ast.hob
@@ -200,6 +200,7 @@ sum RustType {
variant RustMutableReferenceType;
variant RustPath;
variant RustSharedReferenceType;
+ variant RustTupleType;
}
struct RustImplTraitType {
@@ -214,6 +215,10 @@ struct RustSharedReferenceType {
field referencedType: RustType;
}
+struct RustTupleType {
+ field elementTypes: List[RustType];
+}
+
// == Paths ==
struct RustPath {
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 4acbb0e..ea3a38b 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
@@ -481,6 +481,10 @@ public class RustWriter implements AutoCloseable {
case RustSharedReferenceType sharedReferenceType -> {
writeSharedReferenceType(sharedReferenceType);
}
+
+ case RustTupleType tupleType -> {
+ writeTupleType(tupleType);
+ }
}
}
@@ -499,6 +503,23 @@ public class RustWriter implements AutoCloseable {
this.writeType(sharedReferenceType.referencedType());
}
+ private void writeTupleType(RustTupleType tupleType) throws IOException {
+ this.writer.write("(");
+ if (tupleType.elementTypes().size() == 1) {
+ this.writeType(tupleType.elementTypes().getFirst());
+ this.writer.write(",");
+ } else if (tupleType.elementTypes().size() > 1) {
+ writeWithSeparator(
+ tupleType.elementTypes(),
+ this::writeType,
+ () -> {
+ this.writer.write(", ");
+ }
+ );
+ }
+ this.writer.write(")");
+ }
+
// == Paths ==
private void writePath(RustPath path) throws IOException {
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleType.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleType.java
new file mode 100644
index 0000000..9948f78
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleType.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.RustTupleType imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType imports
+
+public record RustTupleType(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> elementTypes) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder(java.util.List.of());
+ }
+
+ public record Builder(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> elementTypes) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType(elementTypes);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder withElementTypes(java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType> elementTypes) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder(elementTypes);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder addElementType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType elementType) {
+ var elementTypes = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType>(this.elementTypes);
+ elementTypes.add(elementType);
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder(elementTypes);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder addElementType(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType.Builder elementType) {
+ var elementTypes = new java.util.ArrayList<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType>(this.elementTypes);
+ elementTypes.add(elementType.build());
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder(elementTypes);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType 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 9c797ac..6e13102 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 {
+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.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 bb40d71..ea6334f 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
@@ -676,6 +676,39 @@ public class RustWriterTests {
assertThat(string, equalTo("&i32"));
}
+ @Test
+ public void tupleTypeUnit() throws IOException {
+ var rust = RustTupleType.arbitrary().build();
+
+ var string = write(writer -> writer.writeType(rust));
+
+ assertThat(string, equalTo("()"));
+ }
+
+ @Test
+ public void tupleTypeSingleton() throws IOException {
+ var rust = RustTupleType.arbitrary()
+ .addElementType(RustPath.of("A"))
+ .build();
+
+ var string = write(writer -> writer.writeType(rust));
+
+ assertThat(string, equalTo("(A,)"));
+ }
+
+ @Test
+ public void tupleTypeManyElements() throws IOException {
+ var rust = RustTupleType.arbitrary()
+ .addElementType(RustPath.of("A"))
+ .addElementType(RustPath.of("B"))
+ .addElementType(RustPath.of("C"))
+ .build();
+
+ var string = write(writer -> writer.writeType(rust));
+
+ assertThat(string, equalTo("(A, B, C)"));
+ }
+
// == Paths ==
@Test
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleTypeMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleTypeMatcher.java
new file mode 100644
index 0000000..2632b3e
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustTupleTypeMatcher.java
@@ -0,0 +1,39 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.output.lang.rust.ast;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher imports
+
+public class RustTupleTypeMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher isRustTupleType() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType>> submatchers;
+
+ private RustTupleTypeMatcher(java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType>> 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.RustTupleType.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher withElementTypes(org.zwobble.precisely.Matcher<? super java.util.List<org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustType>> elementTypes) {
+ var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType>>(this.submatchers);
+ submatchers.add(org.zwobble.precisely.Matchers.has("elementTypes", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleType::elementTypes, elementTypes));
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher(submatchers);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleTypeMatcher body
+}