blob: fa8b6ebd7a5c27ae4113f64a20fe4aab5cc33053 [file] [log] [blame]
Michael Layzellbe1e24d2017-06-04 21:15:23 -04001#![cfg(all(feature = "extra-traits", feature = "full"))]
2
Nika Layzella2a1a4a2017-11-19 11:33:17 -05003#![feature(rustc_private)]
4
Michael Layzellbe1e24d2017-06-04 21:15:23 -04005extern crate syn;
6use syn::{Expr, ExprKind, ExprGroup, ExprBinary, Lit, LitKind, BinOp};
7
David Tolnayf8db7ba2017-11-11 22:52:16 -08008#[macro_use]
Michael Layzellbe1e24d2017-06-04 21:15:23 -04009extern crate synom;
David Tolnayf8db7ba2017-11-11 22:52:16 -080010use synom::tokens::Group;
Michael Layzellbe1e24d2017-06-04 21:15:23 -040011
12extern crate proc_macro2;
13use proc_macro2::*;
14
David Tolnayc7a5d3d2017-06-04 12:11:05 -070015mod common;
16
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070017fn tt(k: TokenNode) -> TokenTree {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040018 TokenTree {
19 span: Span::default(),
20 kind: k,
21 }
22}
23
24fn expr<T: Into<ExprKind>>(t: T) -> Expr {
25 t.into().into()
26}
27
28fn lit<T: Into<Literal>>(t: T) -> Expr {
29 expr(Lit {
30 value: LitKind::Other(t.into()),
31 span: syn::Span::default(),
32 })
33}
34
35#[test]
36fn test_grouping() {
37 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070038 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070039 tt(TokenNode::Op('+', Spacing::Alone)),
40 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070041 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070042 tt(TokenNode::Op('+', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070043 tt(TokenNode::Literal(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040044 ].into_iter().collect())),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070045 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070046 tt(TokenNode::Literal(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040047 ].into_iter().collect();
48
49 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
50
David Tolnayc7a5d3d2017-06-04 12:11:05 -070051 assert_eq!(common::parse::syn::<Expr>(raw), expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070052 left: Box::new(lit(Literal::i32(1))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080053 op: BinOp::Add(<Token![+]>::default()),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040054 right: Box::new(expr(ExprBinary {
55 left: Box::new(expr(ExprGroup {
David Tolnayf8db7ba2017-11-11 22:52:16 -080056 group_token: Group::default(),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040057 expr: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070058 left: Box::new(lit(Literal::i32(2))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080059 op: BinOp::Add(<Token![+]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070060 right: Box::new(lit(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040061 })),
62 })),
David Tolnayf8db7ba2017-11-11 22:52:16 -080063 op: BinOp::Mul(<Token![*]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070064 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040065 })),
66 }));
67}
68
69#[test]
70fn test_invalid_grouping() {
71 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070072 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070073 tt(TokenNode::Op('+', Spacing::Alone)),
74 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070075 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070076 tt(TokenNode::Op('+', Spacing::Alone)),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040077 ].into_iter().collect())),
Alex Crichton605643b2017-07-05 18:35:14 -070078 tt(TokenNode::Literal(Literal::i32(3))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070079 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070080 tt(TokenNode::Literal(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040081 ].into_iter().collect();
82
83 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
84
David Tolnayc7a5d3d2017-06-04 12:11:05 -070085 assert_eq!(common::parse::syn::<Expr>(raw.into()), expr(ExprBinary {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040086 left: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070087 left: Box::new(lit(Literal::i32(1))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080088 op: BinOp::Add(<Token![+]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070089 right: Box::new(lit(Literal::i32(2))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040090 })),
David Tolnayf8db7ba2017-11-11 22:52:16 -080091 op: BinOp::Add(<Token![+]>::default()),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040092 right: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070093 left: Box::new(lit(Literal::i32(3))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080094 op: BinOp::Mul(<Token![*]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070095 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040096 })),
97 }));
98}