Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 1 | #![cfg(all(feature = "extra-traits", feature = "full"))] |
Nika Layzell | a2a1a4a | 2017-11-19 11:33:17 -0500 | [diff] [blame] | 2 | #![feature(rustc_private)] |
| 3 | |
David Tolnay | c5ab8c6 | 2017-12-26 16:43:39 -0500 | [diff] [blame] | 4 | #[macro_use] |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 5 | extern crate syn; |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 6 | use syn::{BinOp, Expr, ExprBinary, ExprGroup, ExprKind, Lit, LitKind}; |
David Tolnay | 42eaae1 | 2017-12-26 23:05:18 -0500 | [diff] [blame] | 7 | use syn::token::Group; |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 8 | |
| 9 | extern crate proc_macro2; |
| 10 | use proc_macro2::*; |
| 11 | |
David Tolnay | c7a5d3d | 2017-06-04 12:11:05 -0700 | [diff] [blame] | 12 | mod common; |
| 13 | |
Alex Crichton | f9e8f1a | 2017-07-05 18:20:44 -0700 | [diff] [blame] | 14 | fn tt(k: TokenNode) -> TokenTree { |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 15 | TokenTree { |
| 16 | span: Span::default(), |
| 17 | kind: k, |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | fn expr<T: Into<ExprKind>>(t: T) -> Expr { |
| 22 | t.into().into() |
| 23 | } |
| 24 | |
| 25 | fn lit<T: Into<Literal>>(t: T) -> Expr { |
| 26 | expr(Lit { |
| 27 | value: LitKind::Other(t.into()), |
David Tolnay | 9894256 | 2017-12-26 21:24:35 -0500 | [diff] [blame] | 28 | span: Span::default(), |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 29 | }) |
| 30 | } |
| 31 | |
| 32 | #[test] |
| 33 | fn test_grouping() { |
| 34 | let raw: TokenStream = vec![ |
Alex Crichton | 605643b | 2017-07-05 18:35:14 -0700 | [diff] [blame] | 35 | tt(TokenNode::Literal(Literal::i32(1))), |
Alex Crichton | f9e8f1a | 2017-07-05 18:20:44 -0700 | [diff] [blame] | 36 | tt(TokenNode::Op('+', Spacing::Alone)), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 37 | tt(TokenNode::Group( |
| 38 | Delimiter::None, |
| 39 | vec![ |
| 40 | tt(TokenNode::Literal(Literal::i32(2))), |
| 41 | tt(TokenNode::Op('+', Spacing::Alone)), |
| 42 | tt(TokenNode::Literal(Literal::i32(3))), |
| 43 | ].into_iter() |
| 44 | .collect(), |
| 45 | )), |
Alex Crichton | f9e8f1a | 2017-07-05 18:20:44 -0700 | [diff] [blame] | 46 | tt(TokenNode::Op('*', Spacing::Alone)), |
Alex Crichton | 605643b | 2017-07-05 18:35:14 -0700 | [diff] [blame] | 47 | tt(TokenNode::Literal(Literal::i32(4))), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 48 | ].into_iter() |
| 49 | .collect(); |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 50 | |
| 51 | assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32"); |
| 52 | |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 53 | assert_eq!( |
| 54 | common::parse::syn::<Expr>(raw), |
| 55 | expr(ExprBinary { |
| 56 | left: Box::new(lit(Literal::i32(1))), |
| 57 | op: BinOp::Add(<Token![+]>::default()), |
| 58 | right: Box::new(expr(ExprBinary { |
| 59 | left: Box::new(expr(ExprGroup { |
| 60 | group_token: Group::default(), |
| 61 | expr: Box::new(expr(ExprBinary { |
| 62 | left: Box::new(lit(Literal::i32(2))), |
| 63 | op: BinOp::Add(<Token![+]>::default()), |
| 64 | right: Box::new(lit(Literal::i32(3))), |
| 65 | })), |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 66 | })), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 67 | op: BinOp::Mul(<Token![*]>::default()), |
| 68 | right: Box::new(lit(Literal::i32(4))), |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 69 | })), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 70 | }) |
| 71 | ); |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 72 | } |
| 73 | |
| 74 | #[test] |
| 75 | fn test_invalid_grouping() { |
| 76 | let raw: TokenStream = vec![ |
Alex Crichton | 605643b | 2017-07-05 18:35:14 -0700 | [diff] [blame] | 77 | tt(TokenNode::Literal(Literal::i32(1))), |
Alex Crichton | f9e8f1a | 2017-07-05 18:20:44 -0700 | [diff] [blame] | 78 | tt(TokenNode::Op('+', Spacing::Alone)), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 79 | tt(TokenNode::Group( |
| 80 | Delimiter::None, |
| 81 | vec![ |
| 82 | tt(TokenNode::Literal(Literal::i32(2))), |
| 83 | tt(TokenNode::Op('+', Spacing::Alone)), |
| 84 | ].into_iter() |
| 85 | .collect(), |
| 86 | )), |
Alex Crichton | 605643b | 2017-07-05 18:35:14 -0700 | [diff] [blame] | 87 | tt(TokenNode::Literal(Literal::i32(3))), |
Alex Crichton | f9e8f1a | 2017-07-05 18:20:44 -0700 | [diff] [blame] | 88 | tt(TokenNode::Op('*', Spacing::Alone)), |
Alex Crichton | 605643b | 2017-07-05 18:35:14 -0700 | [diff] [blame] | 89 | tt(TokenNode::Literal(Literal::i32(4))), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 90 | ].into_iter() |
| 91 | .collect(); |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 92 | |
| 93 | assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32"); |
| 94 | |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 95 | assert_eq!( |
| 96 | common::parse::syn::<Expr>(raw), |
| 97 | expr(ExprBinary { |
| 98 | left: Box::new(expr(ExprBinary { |
| 99 | left: Box::new(lit(Literal::i32(1))), |
| 100 | op: BinOp::Add(<Token![+]>::default()), |
| 101 | right: Box::new(lit(Literal::i32(2))), |
| 102 | })), |
David Tolnay | f8db7ba | 2017-11-11 22:52:16 -0800 | [diff] [blame] | 103 | op: BinOp::Add(<Token![+]>::default()), |
David Tolnay | 5138205 | 2017-12-27 13:46:21 -0500 | [diff] [blame^] | 104 | right: Box::new(expr(ExprBinary { |
| 105 | left: Box::new(lit(Literal::i32(3))), |
| 106 | op: BinOp::Mul(<Token![*]>::default()), |
| 107 | right: Box::new(lit(Literal::i32(4))), |
| 108 | })), |
| 109 | }) |
| 110 | ); |
Michael Layzell | be1e24d | 2017-06-04 21:15:23 -0400 | [diff] [blame] | 111 | } |