blob: b09225ee4cd3ac431eb836ecad2fd27a0ae66087 [file] [log] [blame]
#![cfg(all(feature = "extra-traits", feature = "full"))]
#![feature(rustc_private)]
#[macro_use]
extern crate syn;
use syn::{BinOp, Expr, ExprBinary, ExprGroup, ExprLit, Lit, LitKind};
use syn::token::Group;
extern crate proc_macro2;
use proc_macro2::*;
mod common;
fn tt(k: TokenNode) -> TokenTree {
TokenTree {
span: Span::default(),
kind: k,
}
}
fn expr<T: Into<Expr>>(t: T) -> Expr {
t.into()
}
fn lit<T: Into<Literal>>(t: T) -> Expr {
Expr::Lit(ExprLit {
attrs: Vec::new(),
lit: Lit {
value: LitKind::Other(t.into()),
span: Span::default(),
},
})
}
#[test]
fn test_grouping() {
let raw: TokenStream = vec![
tt(TokenNode::Literal(Literal::i32(1))),
tt(TokenNode::Op('+', Spacing::Alone)),
tt(TokenNode::Group(
Delimiter::None,
vec![
tt(TokenNode::Literal(Literal::i32(2))),
tt(TokenNode::Op('+', Spacing::Alone)),
tt(TokenNode::Literal(Literal::i32(3))),
].into_iter()
.collect(),
)),
tt(TokenNode::Op('*', Spacing::Alone)),
tt(TokenNode::Literal(Literal::i32(4))),
].into_iter()
.collect();
assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
assert_eq!(
common::parse::syn::<Expr>(raw),
expr(ExprBinary {
attrs: Vec::new(),
left: Box::new(lit(Literal::i32(1))),
op: BinOp::Add(<Token![+]>::default()),
right: Box::new(expr(ExprBinary {
attrs: Vec::new(),
left: Box::new(expr(ExprGroup {
attrs: Vec::new(),
group_token: Group::default(),
expr: Box::new(expr(ExprBinary {
attrs: Vec::new(),
left: Box::new(lit(Literal::i32(2))),
op: BinOp::Add(<Token![+]>::default()),
right: Box::new(lit(Literal::i32(3))),
})),
})),
op: BinOp::Mul(<Token![*]>::default()),
right: Box::new(lit(Literal::i32(4))),
})),
})
);
}
#[test]
fn test_invalid_grouping() {
let raw: TokenStream = vec![
tt(TokenNode::Literal(Literal::i32(1))),
tt(TokenNode::Op('+', Spacing::Alone)),
tt(TokenNode::Group(
Delimiter::None,
vec![
tt(TokenNode::Literal(Literal::i32(2))),
tt(TokenNode::Op('+', Spacing::Alone)),
].into_iter()
.collect(),
)),
tt(TokenNode::Literal(Literal::i32(3))),
tt(TokenNode::Op('*', Spacing::Alone)),
tt(TokenNode::Literal(Literal::i32(4))),
].into_iter()
.collect();
assert_eq!(raw.to_string(), "1i32 + 2i32 + 3i32 * 4i32");
assert_eq!(
common::parse::syn::<Expr>(raw),
expr(ExprBinary {
attrs: Vec::new(),
left: Box::new(expr(ExprBinary {
attrs: Vec::new(),
left: Box::new(lit(Literal::i32(1))),
op: BinOp::Add(<Token![+]>::default()),
right: Box::new(lit(Literal::i32(2))),
})),
op: BinOp::Add(<Token![+]>::default()),
right: Box::new(expr(ExprBinary {
attrs: Vec::new(),
left: Box::new(lit(Literal::i32(3))),
op: BinOp::Mul(<Token![*]>::default()),
right: Box::new(lit(Literal::i32(4))),
})),
})
);
}