Skip to content

Commit 4b7ba73

Browse files
committed
Fix spaces handling in comprehensions.
1 parent 0cf45b3 commit 4b7ba73

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

src/expressions.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,10 @@ named!(atom<StrSpan, Box<Expression>>,
304304
// testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
305305
named!(testlist_comp<StrSpan, TestlistCompReturn>,
306306
do_parse!(
307-
first: alt!(
307+
first: ws3!(alt!(
308308
call!(Self::test) => { |e: Box<_>| SetItem::Unique(*e) }
309309
| call!(Self::star_expr) => { |e: Box<_>| SetItem::Star(*e) }
310-
) >>
310+
)) >>
311311
r: alt!(
312312
call!(Self::comp_for) => { |comp| TestlistCompReturn::Comp(Box::new(first), comp) }
313313
| opt!(delimited!(
@@ -418,16 +418,16 @@ named!(dictorsetmaker<StrSpan, Box<Expression>>,
418418

419419
named_args!(dictmaker(item1: DictItem) <StrSpan, Box<Expression>>,
420420
map!(
421-
opt!(ws4!(alt!(
422-
delimited!(char!(','), separated_list!(char!(','), call!(Self::dictitem)), opt!(ws4!(char!(',')))) => { |v: Vec<_>| {
421+
opt!(alt!(
422+
ws4!(delimited!(char!(','), separated_list!(char!(','), call!(Self::dictitem)), opt!(ws4!(char!(','))))) => { |v: Vec<_>| {
423423
let mut v = v;
424424
v.insert(0, item1.clone()); // FIXME: do not clone
425425
Box::new(Expression::DictLiteral(v))
426426
}}
427427
| preceded!(peek!(tuple!(tag!("for"), call!(helpers::space_sep))), call!(Self::comp_for)) => { |comp| {
428428
Box::new(Expression::DictComp(Box::new(item1.clone()), comp)) // FIXME: do not clone
429429
}}
430-
))),
430+
)),
431431
|rest| {
432432
match rest {
433433
Some(r) => r,
@@ -439,16 +439,16 @@ named_args!(dictmaker(item1: DictItem) <StrSpan, Box<Expression>>,
439439

440440
named_args!(setmaker(item1: SetItem) <StrSpan, Box<Expression>>,
441441
do_parse!(
442-
rest:opt!(ws4!(alt!(
443-
delimited!(char!(','), separated_list!(char!(','), call!(Self::setitem)), opt!(ws4!(char!(',')))) => { |v: Vec<_>| {
442+
rest:opt!(alt!(
443+
ws4!(delimited!(char!(','), separated_list!(char!(','), call!(Self::setitem)), opt!(ws4!(char!(','))))) => { |v: Vec<_>| {
444444
let mut v = v;
445445
v.insert(0, item1.clone()); // FIXME: do not clone
446446
Box::new(Expression::SetLiteral(v))
447447
}}
448448
| call!(Self::comp_for) => { |comp| {
449449
Box::new(Expression::SetComp(Box::new(item1.clone()), comp)) // FIXME: do not clone
450450
}}
451-
))) >> (
451+
)) >> (
452452
match rest {
453453
Some(r) => r,
454454
None => Box::new(Expression::SetLiteral(vec![item1])),
@@ -565,7 +565,6 @@ named!(comp_for<StrSpan, Vec<ComprehensionChunk>>,
565565
);
566566
named_args!(comp_for2(acc: Vec<ComprehensionChunk>) <StrSpan, Vec<ComprehensionChunk>>,
567567
do_parse!(
568-
space_sep!() >>
569568
async: map!(opt!(terminated!(tag!("async"), space_sep!())), |o| o.is_some()) >>
570569
tag!("for") >>
571570
space_sep!() >>
@@ -574,6 +573,7 @@ named_args!(comp_for2(acc: Vec<ComprehensionChunk>) <StrSpan, Vec<ComprehensionC
574573
tag!("in") >>
575574
space_sep!() >>
576575
iterator: map!(call!(Self::or_test), |e| *e) >>
576+
spaces!() >>
577577
r: call!(Self::opt_comp_iter, { let mut acc = acc; acc.push(ComprehensionChunk::For { async, item, iterator }); acc }) >> (
578578
r
579579
)
@@ -583,7 +583,6 @@ named_args!(comp_for2(acc: Vec<ComprehensionChunk>) <StrSpan, Vec<ComprehensionC
583583
// comp_if: 'if' test_nocond [comp_iter]
584584
named_args!(comp_if(acc: Vec<ComprehensionChunk>) <StrSpan, Vec<ComprehensionChunk>>,
585585
do_parse!(
586-
space_sep!() >>
587586
tag!("if") >>
588587
space_sep!() >>
589588
cond: map!(call!(Self::test_nocond), |e| *e) >>
@@ -1513,7 +1512,7 @@ mod tests {
15131512
fn test_comp_for() {
15141513
let comp_for = ExpressionParser::<NewlinesAreNotSpaces>::comp_for;
15151514

1516-
assert_parse_eq(comp_for(make_strspan(" for bar in baz")), Ok((make_strspan(""), vec![
1515+
assert_parse_eq(comp_for(make_strspan("for bar in baz")), Ok((make_strspan(""), vec![
15171516
ComprehensionChunk::For {
15181517
async: false,
15191518
item: vec![

0 commit comments

Comments
 (0)