David Tolnay | 9ee641a | 2019-05-08 17:00:16 -0700 | [diff] [blame] | 1 | use inflections::Inflect; |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 2 | use proc_macro2::{Ident, Span, TokenStream}; |
David Tolnay | c94e1a0 | 2019-05-08 17:26:35 -0700 | [diff] [blame] | 3 | use quote::quote; |
David Tolnay | b2188a6 | 2019-05-09 11:42:44 -0700 | [diff] [blame] | 4 | use syn_codegen::{Data, Definitions, Features, Node}; |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 5 | |
| 6 | pub const TERMINAL_TYPES: &[&str] = &["Span", "Ident"]; |
| 7 | |
David Tolnay | 9ee641a | 2019-05-08 17:00:16 -0700 | [diff] [blame] | 8 | pub fn under_name(name: &str) -> Ident { |
| 9 | Ident::new(&name.to_snake_case(), Span::call_site()) |
| 10 | } |
| 11 | |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 12 | pub fn traverse( |
| 13 | defs: &Definitions, |
| 14 | node: fn(&mut TokenStream, &mut TokenStream, &Node, &Definitions), |
| 15 | ) -> (TokenStream, TokenStream) { |
| 16 | let mut traits = TokenStream::new(); |
| 17 | let mut impls = TokenStream::new(); |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 18 | for s in &defs.types { |
David Tolnay | c94e1a0 | 2019-05-08 17:26:35 -0700 | [diff] [blame] | 19 | let features = &s.features.any; |
| 20 | let features = match features.len() { |
| 21 | 0 => quote!(), |
| 22 | 1 => quote!(#[cfg(feature = #(#features)*)]), |
| 23 | _ => quote!(#[cfg(any(#(feature = #features),*))]), |
| 24 | }; |
| 25 | traits.extend(features.clone()); |
| 26 | impls.extend(features); |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 27 | node(&mut traits, &mut impls, s, defs); |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 28 | } |
| 29 | for tt in TERMINAL_TYPES { |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 30 | let s = Node { |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 31 | ident: tt.to_string(), |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 32 | features: Features::default(), |
| 33 | data: Data::Private, |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 34 | }; |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 35 | node(&mut traits, &mut impls, &s, defs); |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 36 | } |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame] | 37 | (traits, impls) |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 38 | } |