From b94fc2c22021dc50381856f170fe9dca4b879468 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 18 Jul 2026 19:10:38 +0100 Subject: Add iterator loop expressions to Rust AST --- .../compiler/output/lang/rust/RustWriter.java | 16 ++++++++ .../output/lang/rust/ast/RustExpression.java | 2 +- .../lang/rust/ast/RustIteratorLoopExpression.java | 48 ++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustIteratorLoopExpression.java (limited to 'src/main/java/org/zwobble') 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 d4228b0..d916311 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 @@ -347,6 +347,10 @@ public class RustWriter implements AutoCloseable { this.writeIntegerLiteral(integerLiteral); } + case RustIteratorLoopExpression iteratorLoopExpression -> { + this.writeIteratorLoopExpression(iteratorLoopExpression); + } + case RustPath path -> { this.writePath(path); } @@ -405,6 +409,7 @@ public class RustWriter implements AutoCloseable { case RustFieldExpression _ -> RustPrecedence.FIELD_EXPRESSIONS; case RustIfExpression _ -> RustPrecedence.PRIMARY; case RustIntegerLiteral _ -> RustPrecedence.PRIMARY; + case RustIteratorLoopExpression _ -> RustPrecedence.PRIMARY; case RustPath _ -> RustPrecedence.PATHS; case RustPrefixExpression _ -> RustPrecedence.PREFIX; case RustStructExpression _ -> RustPrecedence.PRIMARY; @@ -517,6 +522,17 @@ public class RustWriter implements AutoCloseable { } } + private void writeIteratorLoopExpression( + RustIteratorLoopExpression iteratorLoopExpression + ) throws IOException { + this.writer.write("for "); + this.writeIdentifier(iteratorLoopExpression.elementName()); + this.writer.write(" in "); + this.writeTopLevelExpression(iteratorLoopExpression.elements()); + this.writer.write(" "); + this.writeBlockExpression(iteratorLoopExpression.body()); + } + private void writePrefixExpression(RustPrefixExpression prefixExpression) throws IOException { this.writer.write(switch (prefixExpression.operator()) { case BORROW -> "&"; 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 95ca9f8..239f972 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.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.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/RustIteratorLoopExpression.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustIteratorLoopExpression.java new file mode 100644 index 0000000..0cd1ceb --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/ast/RustIteratorLoopExpression.java @@ -0,0 +1,48 @@ +// Generated by hobgoblin. + +package org.zwobble.hobgoblin.compiler.output.lang.rust.ast; + +// Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression imports +// Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression imports + +public record RustIteratorLoopExpression(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier elementName, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression elements, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression body) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression { + public static org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder arbitrary() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.arbitrary().build(), 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.RustIdentifier elementName, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression elements, org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression body) implements org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression.Builder { + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression build() { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression(elementName, elements, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder withElementName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier elementName) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(elementName, elements, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder withElementName(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIdentifier.Builder elementName) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(elementName.build(), elements, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder withElements(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression elements) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(elementName, elements, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder withElements(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustExpression.Builder elements) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(elementName, elements.build(), body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression body) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(elementName, elements, body); + } + + public org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder withBody(org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustBlockExpression.Builder body) { + return new org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder(elementName, elements, body.build()); + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression.Builder body + } + + // Custom area start: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression body + // Custom area end: org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustIteratorLoopExpression body +} -- cgit v1.2.3