From 710f88ccb2bceb9851a8fb0b7f131343ee33dbd5 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 26 Jan 2021 23:30:03 +0100 Subject: =?UTF-8?q?For=20loop=20patterns=20=F0=9F=A6=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parse/mod.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/parse/mod.rs') 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 { 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_for } +/// Parse a for loop pattern. +fn for_pattern(p: &mut Parser) -> Option { + 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 { match p.peek() { -- cgit v1.2.3