blob: 62de2024053a182d056c80534274467e7c2fa7f8 [file] [log] [blame]
David Tolnay9ee641a2019-05-08 17:00:16 -07001use inflections::Inflect;
David Tolnaycc8d14e2019-05-08 17:23:09 -07002use proc_macro2::{Ident, Span, TokenStream};
3use syn_codegen::{Data, Features, Definitions, Node};
David Tolnay1e99fa32019-05-08 16:18:36 -07004
5pub const TERMINAL_TYPES: &[&str] = &["Span", "Ident"];
6
David Tolnay9ee641a2019-05-08 17:00:16 -07007pub fn under_name(name: &str) -> Ident {
8 Ident::new(&name.to_snake_case(), Span::call_site())
9}
10
David Tolnaycc8d14e2019-05-08 17:23:09 -070011pub 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 Tolnay1e99fa32019-05-08 16:18:36 -070017 for s in &defs.types {
David Tolnaycc8d14e2019-05-08 17:23:09 -070018 node(&mut traits, &mut impls, s, defs);
David Tolnay1e99fa32019-05-08 16:18:36 -070019 }
20 for tt in TERMINAL_TYPES {
David Tolnaycc8d14e2019-05-08 17:23:09 -070021 let s = Node {
David Tolnay1e99fa32019-05-08 16:18:36 -070022 ident: tt.to_string(),
David Tolnaycc8d14e2019-05-08 17:23:09 -070023 features: Features::default(),
24 data: Data::Private,
David Tolnay1e99fa32019-05-08 16:18:36 -070025 };
David Tolnaycc8d14e2019-05-08 17:23:09 -070026 node(&mut traits, &mut impls, &s, defs);
David Tolnay1e99fa32019-05-08 16:18:36 -070027 }
David Tolnaycc8d14e2019-05-08 17:23:09 -070028 (traits, impls)
David Tolnay1e99fa32019-05-08 16:18:36 -070029}