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/parse | |
| parent | 010ddc4795123987bdef3b5a60240203e7f11d01 (diff) | |
For loop patterns 🦚
Diffstat (limited to 'src/parse')
| -rw-r--r-- | src/parse/mod.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs index ccf333b9..8687ac24 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -423,7 +423,7 @@ fn expr_for(p: &mut Parser) -> Option<Expr> { p.assert(Token::For); let mut expr_for = None; - if let Some(pat) = p.span_if(ident) { + if let Some(pat) = p.span_if(for_pattern) { if p.expect(Token::In) { if let Some(iter) = p.span_if(expr) { if let Some(body) = p.span_if(body) { @@ -440,6 +440,17 @@ fn expr_for(p: &mut Parser) -> Option<Expr> { expr_for } +/// Parse a for loop pattern. +fn for_pattern(p: &mut Parser) -> Option<ForPattern> { + let first = ident(p)?; + if p.eat_if(Token::Comma) { + if let Some(second) = ident(p) { + return Some(ForPattern::KeyValue(first, second)); + } + } + Some(ForPattern::Value(first)) +} + /// Parse an identifier. fn ident(p: &mut Parser) -> Option<Ident> { match p.peek() { |
