David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 1 | use proc_macro2::{TokenNode, TokenStream, TokenTree, Delimiter}; |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 2 | use cursor::Cursor; |
David Tolnay | 203557a | 2017-12-27 23:59:33 -0500 | [diff] [blame] | 3 | use parse_error; |
| 4 | use synom::PResult; |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 5 | use MacroDelimiter; |
| 6 | use token::{Paren, Brace, Bracket}; |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 7 | |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 8 | pub fn delimited(input: Cursor) -> PResult<(MacroDelimiter, TokenStream)> { |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 9 | match input.token_tree() { |
| 10 | Some(( |
| 11 | rest, |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 12 | TokenTree { |
| 13 | span, |
| 14 | kind: TokenNode::Group(delimiter, tts), |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 15 | }, |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 16 | )) => { |
| 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 Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 25 | _ => parse_error(), |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | #[cfg(feature = "full")] |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 30 | pub fn braced(input: Cursor) -> PResult<(Brace, TokenStream)> { |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 31 | match input.token_tree() { |
| 32 | Some(( |
| 33 | rest, |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 34 | TokenTree { |
| 35 | span, |
| 36 | kind: TokenNode::Group(Delimiter::Brace, tts), |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 37 | }, |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 38 | )) => Ok((rest, (Brace(span), tts))), |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 39 | _ => parse_error(), |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | #[cfg(feature = "full")] |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 44 | pub fn parenthesized(input: Cursor) -> PResult<(Paren, TokenStream)> { |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 45 | match input.token_tree() { |
| 46 | Some(( |
| 47 | rest, |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 48 | TokenTree { |
| 49 | span, |
| 50 | kind: TokenNode::Group(Delimiter::Parenthesis, tts), |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 51 | }, |
David Tolnay | ab91951 | 2017-12-30 23:31:51 -0500 | [diff] [blame] | 52 | )) => Ok((rest, (Paren(span), tts))), |
David Tolnay | e082403 | 2017-12-27 15:25:56 -0500 | [diff] [blame] | 53 | _ => parse_error(), |
| 54 | } |
| 55 | } |