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}; |
| 3 | use syn_codegen::{Data, Features, Definitions, Node}; |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 4 | |
| 5 | pub const TERMINAL_TYPES: &[&str] = &["Span", "Ident"]; |
| 6 | |
David Tolnay | 9ee641a | 2019-05-08 17:00:16 -0700 | [diff] [blame] | 7 | pub fn under_name(name: &str) -> Ident { |
| 8 | Ident::new(&name.to_snake_case(), Span::call_site()) |
| 9 | } |
| 10 | |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame^] | 11 | pub fn traverse( |
| 12 | defs: &Definitions, |
| 13 | node: fn(&mut TokenStream, &mut TokenStream, &Node, &Definitions), |
| 14 | ) -> (TokenStream, TokenStream) { |
| 15 | let mut traits = TokenStream::new(); |
| 16 | let mut impls = TokenStream::new(); |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 17 | for s in &defs.types { |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame^] | 18 | node(&mut traits, &mut impls, s, defs); |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 19 | } |
| 20 | for tt in TERMINAL_TYPES { |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame^] | 21 | let s = Node { |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 22 | ident: tt.to_string(), |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame^] | 23 | features: Features::default(), |
| 24 | data: Data::Private, |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 25 | }; |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame^] | 26 | node(&mut traits, &mut impls, &s, defs); |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 27 | } |
David Tolnay | cc8d14e | 2019-05-08 17:23:09 -0700 | [diff] [blame^] | 28 | (traits, impls) |
David Tolnay | 1e99fa3 | 2019-05-08 16:18:36 -0700 | [diff] [blame] | 29 | } |