summaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-01-26 23:30:03 +0100
committerLaurenz <laurmaedje@gmail.com>2021-01-26 23:30:03 +0100
commit710f88ccb2bceb9851a8fb0b7f131343ee33dbd5 (patch)
tree32d1ac2794f73c599b9ff629ec6068fd9448ccc0 /src/parse
parent010ddc4795123987bdef3b5a60240203e7f11d01 (diff)
For loop patterns 🦚
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/mod.rs13
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() {