Generate pattern nodes using the IDs already in patterns
(
pattern: &Pattern,
node_defs: &mut Vec<(usize, TokenStream)>,
parent_ident: Option<&Ident>,
)
| 20 | |
| 21 | /// Generate pattern nodes using the IDs already in patterns |
| 22 | pub(super) fn generate_pattern_nodes( |
| 23 | pattern: &Pattern, |
| 24 | node_defs: &mut Vec<(usize, TokenStream)>, |
| 25 | parent_ident: Option<&Ident>, |
| 26 | ) -> TokenStream { |
| 27 | // Get the node_id from the pattern itself |
| 28 | let node_id = match pattern { |
| 29 | Pattern::Simple(PatternSimple { node_id, .. }) |
| 30 | | Pattern::String(PatternString { node_id, .. }) |
| 31 | | Pattern::Struct(PatternStruct { node_id, .. }) |
| 32 | | Pattern::Enum(PatternEnum { node_id, .. }) |
| 33 | | Pattern::Tuple(PatternTuple { node_id, .. }) |
| 34 | | Pattern::Slice(PatternSlice { node_id, .. }) |
| 35 | | Pattern::Comparison(PatternComparison { node_id, .. }) |
| 36 | | Pattern::Range(PatternRange { node_id, .. }) |
| 37 | | Pattern::Wildcard(PatternWildcard { node_id }) |
| 38 | | Pattern::Closure(PatternClosure { node_id, .. }) |
| 39 | | Pattern::Map(PatternMap { node_id, .. }) |
| 40 | | Pattern::Set(PatternSet { node_id, .. }) => *node_id, |
| 41 | #[cfg(feature = "regex")] |
| 42 | Pattern::Regex(PatternRegex { node_id, .. }) |
| 43 | | Pattern::Like(PatternLike { node_id, .. }) => *node_id, |
| 44 | }; |
| 45 | |
| 46 | // Rest elements inside slice patterns (usize::MAX node_id) are not meaningful |
| 47 | // for error reporting — they contribute only the `rest: bool` flag on the |
| 48 | // parent Slice node, not a child PatternNode constant of their own. |
| 49 | if node_id == usize::MAX { |
| 50 | return quote! {}; |
| 51 | } |
| 52 | |
| 53 | let node_ident = Ident::new(&format!("__PATTERN_NODE_{}", node_id), Span::call_site()); |
| 54 | |
| 55 | let (line_start, col_start, line_end, col_end) = pattern.location(); |
| 56 | |
| 57 | // Generate parent reference |
| 58 | let parent_ref = if let Some(parent) = parent_ident { |
| 59 | quote! { Some(&#parent) } |
| 60 | } else { |
| 61 | quote! { None } |
| 62 | }; |
| 63 | |
| 64 | let node_def = match pattern { |
| 65 | Pattern::Simple(PatternSimple { expr, .. }) => { |
| 66 | let value_str = quote! { #expr }.to_string(); |
| 67 | quote! { |
| 68 | ::assert_struct::__macro_support::PatternNode { |
| 69 | kind: ::assert_struct::__macro_support::NodeKind::Simple { |
| 70 | value: #value_str, |
| 71 | }, |
| 72 | parent: #parent_ref, |
| 73 | line_start: #line_start, |
| 74 | col_start: #col_start, |
| 75 | line_end: #line_end, |
| 76 | col_end: #col_end, |
| 77 | } |
| 78 | } |
| 79 | } |
no test coverage detected