MCPcopy Create free account
hub / github.com/carllerche/assert-struct / generate_pattern_nodes

Function generate_pattern_nodes

assert-struct-macros/src/expand/nodes.rs:22–375  ·  view source on GitHub ↗

Generate pattern nodes using the IDs already in patterns

(
    pattern: &Pattern,
    node_defs: &mut Vec<(usize, TokenStream)>,
    parent_ident: Option<&Ident>,
)

Source from the content-addressed store, hash-verified

20
21/// Generate pattern nodes using the IDs already in patterns
22pub(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 }

Callers 1

expandFunction · 0.85

Calls 4

locationMethod · 0.80
is_emptyMethod · 0.80
root_field_nameMethod · 0.80
pushMethod · 0.80

Tested by

no test coverage detected