()
| 18 | } |
| 19 | |
| 20 | fn main() { |
| 21 | println!("cargo::rerun-if-changed=build.rs"); |
| 22 | |
| 23 | // Find all visitable nodes (for Visit trait) |
| 24 | let mut all_visitable = HashSet::<_>::new(); |
| 25 | find_visitable_nodes("src/**/*.rs", &mut all_visitable, |path: &PathBuf| { |
| 26 | println!("cargo::rerun-if-changed={}", path.display()); |
| 27 | }); |
| 28 | |
| 29 | // Find only queryable nodes (for NodeId enum and QueryableNode trait) |
| 30 | let mut queryable = HashSet::<_>::new(); |
| 31 | find_queryable_nodes("src/**/*.rs", &mut queryable, |_| {}); |
| 32 | |
| 33 | // NodeId enum - only queryable types |
| 34 | { |
| 35 | let variants = queryable.iter().enumerate().map(|(idx, node)| { |
| 36 | let ident = node.ident(); |
| 37 | let discriminant = idx as isize; |
| 38 | quote! { #ident = #discriminant } |
| 39 | }); |
| 40 | |
| 41 | let tag_name_cases = queryable.iter().map(|node| { |
| 42 | let ident = node.ident(); |
| 43 | let tag_name = ident.to_string().to_kebab_case(); |
| 44 | quote! { Self::#ident => #tag_name } |
| 45 | }); |
| 46 | |
| 47 | let from_tag_name_cases = queryable.iter().map(|node| { |
| 48 | let ident = node.ident(); |
| 49 | let tag_name = ident.to_string().to_kebab_case(); |
| 50 | quote! { #tag_name => Some(Self::#ident) } |
| 51 | }); |
| 52 | |
| 53 | let all_tags = queryable.iter().map(|node| { |
| 54 | let ident = node.ident(); |
| 55 | quote! { Self::#ident } |
| 56 | }); |
| 57 | |
| 58 | let display_arms = queryable.iter().map(|node| { |
| 59 | let ident = node.ident(); |
| 60 | let ident_str = ident.to_string(); |
| 61 | quote! { Self::#ident => write!(f, #ident_str) } |
| 62 | }); |
| 63 | |
| 64 | #[rustfmt::skip] |
| 65 | let source = quote! { |
| 66 | /// Unique identifier for each AST node type that can be queried. |
| 67 | /// |
| 68 | /// This enum is automatically generated from types that derive `Visitable` |
| 69 | /// and have `#[visit]`, `#[visit(self)]`, or `#[visit(all)]` attributes. |
| 70 | /// Each variant has a unique discriminant value assigned at build time. |
| 71 | #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] |
| 72 | #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] |
| 73 | pub enum NodeId { |
| 74 | #(#variants),* |
| 75 | } |
| 76 | |
| 77 | impl std::fmt::Display for NodeId { |
nothing calls this directly
no test coverage detected