Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 1 | #[cfg(feature = "extra-traits")] |
| 2 | use std::fmt; |
| 3 | |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 4 | use super::*; |
| 5 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 6 | use proc_macro2::{TokenKind, Delimiter}; |
| 7 | |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 8 | ast_struct! { |
| 9 | /// Represents a macro invocation. The Path indicates which macro |
| 10 | /// is being invoked, and the vector of token-trees contains the source |
| 11 | /// of the macro invocation. |
| 12 | /// |
| 13 | /// NB: the additional ident for a `macro_rules`-style macro is actually |
| 14 | /// stored in the enclosing item. Oog. |
| 15 | pub struct Mac { |
| 16 | pub path: Path, |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 17 | pub bang_token: tokens::Bang, |
| 18 | pub tokens: Vec<TokenTree>, |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 19 | } |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 20 | } |
| 21 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 22 | #[cfg_attr(feature = "clone-impls", derive(Clone))] |
| 23 | pub struct TokenTree(pub proc_macro2::TokenTree); |
| 24 | |
| 25 | impl Mac { |
| 26 | pub fn is_braced(&self) -> bool { |
| 27 | match self.tokens.last() { |
| 28 | Some(t) => t.is_braced(), |
| 29 | None => false, |
| 30 | } |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 31 | } |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 32 | } |
| 33 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 34 | impl TokenTree { |
| 35 | pub fn is_braced(&self) -> bool { |
| 36 | match self.0.kind { |
| 37 | TokenKind::Sequence(Delimiter::Brace, _) => true, |
| 38 | _ => false, |
| 39 | } |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 40 | } |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 41 | } |
| 42 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 43 | #[cfg(feature = "extra-traits")] |
| 44 | impl PartialEq for TokenTree { |
| 45 | fn eq(&self, other: &TokenTree) -> bool { |
| 46 | use proc_macro2::OpKind; |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 47 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 48 | match (&self.0.kind, &other.0.kind) { |
| 49 | (&TokenKind::Sequence(d1, ref s1), &TokenKind::Sequence(d2, ref s2)) => { |
| 50 | match (d1, d2) { |
| 51 | (Delimiter::Parenthesis, Delimiter::Parenthesis) | |
| 52 | (Delimiter::Brace, Delimiter::Brace) | |
| 53 | (Delimiter::Bracket, Delimiter::Bracket) => {} |
| 54 | (Delimiter::None, Delimiter::None) => {} |
| 55 | _ => return false, |
| 56 | } |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 57 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 58 | let s1 = s1.clone().into_iter(); |
| 59 | let mut s2 = s2.clone().into_iter(); |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 60 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 61 | for item1 in s1 { |
| 62 | let item2 = match s2.next() { |
| 63 | Some(item) => item, |
| 64 | None => return false, |
| 65 | }; |
| 66 | if TokenTree(item1) != TokenTree(item2) { |
| 67 | return false |
| 68 | } |
| 69 | } |
| 70 | s2.next().is_none() |
| 71 | } |
| 72 | (&TokenKind::Op(o1, k1), &TokenKind::Op(o2, k2)) => { |
| 73 | o1 == o2 && match (k1, k2) { |
| 74 | (OpKind::Alone, OpKind::Alone) | |
| 75 | (OpKind::Joint, OpKind::Joint) => true, |
| 76 | _ => false, |
| 77 | } |
| 78 | } |
| 79 | (&TokenKind::Literal(ref l1), &TokenKind::Literal(ref l2)) => { |
| 80 | l1.to_string() == l2.to_string() |
| 81 | } |
| 82 | (&TokenKind::Word(ref s1), &TokenKind::Word(ref s2)) => { |
| 83 | s1.as_str() == s2.as_str() |
| 84 | } |
| 85 | _ => false, |
| 86 | } |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 87 | } |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 88 | } |
| 89 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 90 | #[cfg(feature = "extra-traits")] |
| 91 | impl Eq for TokenTree {} |
| 92 | |
| 93 | #[cfg(feature = "extra-traits")] |
| 94 | impl ::std::hash::Hash for TokenTree { |
| 95 | fn hash<H: ::std::hash::Hasher>(&self, h: &mut H) { |
| 96 | use proc_macro2::OpKind; |
| 97 | |
| 98 | match self.0.kind { |
| 99 | TokenKind::Sequence(delim, ref stream) => { |
| 100 | 0u8.hash(h); |
| 101 | match delim { |
| 102 | Delimiter::Parenthesis => 0u8.hash(h), |
| 103 | Delimiter::Brace => 1u8.hash(h), |
| 104 | Delimiter::Bracket => 2u8.hash(h), |
| 105 | Delimiter::None => 3u8.hash(h), |
| 106 | } |
| 107 | |
| 108 | for item in stream.clone().into_iter() { |
| 109 | TokenTree(item).hash(h); |
| 110 | } |
| 111 | 0xffu8.hash(h); // terminator w/ a variant we don't normally hash |
| 112 | } |
| 113 | TokenKind::Op(op, kind) => { |
| 114 | 1u8.hash(h); |
| 115 | op.hash(h); |
| 116 | match kind { |
| 117 | OpKind::Alone => 0u8.hash(h), |
| 118 | OpKind::Joint => 1u8.hash(h), |
| 119 | } |
| 120 | } |
| 121 | TokenKind::Literal(ref lit) => (2u8, lit.to_string()).hash(h), |
| 122 | TokenKind::Word(ref word) => (3u8, word.as_str()).hash(h), |
| 123 | } |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 124 | } |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 125 | } |
| 126 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 127 | #[cfg(feature = "extra-traits")] |
| 128 | impl fmt::Debug for TokenTree { |
| 129 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| 130 | self.0.to_string().fmt(f) |
Alex Crichton | 62a0a59 | 2017-05-22 13:58:53 -0700 | [diff] [blame] | 131 | } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | #[cfg(feature = "parsing")] |
| 135 | pub mod parsing { |
| 136 | use super::*; |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 137 | use {Lifetime}; |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 138 | use generics::parsing::lifetime; |
David Tolnay | 5d55ef7 | 2016-12-21 20:20:04 -0500 | [diff] [blame] | 139 | use ident::parsing::word; |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 140 | use lit::parsing::lit; |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 141 | use synom::IResult; |
| 142 | use synom::space::{block_comment, whitespace, skip_whitespace}; |
David Tolnay | 5d55ef7 | 2016-12-21 20:20:04 -0500 | [diff] [blame] | 143 | use ty::parsing::path; |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 144 | use proc_macro2::{self, TokenStream, TokenKind, Delimiter, OpKind, Literal}; |
| 145 | |
| 146 | fn tt(kind: TokenKind) -> TokenTree { |
| 147 | TokenTree(proc_macro2::TokenTree { |
| 148 | kind: kind, |
| 149 | span: Default::default(), |
| 150 | }) |
| 151 | } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 152 | |
| 153 | named!(pub mac -> Mac, do_parse!( |
David Tolnay | 5d55ef7 | 2016-12-21 20:20:04 -0500 | [diff] [blame] | 154 | what: path >> |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 155 | punct!("!") >> |
| 156 | body: delimited >> |
| 157 | (Mac { |
David Tolnay | 5d55ef7 | 2016-12-21 20:20:04 -0500 | [diff] [blame] | 158 | path: what, |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 159 | bang_token: tokens::Bang::default(), |
| 160 | tokens: vec![body], |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 161 | }) |
| 162 | )); |
| 163 | |
David Tolnay | f5fdfa0 | 2016-10-23 15:25:17 -0700 | [diff] [blame] | 164 | named!(pub token_trees -> Vec<TokenTree>, many0!(token_tree)); |
Simon Sapin | 095a42b | 2016-10-20 15:54:23 +0200 | [diff] [blame] | 165 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 166 | named!(pub token_stream -> TokenStream, |
| 167 | map!(token_trees, |t: Vec<TokenTree>| t.into_iter().map(|t| t.0).collect())); |
| 168 | |
| 169 | named!(pub delimited -> TokenTree, alt!( |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 170 | delimited!( |
| 171 | punct!("("), |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 172 | token_stream, |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 173 | punct!(")") |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 174 | ) => { |ts| tt(TokenKind::Sequence(Delimiter::Parenthesis, ts)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 175 | | |
| 176 | delimited!( |
| 177 | punct!("["), |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 178 | token_stream, |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 179 | punct!("]") |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 180 | ) => { |ts| tt(TokenKind::Sequence(Delimiter::Bracket, ts)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 181 | | |
| 182 | delimited!( |
| 183 | punct!("{"), |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 184 | token_stream, |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 185 | punct!("}") |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 186 | ) => { |ts| tt(TokenKind::Sequence(Delimiter::Brace, ts)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 187 | )); |
| 188 | |
David Tolnay | 5fe14fc | 2017-01-27 16:22:08 -0800 | [diff] [blame] | 189 | named!(pub token_tree -> TokenTree, alt!( |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 190 | token |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 191 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 192 | delimited |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 193 | )); |
| 194 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 195 | macro_rules! punct1 { |
| 196 | ($i:expr, $punct:expr) => { |
| 197 | punct1($i, $punct) |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | fn punct1<'a>(input: &'a str, token: &'static str) -> IResult<&'a str, char> { |
| 202 | let input = skip_whitespace(input); |
| 203 | if input.starts_with(token) { |
| 204 | IResult::Done(&input[1..], token.chars().next().unwrap()) |
| 205 | } else { |
| 206 | IResult::Error |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | named!(token -> TokenTree, alt!( |
| 211 | keyword!("_") => { |_| tt(TokenKind::Op('_', OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 212 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 213 | punct1!("&&") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before BinOp |
David Tolnay | 2165b04 | 2016-10-08 00:04:23 -0700 | [diff] [blame] | 214 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 215 | punct1!("||") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before BinOp |
David Tolnay | e6042a6 | 2016-10-08 22:22:10 -0700 | [diff] [blame] | 216 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 217 | punct1!("->") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before BinOp |
David Tolnay | e6042a6 | 2016-10-08 22:22:10 -0700 | [diff] [blame] | 218 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 219 | punct1!("<-") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before Lt |
David Tolnay | e6042a6 | 2016-10-08 22:22:10 -0700 | [diff] [blame] | 220 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 221 | punct1!("=>") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before Eq |
David Tolnay | e6042a6 | 2016-10-08 22:22:10 -0700 | [diff] [blame] | 222 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 223 | punct1!("...") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before DotDot |
David Tolnay | e6042a6 | 2016-10-08 22:22:10 -0700 | [diff] [blame] | 224 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 225 | punct1!("..") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } // must be before Dot |
David Tolnay | e6042a6 | 2016-10-08 22:22:10 -0700 | [diff] [blame] | 226 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 227 | punct1!(".") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 2165b04 | 2016-10-08 00:04:23 -0700 | [diff] [blame] | 228 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 229 | // must be before bin_op |
| 230 | map!(doc_comment, |s: String| tt(TokenKind::Literal(Literal::doccomment(&s)))) |
David Tolnay | 29833aa | 2016-10-25 21:08:03 -0700 | [diff] [blame] | 231 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 232 | bin_op_eq // must be before bin_op |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 233 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 234 | bin_op |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 235 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 236 | map!(lit, |l: Lit| l.into_token_tree()) |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 237 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 238 | map!(word, |w: Ident| tt(TokenKind::Word(w.sym))) |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 239 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 240 | map!(lifetime, |lt: Lifetime| tt(TokenKind::Word(lt.ident.sym))) |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 241 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 242 | punct1!("<=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 243 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 244 | punct1!("==") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 245 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 246 | punct1!("!=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 247 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 248 | punct1!(">=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 249 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 250 | punct1!("::") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 251 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 252 | punct1!("=") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 253 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 254 | punct1!("<") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 255 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 256 | punct1!(">") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 257 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 258 | punct1!("!") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 259 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 260 | punct1!("~") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 261 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 262 | punct1!("@") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 263 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 264 | punct1!(",") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 265 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 266 | punct1!(";") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 267 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 268 | punct1!(":") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 59b23c5 | 2016-10-02 23:17:55 -0700 | [diff] [blame] | 269 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 270 | punct1!("#") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 271 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 272 | punct1!("$") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 273 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 274 | punct1!("?") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 275 | )); |
| 276 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 277 | named!(bin_op -> TokenTree, alt!( |
| 278 | punct1!("+") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 279 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 280 | punct1!("-") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 281 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 282 | punct1!("*") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 283 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 284 | punct1!("/") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 285 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 286 | punct1!("%") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 287 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 288 | punct1!("^") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 289 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 290 | punct1!("&") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 291 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 292 | punct1!("|") => { |c| tt(TokenKind::Op(c, OpKind::Alone)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 293 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 294 | punct1!("<<") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 295 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 296 | punct1!(">>") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 297 | )); |
| 298 | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 299 | named!(bin_op_eq -> TokenTree, alt!( |
| 300 | punct1!("+=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 301 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 302 | punct1!("-=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 303 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 304 | punct1!("*=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 305 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 306 | punct1!("/=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 307 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 308 | punct1!("%=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 309 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 310 | punct1!("^=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 311 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 312 | punct1!("&=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 313 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 314 | punct1!("|=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 315 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 316 | punct1!("<<=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 317 | | |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 318 | punct1!(">>=") => { |c| tt(TokenKind::Op(c, OpKind::Joint)) } |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 319 | )); |
| 320 | |
| 321 | named!(doc_comment -> String, alt!( |
Michael Layzell | 416724e | 2017-05-24 21:12:34 -0400 | [diff] [blame] | 322 | inner_doc_comment |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 323 | | |
Michael Layzell | 416724e | 2017-05-24 21:12:34 -0400 | [diff] [blame] | 324 | outer_doc_comment |
David Tolnay | 84aa075 | 2016-10-02 23:01:13 -0700 | [diff] [blame] | 325 | )); |
David Tolnay | f4bbbd9 | 2016-09-23 14:41:55 -0700 | [diff] [blame] | 326 | } |
David Tolnay | f8cf963 | 2016-10-02 23:15:25 -0700 | [diff] [blame] | 327 | |
| 328 | #[cfg(feature = "printing")] |
| 329 | mod printing { |
| 330 | use super::*; |
| 331 | use quote::{Tokens, ToTokens}; |
| 332 | |
| 333 | impl ToTokens for Mac { |
| 334 | fn to_tokens(&self, tokens: &mut Tokens) { |
| 335 | self.path.to_tokens(tokens); |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 336 | self.bang_token.to_tokens(tokens); |
| 337 | tokens.append_all(&self.tokens); |
David Tolnay | f8cf963 | 2016-10-02 23:15:25 -0700 | [diff] [blame] | 338 | } |
| 339 | } |
| 340 | |
| 341 | impl ToTokens for TokenTree { |
| 342 | fn to_tokens(&self, tokens: &mut Tokens) { |
Alex Crichton | ccbb45d | 2017-05-23 10:58:24 -0700 | [diff] [blame] | 343 | self.0.to_tokens(tokens); |
David Tolnay | f8cf963 | 2016-10-02 23:15:25 -0700 | [diff] [blame] | 344 | } |
| 345 | } |
| 346 | } |