blob: f5489479716e67b43f7fe52592d7039139f6965d [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
David Tolnayc5ab8c62017-12-26 16:43:39 -05005#[macro_use]
Michael Layzellbe1e24d2017-06-04 21:15:23 -04006extern crate syn;
7use syn::{Expr, ExprKind, ExprGroup, ExprBinary, Lit, LitKind, BinOp};
David Tolnayc5ab8c62017-12-26 16:43:39 -05008use syn::tokens::Group;
Michael Layzellbe1e24d2017-06-04 21:15:23 -04009
10extern crate proc_macro2;
11use proc_macro2::*;
12
David Tolnayc7a5d3d2017-06-04 12:11:05 -070013mod common;
14
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070015fn tt(k: TokenNode) -> TokenTree {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040016 TokenTree {
17 span: Span::default(),
18 kind: k,
19 }
20}
21
22fn expr<T: Into<ExprKind>>(t: T) -> Expr {
23 t.into().into()
24}
25
26fn lit<T: Into<Literal>>(t: T) -> Expr {
27 expr(Lit {
28 value: LitKind::Other(t.into()),
29 span: syn::Span::default(),
30 })
31}
32
33#[test]
34fn test_grouping() {
35 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070036 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070037 tt(TokenNode::Op('+', Spacing::Alone)),
38 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070039 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070040 tt(TokenNode::Op('+', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070041 tt(TokenNode::Literal(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040042 ].into_iter().collect())),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070043 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070044 tt(TokenNode::Literal(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040045 ].into_iter().collect();
46
47 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
48
David Tolnayc7a5d3d2017-06-04 12:11:05 -070049 assert_eq!(common::parse::syn::<Expr>(raw), expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070050 left: Box::new(lit(Literal::i32(1))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080051 op: BinOp::Add(<Token![+]>::default()),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040052 right: Box::new(expr(ExprBinary {
53 left: Box::new(expr(ExprGroup {
David Tolnayf8db7ba2017-11-11 22:52:16 -080054 group_token: Group::default(),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040055 expr: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070056 left: Box::new(lit(Literal::i32(2))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080057 op: BinOp::Add(<Token![+]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070058 right: Box::new(lit(Literal::i32(3))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040059 })),
60 })),
David Tolnayf8db7ba2017-11-11 22:52:16 -080061 op: BinOp::Mul(<Token![*]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070062 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040063 })),
64 }));
65}
66
67#[test]
68fn test_invalid_grouping() {
69 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070070 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070071 tt(TokenNode::Op('+', Spacing::Alone)),
72 tt(TokenNode::Group(Delimiter::None, vec![
Alex Crichton605643b2017-07-05 18:35:14 -070073 tt(TokenNode::Literal(Literal::i32(2))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070074 tt(TokenNode::Op('+', Spacing::Alone)),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040075 ].into_iter().collect())),
Alex Crichton605643b2017-07-05 18:35:14 -070076 tt(TokenNode::Literal(Literal::i32(3))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070077 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070078 tt(TokenNode::Literal(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040079 ].into_iter().collect();
80
81 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
82
David Tolnay3cede942017-12-26 12:29:24 -050083 assert_eq!(common::parse::syn::<Expr>(raw), expr(ExprBinary {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040084 left: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070085 left: Box::new(lit(Literal::i32(1))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080086 op: BinOp::Add(<Token![+]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070087 right: Box::new(lit(Literal::i32(2))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040088 })),
David Tolnayf8db7ba2017-11-11 22:52:16 -080089 op: BinOp::Add(<Token![+]>::default()),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040090 right: Box::new(expr(ExprBinary {
Alex Crichton605643b2017-07-05 18:35:14 -070091 left: Box::new(lit(Literal::i32(3))),
David Tolnayf8db7ba2017-11-11 22:52:16 -080092 op: BinOp::Mul(<Token![*]>::default()),
Alex Crichton605643b2017-07-05 18:35:14 -070093 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040094 })),
95 }));
96}