diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-01-26 23:30:03 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-01-26 23:30:03 +0100 |
| commit | 710f88ccb2bceb9851a8fb0b7f131343ee33dbd5 (patch) | |
| tree | 32d1ac2794f73c599b9ff629ec6068fd9448ccc0 /src/syntax/expr.rs | |
| parent | 010ddc4795123987bdef3b5a60240203e7f11d01 (diff) | |
For loop patterns 🦚
Diffstat (limited to 'src/syntax/expr.rs')
| -rw-r--r-- | src/syntax/expr.rs | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/syntax/expr.rs b/src/syntax/expr.rs index ea762511..9f3bd9ad 100644 --- a/src/syntax/expr.rs +++ b/src/syntax/expr.rs @@ -528,7 +528,7 @@ impl Pretty for ExprIf { #[derive(Debug, Clone, PartialEq)] pub struct ExprFor { /// The pattern to assign to. - pub pat: Spanned<Ident>, + pub pat: Spanned<ForPattern>, /// The expression to iterate over. pub iter: SpanBox<Expr>, /// The expression to evaluate for each iteration. @@ -538,10 +538,32 @@ pub struct ExprFor { impl Pretty for ExprFor { fn pretty(&self, p: &mut Printer) { p.push_str("#for "); - p.push_str(&self.pat.v); + self.pat.v.pretty(p); p.push_str(" #in "); self.iter.v.pretty(p); p.push_str(" "); self.body.v.pretty(p); } } + +/// A pattern in a for loop. +#[derive(Debug, Clone, PartialEq)] +pub enum ForPattern { + /// A value pattern: `#for v #in array`. + Value(Ident), + /// A key-value pattern: `#for k, v #in dict`. + KeyValue(Ident, Ident), +} + +impl Pretty for ForPattern { + fn pretty(&self, p: &mut Printer) { + match self { + Self::Value(v) => p.push_str(&v), + Self::KeyValue(k, v) => { + p.push_str(&k); + p.push_str(", "); + p.push_str(&v); + } + } + } +} |
