blob: f532639b97189d05c8ee90cf1c17a27e994f5a17 [file] [log] [blame]
Michael Layzellbe1e24d2017-06-04 21:15:23 -04001#![cfg(all(feature = "extra-traits", feature = "full"))]
Nika Layzella2a1a4a2017-11-19 11:33:17 -05002#![feature(rustc_private)]
3
David Tolnayc5ab8c62017-12-26 16:43:39 -05004#[macro_use]
Michael Layzellbe1e24d2017-06-04 21:15:23 -04005extern crate syn;
David Tolnay51382052017-12-27 13:46:21 -05006use syn::{BinOp, Expr, ExprBinary, ExprGroup, ExprKind, Lit, LitKind};
David Tolnay42eaae12017-12-26 23:05:18 -05007use syn::token::Group;
Michael Layzellbe1e24d2017-06-04 21:15:23 -04008
9extern crate proc_macro2;
10use proc_macro2::*;
11
David Tolnayc7a5d3d2017-06-04 12:11:05 -070012mod common;
13
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070014fn tt(k: TokenNode) -> TokenTree {
Michael Layzellbe1e24d2017-06-04 21:15:23 -040015 TokenTree {
16 span: Span::default(),
17 kind: k,
18 }
19}
20
21fn expr<T: Into<ExprKind>>(t: T) -> Expr {
22 t.into().into()
23}
24
25fn lit<T: Into<Literal>>(t: T) -> Expr {
26 expr(Lit {
27 value: LitKind::Other(t.into()),
David Tolnay98942562017-12-26 21:24:35 -050028 span: Span::default(),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040029 })
30}
31
32#[test]
33fn test_grouping() {
34 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070035 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070036 tt(TokenNode::Op('+', Spacing::Alone)),
David Tolnay51382052017-12-27 13:46:21 -050037 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 Crichtonf9e8f1a2017-07-05 18:20:44 -070046 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070047 tt(TokenNode::Literal(Literal::i32(4))),
David Tolnay51382052017-12-27 13:46:21 -050048 ].into_iter()
49 .collect();
Michael Layzellbe1e24d2017-06-04 21:15:23 -040050
51 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
52
David Tolnay51382052017-12-27 13:46:21 -050053 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 Layzellbe1e24d2017-06-04 21:15:23 -040066 })),
David Tolnay51382052017-12-27 13:46:21 -050067 op: BinOp::Mul(<Token![*]>::default()),
68 right: Box::new(lit(Literal::i32(4))),
Michael Layzellbe1e24d2017-06-04 21:15:23 -040069 })),
David Tolnay51382052017-12-27 13:46:21 -050070 })
71 );
Michael Layzellbe1e24d2017-06-04 21:15:23 -040072}
73
74#[test]
75fn test_invalid_grouping() {
76 let raw: TokenStream = vec![
Alex Crichton605643b2017-07-05 18:35:14 -070077 tt(TokenNode::Literal(Literal::i32(1))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070078 tt(TokenNode::Op('+', Spacing::Alone)),
David Tolnay51382052017-12-27 13:46:21 -050079 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 Crichton605643b2017-07-05 18:35:14 -070087 tt(TokenNode::Literal(Literal::i32(3))),
Alex Crichtonf9e8f1a2017-07-05 18:20:44 -070088 tt(TokenNode::Op('*', Spacing::Alone)),
Alex Crichton605643b2017-07-05 18:35:14 -070089 tt(TokenNode::Literal(Literal::i32(4))),
David Tolnay51382052017-12-27 13:46:21 -050090 ].into_iter()
91 .collect();
Michael Layzellbe1e24d2017-06-04 21:15:23 -040092
93 assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
94
David Tolnay51382052017-12-27 13:46:21 -050095 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 Tolnayf8db7ba2017-11-11 22:52:16 -0800103 op: BinOp::Add(<Token![+]>::default()),
David Tolnay51382052017-12-27 13:46:21 -0500104 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 Layzellbe1e24d2017-06-04 21:15:23 -0400111}