summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-18 19:16:20 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-18 19:16:20 +0100
commit9ebca11fc3d86ce4a5424e402503f5fbbc394468 (patch)
treeb275bb0b8c268c3df6b04557a3a703a11c40ceeb
parentb94fc2c22021dc50381856f170fe9dca4b879468 (diff)
Add range to Rust AST
-rw-r--r--hobgoblin/src/output/lang/rust/ast.hob6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustWriter.java11
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustExpression.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExpr.java40
-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/RustRangeExprMatcher.java45
6 files changed, 117 insertions, 1 deletions
diff --git a/hobgoblin/src/output/lang/rust/ast.hob b/hobgoblin/src/output/lang/rust/ast.hob
index d362291..82be054 100644
--- a/hobgoblin/src/output/lang/rust/ast.hob
+++ b/hobgoblin/src/output/lang/rust/ast.hob
@@ -133,6 +133,7 @@ sum RustExpression {
variant RustIteratorLoopExpression;
variant RustPath;
variant RustPrefixExpression;
+ variant RustRangeExpr;
variant RustStructExpression;
variant RustTryPropagationExpression;
variant RustTupleExpression;
@@ -203,6 +204,11 @@ enum RustPrefixOperator {
variant dereference;
}
+struct RustRangeExpr {
+ field start: RustExpression;
+ field end: RustExpression;
+}
+
struct RustStructExpression {
field structPath: RustPath;
field fieldValues: List[RustStructExprField];
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 d916311..3aaa588 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
@@ -359,6 +359,10 @@ public class RustWriter implements AutoCloseable {
this.writePrefixExpression(prefixExpression);
}
+ case RustRangeExpr rangeExpr -> {
+ this.writeRangeExpr(rangeExpr);
+ }
+
case RustStructExpression structExpression -> {
this.writeStructExpression(structExpression);
}
@@ -412,6 +416,7 @@ public class RustWriter implements AutoCloseable {
case RustIteratorLoopExpression _ -> RustPrecedence.PRIMARY;
case RustPath _ -> RustPrecedence.PATHS;
case RustPrefixExpression _ -> RustPrecedence.PREFIX;
+ case RustRangeExpr _ -> RustPrecedence.RANGE;
case RustStructExpression _ -> RustPrecedence.PRIMARY;
case RustTryPropagationExpression _ -> RustPrecedence.TRY_PROPAGATION;
case RustTupleExpression _ -> RustPrecedence.PRIMARY;
@@ -542,6 +547,12 @@ public class RustWriter implements AutoCloseable {
this.writeSubExpression(prefixExpression.operand(), precedence(prefixExpression), true);
}
+ private void writeRangeExpr(RustRangeExpr rangeExpr) throws IOException {
+ this.writeSubExpression(rangeExpr.start(), precedence(rangeExpr), false);
+ this.writer.write("..");
+ this.writeSubExpression(rangeExpr.end(), precedence(rangeExpr), false);
+ }
+
private void writeStructExpression(RustStructExpression structExpression) throws IOException {
this.writePath(structExpression.structPath());
this.writer.write(" {");
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustExpression.java
index 239f972..6cfea75 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustExpression.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustExpression.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.RustExpression imports
// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression imports
-public sealed interface RustExpression permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustArrayRepeatExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBinaryExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBoolLiteral, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustCallExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFieldExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIfExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIntegerLiteral, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPrefixExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustStructExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTryPropagationExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVecRepeatExpression {
+public sealed interface RustExpression permits org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustArrayRepeatExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBinaryExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBoolLiteral, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustCallExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustFieldExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIfExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIntegerLiteral, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPath, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustPrefixExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustStructExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTryPropagationExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTupleExpression, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustVecRepeatExpression {
public interface Builder {
public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression build();
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExpr.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExpr.java
new file mode 100644
index 0000000..8afc225
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExpr.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.RustRangeExpr imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr imports
+
+public record RustRangeExpr(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression start, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression end) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.arbitrary().build(), org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.arbitrary().build());
+ }
+
+ public record Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression start, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression end) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression.Builder {
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr build() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr(start, end);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder withStart(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression start) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder(start, end);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder withStart(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression.Builder start) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder(start.build(), end);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder withEnd(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression end) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder(start, end);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder withEnd(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression.Builder end) {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder(start, end.build());
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr 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 e947db9..46180fb 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
@@ -682,6 +682,20 @@ public class RustWriterTests {
assertThat(string, equalTo("*x"));
}
+ // === Range exprs ===
+
+ @Test
+ public void rangeExpr() throws IOException {
+ var rust = RustRangeExpr.arbitrary()
+ .withStart(RustPath.of("x"))
+ .withEnd(RustPath.of("y"))
+ .build();
+
+ var string = write(writer -> writer.writeTopLevelExpression(rust));
+
+ assertThat(string, equalTo("x..y"));
+ }
+
// === Struct expressions ===
@Test
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExprMatcher.java b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExprMatcher.java
new file mode 100644
index 0000000..4044f9c
--- /dev/null
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustRangeExprMatcher.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.RustRangeExprMatcher imports
+// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher imports
+
+public class RustRangeExprMatcher implements org.zwobble.precisely.Matcher<java.lang.Object> {
+ public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher isRustRangeExpr() {
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher(java.util.List.of());
+ }
+
+ private final java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr>> submatchers;
+
+ private RustRangeExprMatcher(java.util.List<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr>> 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.RustRangeExpr.class, this.submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher withStart(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression> start) {
+ var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr>>(this.submatchers);
+ submatchers.add(org.zwobble.precisely.Matchers.has("start", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr::start, start));
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher(submatchers);
+ }
+
+ public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher withEnd(org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression> end) {
+ var submatchers = new java.util.ArrayList<org.zwobble.precisely.Matcher<? super org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr>>(this.submatchers);
+ submatchers.add(org.zwobble.precisely.Matchers.has("end", org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExpr::end, end));
+ return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher(submatchers);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher body
+ // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustRangeExprMatcher body
+}