blob: fd77d0dca0c34da65ec399b82a77786c1e3eee3c [file] [log] [blame]
David Tolnay9ee641a2019-05-08 17:00:16 -07001use inflections::Inflect;
2use proc_macro2::{Ident, Span};
David Tolnay1e99fa32019-05-08 16:18:36 -07003use syn_codegen as types;
4
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 Tolnay2fb3d482019-05-08 16:22:10 -070011pub fn traverse<S, F>(defs: &types::Definitions, node: F) -> S
David Tolnay1e99fa32019-05-08 16:18:36 -070012where
13 S: Default,
14 F: Fn(&mut S, &types::Node, &types::Definitions),
15{
16 let mut state = S::default();
17 for s in &defs.types {
David Tolnay2fb3d482019-05-08 16:22:10 -070018 node(&mut state, s, defs);
David Tolnay1e99fa32019-05-08 16:18:36 -070019 }
20 for tt in TERMINAL_TYPES {
21 let s = types::Node {
22 ident: tt.to_string(),
23 features: types::Features::default(),
24 data: types::Data::Private,
25 };
David Tolnay2fb3d482019-05-08 16:22:10 -070026 node(&mut state, &s, defs);
David Tolnay1e99fa32019-05-08 16:18:36 -070027 }
28 state
29}