Skip to content

Commit d210edb

Browse files
authored
Merge pull request #813 from harehare/fix/foreach-expression-support
🐛 fix(parser): Allow expressions in foreach iterable position
2 parents 9c55af7 + ff24f76 commit d210edb

1 file changed

Lines changed: 102 additions & 1 deletion

File tree

crates/mq-lang/src/cst/parser.rs

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1789,7 +1789,7 @@ impl<'a> Parser<'a> {
17891789

17901790
let leading_trivia = self.parse_leading_trivia();
17911791

1792-
children.push(self.parse_ident(leading_trivia)?);
1792+
children.push(self.parse_expr(leading_trivia, false, false)?);
17931793
children.push(self.next_node(|kind| matches!(kind, TokenKind::RParen), NodeKind::Token)?);
17941794
children.push(self.next_node(|kind| matches!(kind, TokenKind::Colon), NodeKind::Token)?);
17951795

@@ -3249,6 +3249,107 @@ mod tests {
32493249
ErrorReporter::default()
32503250
)
32513251
)]
3252+
#[case::foreach_value_is_function_call(
3253+
vec![
3254+
Shared::new(token(TokenKind::Foreach)),
3255+
Shared::new(token(TokenKind::Whitespace(1))),
3256+
Shared::new(token(TokenKind::LParen)),
3257+
Shared::new(token(TokenKind::Ident("item".into()))),
3258+
Shared::new(token(TokenKind::Comma)),
3259+
Shared::new(token(TokenKind::Ident("get_items".into()))),
3260+
Shared::new(token(TokenKind::LParen)),
3261+
Shared::new(token(TokenKind::Ident("arg".into()))),
3262+
Shared::new(token(TokenKind::RParen)),
3263+
Shared::new(token(TokenKind::RParen)),
3264+
Shared::new(token(TokenKind::Colon)),
3265+
Shared::new(token(TokenKind::NewLine)),
3266+
Shared::new(token(TokenKind::Ident("body".into()))),
3267+
],
3268+
(
3269+
vec![
3270+
Shared::new(Node {
3271+
kind: NodeKind::Foreach,
3272+
token: Some(Shared::new(token(TokenKind::Foreach))),
3273+
leading_trivia: Vec::new(),
3274+
trailing_trivia: vec![Trivia::Whitespace(Shared::new(token(TokenKind::Whitespace(1))))],
3275+
children: vec![
3276+
Shared::new(Node {
3277+
kind: NodeKind::Token,
3278+
token: Some(Shared::new(token(TokenKind::LParen))),
3279+
leading_trivia: Vec::new(),
3280+
trailing_trivia: Vec::new(),
3281+
children: Vec::new(),
3282+
}),
3283+
Shared::new(Node {
3284+
kind: NodeKind::Ident,
3285+
token: Some(Shared::new(token(TokenKind::Ident("item".into())))),
3286+
leading_trivia: Vec::new(),
3287+
trailing_trivia: Vec::new(),
3288+
children: Vec::new(),
3289+
}),
3290+
Shared::new(Node {
3291+
kind: NodeKind::Token,
3292+
token: Some(Shared::new(token(TokenKind::Comma))),
3293+
leading_trivia: Vec::new(),
3294+
trailing_trivia: Vec::new(),
3295+
children: Vec::new(),
3296+
}),
3297+
Shared::new(Node {
3298+
kind: NodeKind::Call,
3299+
token: Some(Shared::new(token(TokenKind::Ident("get_items".into())))),
3300+
leading_trivia: Vec::new(),
3301+
trailing_trivia: Vec::new(),
3302+
children: vec![
3303+
Shared::new(Node {
3304+
kind: NodeKind::Token,
3305+
token: Some(Shared::new(token(TokenKind::LParen))),
3306+
leading_trivia: Vec::new(),
3307+
trailing_trivia: Vec::new(),
3308+
children: Vec::new(),
3309+
}),
3310+
Shared::new(Node {
3311+
kind: NodeKind::Ident,
3312+
token: Some(Shared::new(token(TokenKind::Ident("arg".into())))),
3313+
leading_trivia: Vec::new(),
3314+
trailing_trivia: Vec::new(),
3315+
children: Vec::new(),
3316+
}),
3317+
Shared::new(Node {
3318+
kind: NodeKind::Token,
3319+
token: Some(Shared::new(token(TokenKind::RParen))),
3320+
leading_trivia: Vec::new(),
3321+
trailing_trivia: Vec::new(),
3322+
children: Vec::new(),
3323+
}),
3324+
],
3325+
}),
3326+
Shared::new(Node {
3327+
kind: NodeKind::Token,
3328+
token: Some(Shared::new(token(TokenKind::RParen))),
3329+
leading_trivia: Vec::new(),
3330+
trailing_trivia: Vec::new(),
3331+
children: Vec::new(),
3332+
}),
3333+
Shared::new(Node {
3334+
kind: NodeKind::Token,
3335+
token: Some(Shared::new(token(TokenKind::Colon))),
3336+
leading_trivia: Vec::new(),
3337+
trailing_trivia: Vec::new(),
3338+
children: Vec::new(),
3339+
}),
3340+
Shared::new(Node {
3341+
kind: NodeKind::Ident,
3342+
token: Some(Shared::new(token(TokenKind::Ident("body".into())))),
3343+
leading_trivia: vec![Trivia::NewLine],
3344+
trailing_trivia: Vec::new(),
3345+
children: Vec::new(),
3346+
}),
3347+
],
3348+
}),
3349+
],
3350+
ErrorReporter::default()
3351+
)
3352+
)]
32523353
#[case::while_(
32533354
vec![
32543355
Shared::new(token(TokenKind::While)),

0 commit comments

Comments
 (0)