blob: b0952a0c6aff89993353dcf4a0b257ee215890d6 [file] [log] [blame]
David Tolnayab919512017-12-30 23:31:51 -05001use proc_macro2::{TokenNode, TokenStream, TokenTree, Delimiter};
David Tolnaye0824032017-12-27 15:25:56 -05002use cursor::Cursor;
David Tolnay203557a2017-12-27 23:59:33 -05003use parse_error;
4use synom::PResult;
David Tolnayab919512017-12-30 23:31:51 -05005use MacroDelimiter;
6use token::{Paren, Brace, Bracket};
David Tolnaye0824032017-12-27 15:25:56 -05007
David Tolnayab919512017-12-30 23:31:51 -05008pub fn delimited(input: Cursor) -> PResult<(MacroDelimiter, TokenStream)> {
David Tolnaye0824032017-12-27 15:25:56 -05009 match input.token_tree() {
10 Some((
11 rest,
David Tolnayab919512017-12-30 23:31:51 -050012 TokenTree {
13 span,
14 kind: TokenNode::Group(delimiter, tts),
David Tolnaye0824032017-12-27 15:25:56 -050015 },
David Tolnayab919512017-12-30 23:31:51 -050016 )) => {
17 let delimiter = match delimiter {
18 Delimiter::Parenthesis => MacroDelimiter::Paren(Paren(span)),
19 Delimiter::Brace => MacroDelimiter::Brace(Brace(span)),
20 Delimiter::Bracket => MacroDelimiter::Bracket(Bracket(span)),
21 Delimiter::None => return parse_error(),
22 };
23 Ok((rest, (delimiter, tts)))
24 }
David Tolnaye0824032017-12-27 15:25:56 -050025 _ => parse_error(),
26 }
27}
28
29#[cfg(feature = "full")]
David Tolnayab919512017-12-30 23:31:51 -050030pub fn braced(input: Cursor) -> PResult<(Brace, TokenStream)> {
David Tolnaye0824032017-12-27 15:25:56 -050031 match input.token_tree() {
32 Some((
33 rest,
David Tolnayab919512017-12-30 23:31:51 -050034 TokenTree {
35 span,
36 kind: TokenNode::Group(Delimiter::Brace, tts),
David Tolnaye0824032017-12-27 15:25:56 -050037 },
David Tolnayab919512017-12-30 23:31:51 -050038 )) => Ok((rest, (Brace(span), tts))),
David Tolnaye0824032017-12-27 15:25:56 -050039 _ => parse_error(),
40 }
41}
42
43#[cfg(feature = "full")]
David Tolnayab919512017-12-30 23:31:51 -050044pub fn parenthesized(input: Cursor) -> PResult<(Paren, TokenStream)> {
David Tolnaye0824032017-12-27 15:25:56 -050045 match input.token_tree() {
46 Some((
47 rest,
David Tolnayab919512017-12-30 23:31:51 -050048 TokenTree {
49 span,
50 kind: TokenNode::Group(Delimiter::Parenthesis, tts),
David Tolnaye0824032017-12-27 15:25:56 -050051 },
David Tolnayab919512017-12-30 23:31:51 -050052 )) => Ok((rest, (Paren(span), tts))),
David Tolnaye0824032017-12-27 15:25:56 -050053 _ => parse_error(),
54 }
55}