Skip to main content

ruby_prism/home/runner/work/prism/prism/doc/rust/debug/build/ruby-prism-3ef730727810cf78/out/
bindings.rs

1
2use std::marker::PhantomData;
3
4#[allow(clippy::wildcard_imports)]
5use ruby_prism_sys::*;
6use crate::{ConstantId, ConstantList, Integer, Location, NodeList};
7const PM_ALIAS_GLOBAL_VARIABLE_NODE: u16 = pm_node_type::PM_ALIAS_GLOBAL_VARIABLE_NODE as u16;
8const PM_ALIAS_METHOD_NODE: u16 = pm_node_type::PM_ALIAS_METHOD_NODE as u16;
9const PM_ALTERNATION_PATTERN_NODE: u16 = pm_node_type::PM_ALTERNATION_PATTERN_NODE as u16;
10const PM_AND_NODE: u16 = pm_node_type::PM_AND_NODE as u16;
11const PM_ARGUMENTS_NODE: u16 = pm_node_type::PM_ARGUMENTS_NODE as u16;
12const PM_ARRAY_NODE: u16 = pm_node_type::PM_ARRAY_NODE as u16;
13const PM_ARRAY_PATTERN_NODE: u16 = pm_node_type::PM_ARRAY_PATTERN_NODE as u16;
14const PM_ASSOC_NODE: u16 = pm_node_type::PM_ASSOC_NODE as u16;
15const PM_ASSOC_SPLAT_NODE: u16 = pm_node_type::PM_ASSOC_SPLAT_NODE as u16;
16const PM_BACK_REFERENCE_READ_NODE: u16 = pm_node_type::PM_BACK_REFERENCE_READ_NODE as u16;
17const PM_BEGIN_NODE: u16 = pm_node_type::PM_BEGIN_NODE as u16;
18const PM_BLOCK_ARGUMENT_NODE: u16 = pm_node_type::PM_BLOCK_ARGUMENT_NODE as u16;
19const PM_BLOCK_LOCAL_VARIABLE_NODE: u16 = pm_node_type::PM_BLOCK_LOCAL_VARIABLE_NODE as u16;
20const PM_BLOCK_NODE: u16 = pm_node_type::PM_BLOCK_NODE as u16;
21const PM_BLOCK_PARAMETER_NODE: u16 = pm_node_type::PM_BLOCK_PARAMETER_NODE as u16;
22const PM_BLOCK_PARAMETERS_NODE: u16 = pm_node_type::PM_BLOCK_PARAMETERS_NODE as u16;
23const PM_BREAK_NODE: u16 = pm_node_type::PM_BREAK_NODE as u16;
24const PM_CALL_AND_WRITE_NODE: u16 = pm_node_type::PM_CALL_AND_WRITE_NODE as u16;
25const PM_CALL_NODE: u16 = pm_node_type::PM_CALL_NODE as u16;
26const PM_CALL_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_CALL_OPERATOR_WRITE_NODE as u16;
27const PM_CALL_OR_WRITE_NODE: u16 = pm_node_type::PM_CALL_OR_WRITE_NODE as u16;
28const PM_CALL_TARGET_NODE: u16 = pm_node_type::PM_CALL_TARGET_NODE as u16;
29const PM_CAPTURE_PATTERN_NODE: u16 = pm_node_type::PM_CAPTURE_PATTERN_NODE as u16;
30const PM_CASE_MATCH_NODE: u16 = pm_node_type::PM_CASE_MATCH_NODE as u16;
31const PM_CASE_NODE: u16 = pm_node_type::PM_CASE_NODE as u16;
32const PM_CLASS_NODE: u16 = pm_node_type::PM_CLASS_NODE as u16;
33const PM_CLASS_VARIABLE_AND_WRITE_NODE: u16 = pm_node_type::PM_CLASS_VARIABLE_AND_WRITE_NODE as u16;
34const PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE as u16;
35const PM_CLASS_VARIABLE_OR_WRITE_NODE: u16 = pm_node_type::PM_CLASS_VARIABLE_OR_WRITE_NODE as u16;
36const PM_CLASS_VARIABLE_READ_NODE: u16 = pm_node_type::PM_CLASS_VARIABLE_READ_NODE as u16;
37const PM_CLASS_VARIABLE_TARGET_NODE: u16 = pm_node_type::PM_CLASS_VARIABLE_TARGET_NODE as u16;
38const PM_CLASS_VARIABLE_WRITE_NODE: u16 = pm_node_type::PM_CLASS_VARIABLE_WRITE_NODE as u16;
39const PM_CONSTANT_AND_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_AND_WRITE_NODE as u16;
40const PM_CONSTANT_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_OPERATOR_WRITE_NODE as u16;
41const PM_CONSTANT_OR_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_OR_WRITE_NODE as u16;
42const PM_CONSTANT_PATH_AND_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_PATH_AND_WRITE_NODE as u16;
43const PM_CONSTANT_PATH_NODE: u16 = pm_node_type::PM_CONSTANT_PATH_NODE as u16;
44const PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_PATH_OPERATOR_WRITE_NODE as u16;
45const PM_CONSTANT_PATH_OR_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_PATH_OR_WRITE_NODE as u16;
46const PM_CONSTANT_PATH_TARGET_NODE: u16 = pm_node_type::PM_CONSTANT_PATH_TARGET_NODE as u16;
47const PM_CONSTANT_PATH_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_PATH_WRITE_NODE as u16;
48const PM_CONSTANT_READ_NODE: u16 = pm_node_type::PM_CONSTANT_READ_NODE as u16;
49const PM_CONSTANT_TARGET_NODE: u16 = pm_node_type::PM_CONSTANT_TARGET_NODE as u16;
50const PM_CONSTANT_WRITE_NODE: u16 = pm_node_type::PM_CONSTANT_WRITE_NODE as u16;
51const PM_DEF_NODE: u16 = pm_node_type::PM_DEF_NODE as u16;
52const PM_DEFINED_NODE: u16 = pm_node_type::PM_DEFINED_NODE as u16;
53const PM_ELSE_NODE: u16 = pm_node_type::PM_ELSE_NODE as u16;
54const PM_EMBEDDED_STATEMENTS_NODE: u16 = pm_node_type::PM_EMBEDDED_STATEMENTS_NODE as u16;
55const PM_EMBEDDED_VARIABLE_NODE: u16 = pm_node_type::PM_EMBEDDED_VARIABLE_NODE as u16;
56const PM_ENSURE_NODE: u16 = pm_node_type::PM_ENSURE_NODE as u16;
57const PM_ERROR_RECOVERY_NODE: u16 = pm_node_type::PM_ERROR_RECOVERY_NODE as u16;
58const PM_FALSE_NODE: u16 = pm_node_type::PM_FALSE_NODE as u16;
59const PM_FIND_PATTERN_NODE: u16 = pm_node_type::PM_FIND_PATTERN_NODE as u16;
60const PM_FLIP_FLOP_NODE: u16 = pm_node_type::PM_FLIP_FLOP_NODE as u16;
61const PM_FLOAT_NODE: u16 = pm_node_type::PM_FLOAT_NODE as u16;
62const PM_FOR_NODE: u16 = pm_node_type::PM_FOR_NODE as u16;
63const PM_FORWARDING_ARGUMENTS_NODE: u16 = pm_node_type::PM_FORWARDING_ARGUMENTS_NODE as u16;
64const PM_FORWARDING_PARAMETER_NODE: u16 = pm_node_type::PM_FORWARDING_PARAMETER_NODE as u16;
65const PM_FORWARDING_SUPER_NODE: u16 = pm_node_type::PM_FORWARDING_SUPER_NODE as u16;
66const PM_GLOBAL_VARIABLE_AND_WRITE_NODE: u16 = pm_node_type::PM_GLOBAL_VARIABLE_AND_WRITE_NODE as u16;
67const PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE as u16;
68const PM_GLOBAL_VARIABLE_OR_WRITE_NODE: u16 = pm_node_type::PM_GLOBAL_VARIABLE_OR_WRITE_NODE as u16;
69const PM_GLOBAL_VARIABLE_READ_NODE: u16 = pm_node_type::PM_GLOBAL_VARIABLE_READ_NODE as u16;
70const PM_GLOBAL_VARIABLE_TARGET_NODE: u16 = pm_node_type::PM_GLOBAL_VARIABLE_TARGET_NODE as u16;
71const PM_GLOBAL_VARIABLE_WRITE_NODE: u16 = pm_node_type::PM_GLOBAL_VARIABLE_WRITE_NODE as u16;
72const PM_HASH_NODE: u16 = pm_node_type::PM_HASH_NODE as u16;
73const PM_HASH_PATTERN_NODE: u16 = pm_node_type::PM_HASH_PATTERN_NODE as u16;
74const PM_IF_NODE: u16 = pm_node_type::PM_IF_NODE as u16;
75const PM_IMAGINARY_NODE: u16 = pm_node_type::PM_IMAGINARY_NODE as u16;
76const PM_IMPLICIT_NODE: u16 = pm_node_type::PM_IMPLICIT_NODE as u16;
77const PM_IMPLICIT_REST_NODE: u16 = pm_node_type::PM_IMPLICIT_REST_NODE as u16;
78const PM_IN_NODE: u16 = pm_node_type::PM_IN_NODE as u16;
79const PM_INDEX_AND_WRITE_NODE: u16 = pm_node_type::PM_INDEX_AND_WRITE_NODE as u16;
80const PM_INDEX_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_INDEX_OPERATOR_WRITE_NODE as u16;
81const PM_INDEX_OR_WRITE_NODE: u16 = pm_node_type::PM_INDEX_OR_WRITE_NODE as u16;
82const PM_INDEX_TARGET_NODE: u16 = pm_node_type::PM_INDEX_TARGET_NODE as u16;
83const PM_INSTANCE_VARIABLE_AND_WRITE_NODE: u16 = pm_node_type::PM_INSTANCE_VARIABLE_AND_WRITE_NODE as u16;
84const PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE as u16;
85const PM_INSTANCE_VARIABLE_OR_WRITE_NODE: u16 = pm_node_type::PM_INSTANCE_VARIABLE_OR_WRITE_NODE as u16;
86const PM_INSTANCE_VARIABLE_READ_NODE: u16 = pm_node_type::PM_INSTANCE_VARIABLE_READ_NODE as u16;
87const PM_INSTANCE_VARIABLE_TARGET_NODE: u16 = pm_node_type::PM_INSTANCE_VARIABLE_TARGET_NODE as u16;
88const PM_INSTANCE_VARIABLE_WRITE_NODE: u16 = pm_node_type::PM_INSTANCE_VARIABLE_WRITE_NODE as u16;
89const PM_INTEGER_NODE: u16 = pm_node_type::PM_INTEGER_NODE as u16;
90const PM_INTERPOLATED_MATCH_LAST_LINE_NODE: u16 = pm_node_type::PM_INTERPOLATED_MATCH_LAST_LINE_NODE as u16;
91const PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: u16 = pm_node_type::PM_INTERPOLATED_REGULAR_EXPRESSION_NODE as u16;
92const PM_INTERPOLATED_STRING_NODE: u16 = pm_node_type::PM_INTERPOLATED_STRING_NODE as u16;
93const PM_INTERPOLATED_SYMBOL_NODE: u16 = pm_node_type::PM_INTERPOLATED_SYMBOL_NODE as u16;
94const PM_INTERPOLATED_X_STRING_NODE: u16 = pm_node_type::PM_INTERPOLATED_X_STRING_NODE as u16;
95const PM_IT_LOCAL_VARIABLE_READ_NODE: u16 = pm_node_type::PM_IT_LOCAL_VARIABLE_READ_NODE as u16;
96const PM_IT_PARAMETERS_NODE: u16 = pm_node_type::PM_IT_PARAMETERS_NODE as u16;
97const PM_KEYWORD_HASH_NODE: u16 = pm_node_type::PM_KEYWORD_HASH_NODE as u16;
98const PM_KEYWORD_REST_PARAMETER_NODE: u16 = pm_node_type::PM_KEYWORD_REST_PARAMETER_NODE as u16;
99const PM_LAMBDA_NODE: u16 = pm_node_type::PM_LAMBDA_NODE as u16;
100const PM_LOCAL_VARIABLE_AND_WRITE_NODE: u16 = pm_node_type::PM_LOCAL_VARIABLE_AND_WRITE_NODE as u16;
101const PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: u16 = pm_node_type::PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE as u16;
102const PM_LOCAL_VARIABLE_OR_WRITE_NODE: u16 = pm_node_type::PM_LOCAL_VARIABLE_OR_WRITE_NODE as u16;
103const PM_LOCAL_VARIABLE_READ_NODE: u16 = pm_node_type::PM_LOCAL_VARIABLE_READ_NODE as u16;
104const PM_LOCAL_VARIABLE_TARGET_NODE: u16 = pm_node_type::PM_LOCAL_VARIABLE_TARGET_NODE as u16;
105const PM_LOCAL_VARIABLE_WRITE_NODE: u16 = pm_node_type::PM_LOCAL_VARIABLE_WRITE_NODE as u16;
106const PM_MATCH_LAST_LINE_NODE: u16 = pm_node_type::PM_MATCH_LAST_LINE_NODE as u16;
107const PM_MATCH_PREDICATE_NODE: u16 = pm_node_type::PM_MATCH_PREDICATE_NODE as u16;
108const PM_MATCH_REQUIRED_NODE: u16 = pm_node_type::PM_MATCH_REQUIRED_NODE as u16;
109const PM_MATCH_WRITE_NODE: u16 = pm_node_type::PM_MATCH_WRITE_NODE as u16;
110const PM_MODULE_NODE: u16 = pm_node_type::PM_MODULE_NODE as u16;
111const PM_MULTI_TARGET_NODE: u16 = pm_node_type::PM_MULTI_TARGET_NODE as u16;
112const PM_MULTI_WRITE_NODE: u16 = pm_node_type::PM_MULTI_WRITE_NODE as u16;
113const PM_NEXT_NODE: u16 = pm_node_type::PM_NEXT_NODE as u16;
114const PM_NIL_NODE: u16 = pm_node_type::PM_NIL_NODE as u16;
115const PM_NO_BLOCK_PARAMETER_NODE: u16 = pm_node_type::PM_NO_BLOCK_PARAMETER_NODE as u16;
116const PM_NO_KEYWORDS_PARAMETER_NODE: u16 = pm_node_type::PM_NO_KEYWORDS_PARAMETER_NODE as u16;
117const PM_NUMBERED_PARAMETERS_NODE: u16 = pm_node_type::PM_NUMBERED_PARAMETERS_NODE as u16;
118const PM_NUMBERED_REFERENCE_READ_NODE: u16 = pm_node_type::PM_NUMBERED_REFERENCE_READ_NODE as u16;
119const PM_OPTIONAL_KEYWORD_PARAMETER_NODE: u16 = pm_node_type::PM_OPTIONAL_KEYWORD_PARAMETER_NODE as u16;
120const PM_OPTIONAL_PARAMETER_NODE: u16 = pm_node_type::PM_OPTIONAL_PARAMETER_NODE as u16;
121const PM_OR_NODE: u16 = pm_node_type::PM_OR_NODE as u16;
122const PM_PARAMETERS_NODE: u16 = pm_node_type::PM_PARAMETERS_NODE as u16;
123const PM_PARENTHESES_NODE: u16 = pm_node_type::PM_PARENTHESES_NODE as u16;
124const PM_PINNED_EXPRESSION_NODE: u16 = pm_node_type::PM_PINNED_EXPRESSION_NODE as u16;
125const PM_PINNED_VARIABLE_NODE: u16 = pm_node_type::PM_PINNED_VARIABLE_NODE as u16;
126const PM_POST_EXECUTION_NODE: u16 = pm_node_type::PM_POST_EXECUTION_NODE as u16;
127const PM_PRE_EXECUTION_NODE: u16 = pm_node_type::PM_PRE_EXECUTION_NODE as u16;
128const PM_PROGRAM_NODE: u16 = pm_node_type::PM_PROGRAM_NODE as u16;
129const PM_RANGE_NODE: u16 = pm_node_type::PM_RANGE_NODE as u16;
130const PM_RATIONAL_NODE: u16 = pm_node_type::PM_RATIONAL_NODE as u16;
131const PM_REDO_NODE: u16 = pm_node_type::PM_REDO_NODE as u16;
132const PM_REGULAR_EXPRESSION_NODE: u16 = pm_node_type::PM_REGULAR_EXPRESSION_NODE as u16;
133const PM_REQUIRED_KEYWORD_PARAMETER_NODE: u16 = pm_node_type::PM_REQUIRED_KEYWORD_PARAMETER_NODE as u16;
134const PM_REQUIRED_PARAMETER_NODE: u16 = pm_node_type::PM_REQUIRED_PARAMETER_NODE as u16;
135const PM_RESCUE_MODIFIER_NODE: u16 = pm_node_type::PM_RESCUE_MODIFIER_NODE as u16;
136const PM_RESCUE_NODE: u16 = pm_node_type::PM_RESCUE_NODE as u16;
137const PM_REST_PARAMETER_NODE: u16 = pm_node_type::PM_REST_PARAMETER_NODE as u16;
138const PM_RETRY_NODE: u16 = pm_node_type::PM_RETRY_NODE as u16;
139const PM_RETURN_NODE: u16 = pm_node_type::PM_RETURN_NODE as u16;
140const PM_SELF_NODE: u16 = pm_node_type::PM_SELF_NODE as u16;
141const PM_SHAREABLE_CONSTANT_NODE: u16 = pm_node_type::PM_SHAREABLE_CONSTANT_NODE as u16;
142const PM_SINGLETON_CLASS_NODE: u16 = pm_node_type::PM_SINGLETON_CLASS_NODE as u16;
143const PM_SOURCE_ENCODING_NODE: u16 = pm_node_type::PM_SOURCE_ENCODING_NODE as u16;
144const PM_SOURCE_FILE_NODE: u16 = pm_node_type::PM_SOURCE_FILE_NODE as u16;
145const PM_SOURCE_LINE_NODE: u16 = pm_node_type::PM_SOURCE_LINE_NODE as u16;
146const PM_SPLAT_NODE: u16 = pm_node_type::PM_SPLAT_NODE as u16;
147const PM_STATEMENTS_NODE: u16 = pm_node_type::PM_STATEMENTS_NODE as u16;
148const PM_STRING_NODE: u16 = pm_node_type::PM_STRING_NODE as u16;
149const PM_SUPER_NODE: u16 = pm_node_type::PM_SUPER_NODE as u16;
150const PM_SYMBOL_NODE: u16 = pm_node_type::PM_SYMBOL_NODE as u16;
151const PM_TRUE_NODE: u16 = pm_node_type::PM_TRUE_NODE as u16;
152const PM_UNDEF_NODE: u16 = pm_node_type::PM_UNDEF_NODE as u16;
153const PM_UNLESS_NODE: u16 = pm_node_type::PM_UNLESS_NODE as u16;
154const PM_UNTIL_NODE: u16 = pm_node_type::PM_UNTIL_NODE as u16;
155const PM_WHEN_NODE: u16 = pm_node_type::PM_WHEN_NODE as u16;
156const PM_WHILE_NODE: u16 = pm_node_type::PM_WHILE_NODE as u16;
157const PM_X_STRING_NODE: u16 = pm_node_type::PM_X_STRING_NODE as u16;
158const PM_YIELD_NODE: u16 = pm_node_type::PM_YIELD_NODE as u16;
159
160const PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING: u16 = pm_arguments_node_flags::PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING as u16;
161const PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS: u16 = pm_arguments_node_flags::PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS as u16;
162const PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT: u16 = pm_arguments_node_flags::PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT as u16;
163const PM_ARGUMENTS_NODE_FLAGS_CONTAINS_SPLAT: u16 = pm_arguments_node_flags::PM_ARGUMENTS_NODE_FLAGS_CONTAINS_SPLAT as u16;
164const PM_ARGUMENTS_NODE_FLAGS_CONTAINS_MULTIPLE_SPLATS: u16 = pm_arguments_node_flags::PM_ARGUMENTS_NODE_FLAGS_CONTAINS_MULTIPLE_SPLATS as u16;
165const PM_ARRAY_NODE_FLAGS_CONTAINS_SPLAT: u16 = pm_array_node_flags::PM_ARRAY_NODE_FLAGS_CONTAINS_SPLAT as u16;
166const PM_CALL_NODE_FLAGS_SAFE_NAVIGATION: u16 = pm_call_node_flags::PM_CALL_NODE_FLAGS_SAFE_NAVIGATION as u16;
167const PM_CALL_NODE_FLAGS_VARIABLE_CALL: u16 = pm_call_node_flags::PM_CALL_NODE_FLAGS_VARIABLE_CALL as u16;
168const PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE: u16 = pm_call_node_flags::PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE as u16;
169const PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY: u16 = pm_call_node_flags::PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY as u16;
170const PM_ENCODING_FLAGS_FORCED_UTF8_ENCODING: u16 = pm_encoding_flags::PM_ENCODING_FLAGS_FORCED_UTF8_ENCODING as u16;
171const PM_ENCODING_FLAGS_FORCED_BINARY_ENCODING: u16 = pm_encoding_flags::PM_ENCODING_FLAGS_FORCED_BINARY_ENCODING as u16;
172const PM_INTEGER_BASE_FLAGS_BINARY: u16 = pm_integer_base_flags::PM_INTEGER_BASE_FLAGS_BINARY as u16;
173const PM_INTEGER_BASE_FLAGS_DECIMAL: u16 = pm_integer_base_flags::PM_INTEGER_BASE_FLAGS_DECIMAL as u16;
174const PM_INTEGER_BASE_FLAGS_OCTAL: u16 = pm_integer_base_flags::PM_INTEGER_BASE_FLAGS_OCTAL as u16;
175const PM_INTEGER_BASE_FLAGS_HEXADECIMAL: u16 = pm_integer_base_flags::PM_INTEGER_BASE_FLAGS_HEXADECIMAL as u16;
176const PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN: u16 = pm_interpolated_string_node_flags::PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN as u16;
177const PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE: u16 = pm_interpolated_string_node_flags::PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE as u16;
178const PM_KEYWORD_HASH_NODE_FLAGS_SYMBOL_KEYS: u16 = pm_keyword_hash_node_flags::PM_KEYWORD_HASH_NODE_FLAGS_SYMBOL_KEYS as u16;
179const PM_LOOP_FLAGS_BEGIN_MODIFIER: u16 = pm_loop_flags::PM_LOOP_FLAGS_BEGIN_MODIFIER as u16;
180const PM_PARAMETER_FLAGS_REPEATED_PARAMETER: u16 = pm_parameter_flags::PM_PARAMETER_FLAGS_REPEATED_PARAMETER as u16;
181const PM_PARENTHESES_NODE_FLAGS_MULTIPLE_STATEMENTS: u16 = pm_parentheses_node_flags::PM_PARENTHESES_NODE_FLAGS_MULTIPLE_STATEMENTS as u16;
182const PM_RANGE_FLAGS_EXCLUDE_END: u16 = pm_range_flags::PM_RANGE_FLAGS_EXCLUDE_END as u16;
183const PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE as u16;
184const PM_REGULAR_EXPRESSION_FLAGS_EXTENDED: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_EXTENDED as u16;
185const PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE as u16;
186const PM_REGULAR_EXPRESSION_FLAGS_ONCE: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_ONCE as u16;
187const PM_REGULAR_EXPRESSION_FLAGS_EUC_JP: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_EUC_JP as u16;
188const PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT as u16;
189const PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J as u16;
190const PM_REGULAR_EXPRESSION_FLAGS_UTF_8: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_UTF_8 as u16;
191const PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING as u16;
192const PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING as u16;
193const PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING: u16 = pm_regular_expression_flags::PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING as u16;
194const PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL: u16 = pm_shareable_constant_node_flags::PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL as u16;
195const PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING: u16 = pm_shareable_constant_node_flags::PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING as u16;
196const PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY: u16 = pm_shareable_constant_node_flags::PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY as u16;
197const PM_STRING_FLAGS_FORCED_UTF8_ENCODING: u16 = pm_string_flags::PM_STRING_FLAGS_FORCED_UTF8_ENCODING as u16;
198const PM_STRING_FLAGS_FORCED_BINARY_ENCODING: u16 = pm_string_flags::PM_STRING_FLAGS_FORCED_BINARY_ENCODING as u16;
199const PM_STRING_FLAGS_FROZEN: u16 = pm_string_flags::PM_STRING_FLAGS_FROZEN as u16;
200const PM_STRING_FLAGS_MUTABLE: u16 = pm_string_flags::PM_STRING_FLAGS_MUTABLE as u16;
201const PM_SYMBOL_FLAGS_FORCED_UTF8_ENCODING: u16 = pm_symbol_flags::PM_SYMBOL_FLAGS_FORCED_UTF8_ENCODING as u16;
202const PM_SYMBOL_FLAGS_FORCED_BINARY_ENCODING: u16 = pm_symbol_flags::PM_SYMBOL_FLAGS_FORCED_BINARY_ENCODING as u16;
203const PM_SYMBOL_FLAGS_FORCED_US_ASCII_ENCODING: u16 = pm_symbol_flags::PM_SYMBOL_FLAGS_FORCED_US_ASCII_ENCODING as u16;
204
205/// An enum representing the different kinds of nodes that can be parsed.
206pub enum Node<'pr> {
207    /// The `AliasGlobalVariableNode` node
208    AliasGlobalVariableNode {
209        /// The pointer to the associated parser this node came from.
210        parser: *const pm_parser_t,
211
212        /// The raw pointer to the node allocated by prism.
213        pointer: *mut pm_alias_global_variable_node_t,
214
215        /// The marker to indicate the lifetime of the pointer.
216        marker: PhantomData<&'pr mut pm_alias_global_variable_node_t>
217    },
218    /// The `AliasMethodNode` node
219    AliasMethodNode {
220        /// The pointer to the associated parser this node came from.
221        parser: *const pm_parser_t,
222
223        /// The raw pointer to the node allocated by prism.
224        pointer: *mut pm_alias_method_node_t,
225
226        /// The marker to indicate the lifetime of the pointer.
227        marker: PhantomData<&'pr mut pm_alias_method_node_t>
228    },
229    /// The `AlternationPatternNode` node
230    AlternationPatternNode {
231        /// The pointer to the associated parser this node came from.
232        parser: *const pm_parser_t,
233
234        /// The raw pointer to the node allocated by prism.
235        pointer: *mut pm_alternation_pattern_node_t,
236
237        /// The marker to indicate the lifetime of the pointer.
238        marker: PhantomData<&'pr mut pm_alternation_pattern_node_t>
239    },
240    /// The `AndNode` node
241    AndNode {
242        /// The pointer to the associated parser this node came from.
243        parser: *const pm_parser_t,
244
245        /// The raw pointer to the node allocated by prism.
246        pointer: *mut pm_and_node_t,
247
248        /// The marker to indicate the lifetime of the pointer.
249        marker: PhantomData<&'pr mut pm_and_node_t>
250    },
251    /// The `ArgumentsNode` node
252    ArgumentsNode {
253        /// The pointer to the associated parser this node came from.
254        parser: *const pm_parser_t,
255
256        /// The raw pointer to the node allocated by prism.
257        pointer: *mut pm_arguments_node_t,
258
259        /// The marker to indicate the lifetime of the pointer.
260        marker: PhantomData<&'pr mut pm_arguments_node_t>
261    },
262    /// The `ArrayNode` node
263    ArrayNode {
264        /// The pointer to the associated parser this node came from.
265        parser: *const pm_parser_t,
266
267        /// The raw pointer to the node allocated by prism.
268        pointer: *mut pm_array_node_t,
269
270        /// The marker to indicate the lifetime of the pointer.
271        marker: PhantomData<&'pr mut pm_array_node_t>
272    },
273    /// The `ArrayPatternNode` node
274    ArrayPatternNode {
275        /// The pointer to the associated parser this node came from.
276        parser: *const pm_parser_t,
277
278        /// The raw pointer to the node allocated by prism.
279        pointer: *mut pm_array_pattern_node_t,
280
281        /// The marker to indicate the lifetime of the pointer.
282        marker: PhantomData<&'pr mut pm_array_pattern_node_t>
283    },
284    /// The `AssocNode` node
285    AssocNode {
286        /// The pointer to the associated parser this node came from.
287        parser: *const pm_parser_t,
288
289        /// The raw pointer to the node allocated by prism.
290        pointer: *mut pm_assoc_node_t,
291
292        /// The marker to indicate the lifetime of the pointer.
293        marker: PhantomData<&'pr mut pm_assoc_node_t>
294    },
295    /// The `AssocSplatNode` node
296    AssocSplatNode {
297        /// The pointer to the associated parser this node came from.
298        parser: *const pm_parser_t,
299
300        /// The raw pointer to the node allocated by prism.
301        pointer: *mut pm_assoc_splat_node_t,
302
303        /// The marker to indicate the lifetime of the pointer.
304        marker: PhantomData<&'pr mut pm_assoc_splat_node_t>
305    },
306    /// The `BackReferenceReadNode` node
307    BackReferenceReadNode {
308        /// The pointer to the associated parser this node came from.
309        parser: *const pm_parser_t,
310
311        /// The raw pointer to the node allocated by prism.
312        pointer: *mut pm_back_reference_read_node_t,
313
314        /// The marker to indicate the lifetime of the pointer.
315        marker: PhantomData<&'pr mut pm_back_reference_read_node_t>
316    },
317    /// The `BeginNode` node
318    BeginNode {
319        /// The pointer to the associated parser this node came from.
320        parser: *const pm_parser_t,
321
322        /// The raw pointer to the node allocated by prism.
323        pointer: *mut pm_begin_node_t,
324
325        /// The marker to indicate the lifetime of the pointer.
326        marker: PhantomData<&'pr mut pm_begin_node_t>
327    },
328    /// The `BlockArgumentNode` node
329    BlockArgumentNode {
330        /// The pointer to the associated parser this node came from.
331        parser: *const pm_parser_t,
332
333        /// The raw pointer to the node allocated by prism.
334        pointer: *mut pm_block_argument_node_t,
335
336        /// The marker to indicate the lifetime of the pointer.
337        marker: PhantomData<&'pr mut pm_block_argument_node_t>
338    },
339    /// The `BlockLocalVariableNode` node
340    BlockLocalVariableNode {
341        /// The pointer to the associated parser this node came from.
342        parser: *const pm_parser_t,
343
344        /// The raw pointer to the node allocated by prism.
345        pointer: *mut pm_block_local_variable_node_t,
346
347        /// The marker to indicate the lifetime of the pointer.
348        marker: PhantomData<&'pr mut pm_block_local_variable_node_t>
349    },
350    /// The `BlockNode` node
351    BlockNode {
352        /// The pointer to the associated parser this node came from.
353        parser: *const pm_parser_t,
354
355        /// The raw pointer to the node allocated by prism.
356        pointer: *mut pm_block_node_t,
357
358        /// The marker to indicate the lifetime of the pointer.
359        marker: PhantomData<&'pr mut pm_block_node_t>
360    },
361    /// The `BlockParameterNode` node
362    BlockParameterNode {
363        /// The pointer to the associated parser this node came from.
364        parser: *const pm_parser_t,
365
366        /// The raw pointer to the node allocated by prism.
367        pointer: *mut pm_block_parameter_node_t,
368
369        /// The marker to indicate the lifetime of the pointer.
370        marker: PhantomData<&'pr mut pm_block_parameter_node_t>
371    },
372    /// The `BlockParametersNode` node
373    BlockParametersNode {
374        /// The pointer to the associated parser this node came from.
375        parser: *const pm_parser_t,
376
377        /// The raw pointer to the node allocated by prism.
378        pointer: *mut pm_block_parameters_node_t,
379
380        /// The marker to indicate the lifetime of the pointer.
381        marker: PhantomData<&'pr mut pm_block_parameters_node_t>
382    },
383    /// The `BreakNode` node
384    BreakNode {
385        /// The pointer to the associated parser this node came from.
386        parser: *const pm_parser_t,
387
388        /// The raw pointer to the node allocated by prism.
389        pointer: *mut pm_break_node_t,
390
391        /// The marker to indicate the lifetime of the pointer.
392        marker: PhantomData<&'pr mut pm_break_node_t>
393    },
394    /// The `CallAndWriteNode` node
395    CallAndWriteNode {
396        /// The pointer to the associated parser this node came from.
397        parser: *const pm_parser_t,
398
399        /// The raw pointer to the node allocated by prism.
400        pointer: *mut pm_call_and_write_node_t,
401
402        /// The marker to indicate the lifetime of the pointer.
403        marker: PhantomData<&'pr mut pm_call_and_write_node_t>
404    },
405    /// The `CallNode` node
406    CallNode {
407        /// The pointer to the associated parser this node came from.
408        parser: *const pm_parser_t,
409
410        /// The raw pointer to the node allocated by prism.
411        pointer: *mut pm_call_node_t,
412
413        /// The marker to indicate the lifetime of the pointer.
414        marker: PhantomData<&'pr mut pm_call_node_t>
415    },
416    /// The `CallOperatorWriteNode` node
417    CallOperatorWriteNode {
418        /// The pointer to the associated parser this node came from.
419        parser: *const pm_parser_t,
420
421        /// The raw pointer to the node allocated by prism.
422        pointer: *mut pm_call_operator_write_node_t,
423
424        /// The marker to indicate the lifetime of the pointer.
425        marker: PhantomData<&'pr mut pm_call_operator_write_node_t>
426    },
427    /// The `CallOrWriteNode` node
428    CallOrWriteNode {
429        /// The pointer to the associated parser this node came from.
430        parser: *const pm_parser_t,
431
432        /// The raw pointer to the node allocated by prism.
433        pointer: *mut pm_call_or_write_node_t,
434
435        /// The marker to indicate the lifetime of the pointer.
436        marker: PhantomData<&'pr mut pm_call_or_write_node_t>
437    },
438    /// The `CallTargetNode` node
439    CallTargetNode {
440        /// The pointer to the associated parser this node came from.
441        parser: *const pm_parser_t,
442
443        /// The raw pointer to the node allocated by prism.
444        pointer: *mut pm_call_target_node_t,
445
446        /// The marker to indicate the lifetime of the pointer.
447        marker: PhantomData<&'pr mut pm_call_target_node_t>
448    },
449    /// The `CapturePatternNode` node
450    CapturePatternNode {
451        /// The pointer to the associated parser this node came from.
452        parser: *const pm_parser_t,
453
454        /// The raw pointer to the node allocated by prism.
455        pointer: *mut pm_capture_pattern_node_t,
456
457        /// The marker to indicate the lifetime of the pointer.
458        marker: PhantomData<&'pr mut pm_capture_pattern_node_t>
459    },
460    /// The `CaseMatchNode` node
461    CaseMatchNode {
462        /// The pointer to the associated parser this node came from.
463        parser: *const pm_parser_t,
464
465        /// The raw pointer to the node allocated by prism.
466        pointer: *mut pm_case_match_node_t,
467
468        /// The marker to indicate the lifetime of the pointer.
469        marker: PhantomData<&'pr mut pm_case_match_node_t>
470    },
471    /// The `CaseNode` node
472    CaseNode {
473        /// The pointer to the associated parser this node came from.
474        parser: *const pm_parser_t,
475
476        /// The raw pointer to the node allocated by prism.
477        pointer: *mut pm_case_node_t,
478
479        /// The marker to indicate the lifetime of the pointer.
480        marker: PhantomData<&'pr mut pm_case_node_t>
481    },
482    /// The `ClassNode` node
483    ClassNode {
484        /// The pointer to the associated parser this node came from.
485        parser: *const pm_parser_t,
486
487        /// The raw pointer to the node allocated by prism.
488        pointer: *mut pm_class_node_t,
489
490        /// The marker to indicate the lifetime of the pointer.
491        marker: PhantomData<&'pr mut pm_class_node_t>
492    },
493    /// The `ClassVariableAndWriteNode` node
494    ClassVariableAndWriteNode {
495        /// The pointer to the associated parser this node came from.
496        parser: *const pm_parser_t,
497
498        /// The raw pointer to the node allocated by prism.
499        pointer: *mut pm_class_variable_and_write_node_t,
500
501        /// The marker to indicate the lifetime of the pointer.
502        marker: PhantomData<&'pr mut pm_class_variable_and_write_node_t>
503    },
504    /// The `ClassVariableOperatorWriteNode` node
505    ClassVariableOperatorWriteNode {
506        /// The pointer to the associated parser this node came from.
507        parser: *const pm_parser_t,
508
509        /// The raw pointer to the node allocated by prism.
510        pointer: *mut pm_class_variable_operator_write_node_t,
511
512        /// The marker to indicate the lifetime of the pointer.
513        marker: PhantomData<&'pr mut pm_class_variable_operator_write_node_t>
514    },
515    /// The `ClassVariableOrWriteNode` node
516    ClassVariableOrWriteNode {
517        /// The pointer to the associated parser this node came from.
518        parser: *const pm_parser_t,
519
520        /// The raw pointer to the node allocated by prism.
521        pointer: *mut pm_class_variable_or_write_node_t,
522
523        /// The marker to indicate the lifetime of the pointer.
524        marker: PhantomData<&'pr mut pm_class_variable_or_write_node_t>
525    },
526    /// The `ClassVariableReadNode` node
527    ClassVariableReadNode {
528        /// The pointer to the associated parser this node came from.
529        parser: *const pm_parser_t,
530
531        /// The raw pointer to the node allocated by prism.
532        pointer: *mut pm_class_variable_read_node_t,
533
534        /// The marker to indicate the lifetime of the pointer.
535        marker: PhantomData<&'pr mut pm_class_variable_read_node_t>
536    },
537    /// The `ClassVariableTargetNode` node
538    ClassVariableTargetNode {
539        /// The pointer to the associated parser this node came from.
540        parser: *const pm_parser_t,
541
542        /// The raw pointer to the node allocated by prism.
543        pointer: *mut pm_class_variable_target_node_t,
544
545        /// The marker to indicate the lifetime of the pointer.
546        marker: PhantomData<&'pr mut pm_class_variable_target_node_t>
547    },
548    /// The `ClassVariableWriteNode` node
549    ClassVariableWriteNode {
550        /// The pointer to the associated parser this node came from.
551        parser: *const pm_parser_t,
552
553        /// The raw pointer to the node allocated by prism.
554        pointer: *mut pm_class_variable_write_node_t,
555
556        /// The marker to indicate the lifetime of the pointer.
557        marker: PhantomData<&'pr mut pm_class_variable_write_node_t>
558    },
559    /// The `ConstantAndWriteNode` node
560    ConstantAndWriteNode {
561        /// The pointer to the associated parser this node came from.
562        parser: *const pm_parser_t,
563
564        /// The raw pointer to the node allocated by prism.
565        pointer: *mut pm_constant_and_write_node_t,
566
567        /// The marker to indicate the lifetime of the pointer.
568        marker: PhantomData<&'pr mut pm_constant_and_write_node_t>
569    },
570    /// The `ConstantOperatorWriteNode` node
571    ConstantOperatorWriteNode {
572        /// The pointer to the associated parser this node came from.
573        parser: *const pm_parser_t,
574
575        /// The raw pointer to the node allocated by prism.
576        pointer: *mut pm_constant_operator_write_node_t,
577
578        /// The marker to indicate the lifetime of the pointer.
579        marker: PhantomData<&'pr mut pm_constant_operator_write_node_t>
580    },
581    /// The `ConstantOrWriteNode` node
582    ConstantOrWriteNode {
583        /// The pointer to the associated parser this node came from.
584        parser: *const pm_parser_t,
585
586        /// The raw pointer to the node allocated by prism.
587        pointer: *mut pm_constant_or_write_node_t,
588
589        /// The marker to indicate the lifetime of the pointer.
590        marker: PhantomData<&'pr mut pm_constant_or_write_node_t>
591    },
592    /// The `ConstantPathAndWriteNode` node
593    ConstantPathAndWriteNode {
594        /// The pointer to the associated parser this node came from.
595        parser: *const pm_parser_t,
596
597        /// The raw pointer to the node allocated by prism.
598        pointer: *mut pm_constant_path_and_write_node_t,
599
600        /// The marker to indicate the lifetime of the pointer.
601        marker: PhantomData<&'pr mut pm_constant_path_and_write_node_t>
602    },
603    /// The `ConstantPathNode` node
604    ConstantPathNode {
605        /// The pointer to the associated parser this node came from.
606        parser: *const pm_parser_t,
607
608        /// The raw pointer to the node allocated by prism.
609        pointer: *mut pm_constant_path_node_t,
610
611        /// The marker to indicate the lifetime of the pointer.
612        marker: PhantomData<&'pr mut pm_constant_path_node_t>
613    },
614    /// The `ConstantPathOperatorWriteNode` node
615    ConstantPathOperatorWriteNode {
616        /// The pointer to the associated parser this node came from.
617        parser: *const pm_parser_t,
618
619        /// The raw pointer to the node allocated by prism.
620        pointer: *mut pm_constant_path_operator_write_node_t,
621
622        /// The marker to indicate the lifetime of the pointer.
623        marker: PhantomData<&'pr mut pm_constant_path_operator_write_node_t>
624    },
625    /// The `ConstantPathOrWriteNode` node
626    ConstantPathOrWriteNode {
627        /// The pointer to the associated parser this node came from.
628        parser: *const pm_parser_t,
629
630        /// The raw pointer to the node allocated by prism.
631        pointer: *mut pm_constant_path_or_write_node_t,
632
633        /// The marker to indicate the lifetime of the pointer.
634        marker: PhantomData<&'pr mut pm_constant_path_or_write_node_t>
635    },
636    /// The `ConstantPathTargetNode` node
637    ConstantPathTargetNode {
638        /// The pointer to the associated parser this node came from.
639        parser: *const pm_parser_t,
640
641        /// The raw pointer to the node allocated by prism.
642        pointer: *mut pm_constant_path_target_node_t,
643
644        /// The marker to indicate the lifetime of the pointer.
645        marker: PhantomData<&'pr mut pm_constant_path_target_node_t>
646    },
647    /// The `ConstantPathWriteNode` node
648    ConstantPathWriteNode {
649        /// The pointer to the associated parser this node came from.
650        parser: *const pm_parser_t,
651
652        /// The raw pointer to the node allocated by prism.
653        pointer: *mut pm_constant_path_write_node_t,
654
655        /// The marker to indicate the lifetime of the pointer.
656        marker: PhantomData<&'pr mut pm_constant_path_write_node_t>
657    },
658    /// The `ConstantReadNode` node
659    ConstantReadNode {
660        /// The pointer to the associated parser this node came from.
661        parser: *const pm_parser_t,
662
663        /// The raw pointer to the node allocated by prism.
664        pointer: *mut pm_constant_read_node_t,
665
666        /// The marker to indicate the lifetime of the pointer.
667        marker: PhantomData<&'pr mut pm_constant_read_node_t>
668    },
669    /// The `ConstantTargetNode` node
670    ConstantTargetNode {
671        /// The pointer to the associated parser this node came from.
672        parser: *const pm_parser_t,
673
674        /// The raw pointer to the node allocated by prism.
675        pointer: *mut pm_constant_target_node_t,
676
677        /// The marker to indicate the lifetime of the pointer.
678        marker: PhantomData<&'pr mut pm_constant_target_node_t>
679    },
680    /// The `ConstantWriteNode` node
681    ConstantWriteNode {
682        /// The pointer to the associated parser this node came from.
683        parser: *const pm_parser_t,
684
685        /// The raw pointer to the node allocated by prism.
686        pointer: *mut pm_constant_write_node_t,
687
688        /// The marker to indicate the lifetime of the pointer.
689        marker: PhantomData<&'pr mut pm_constant_write_node_t>
690    },
691    /// The `DefNode` node
692    DefNode {
693        /// The pointer to the associated parser this node came from.
694        parser: *const pm_parser_t,
695
696        /// The raw pointer to the node allocated by prism.
697        pointer: *mut pm_def_node_t,
698
699        /// The marker to indicate the lifetime of the pointer.
700        marker: PhantomData<&'pr mut pm_def_node_t>
701    },
702    /// The `DefinedNode` node
703    DefinedNode {
704        /// The pointer to the associated parser this node came from.
705        parser: *const pm_parser_t,
706
707        /// The raw pointer to the node allocated by prism.
708        pointer: *mut pm_defined_node_t,
709
710        /// The marker to indicate the lifetime of the pointer.
711        marker: PhantomData<&'pr mut pm_defined_node_t>
712    },
713    /// The `ElseNode` node
714    ElseNode {
715        /// The pointer to the associated parser this node came from.
716        parser: *const pm_parser_t,
717
718        /// The raw pointer to the node allocated by prism.
719        pointer: *mut pm_else_node_t,
720
721        /// The marker to indicate the lifetime of the pointer.
722        marker: PhantomData<&'pr mut pm_else_node_t>
723    },
724    /// The `EmbeddedStatementsNode` node
725    EmbeddedStatementsNode {
726        /// The pointer to the associated parser this node came from.
727        parser: *const pm_parser_t,
728
729        /// The raw pointer to the node allocated by prism.
730        pointer: *mut pm_embedded_statements_node_t,
731
732        /// The marker to indicate the lifetime of the pointer.
733        marker: PhantomData<&'pr mut pm_embedded_statements_node_t>
734    },
735    /// The `EmbeddedVariableNode` node
736    EmbeddedVariableNode {
737        /// The pointer to the associated parser this node came from.
738        parser: *const pm_parser_t,
739
740        /// The raw pointer to the node allocated by prism.
741        pointer: *mut pm_embedded_variable_node_t,
742
743        /// The marker to indicate the lifetime of the pointer.
744        marker: PhantomData<&'pr mut pm_embedded_variable_node_t>
745    },
746    /// The `EnsureNode` node
747    EnsureNode {
748        /// The pointer to the associated parser this node came from.
749        parser: *const pm_parser_t,
750
751        /// The raw pointer to the node allocated by prism.
752        pointer: *mut pm_ensure_node_t,
753
754        /// The marker to indicate the lifetime of the pointer.
755        marker: PhantomData<&'pr mut pm_ensure_node_t>
756    },
757    /// The `ErrorRecoveryNode` node
758    ErrorRecoveryNode {
759        /// The pointer to the associated parser this node came from.
760        parser: *const pm_parser_t,
761
762        /// The raw pointer to the node allocated by prism.
763        pointer: *mut pm_error_recovery_node_t,
764
765        /// The marker to indicate the lifetime of the pointer.
766        marker: PhantomData<&'pr mut pm_error_recovery_node_t>
767    },
768    /// The `FalseNode` node
769    FalseNode {
770        /// The pointer to the associated parser this node came from.
771        parser: *const pm_parser_t,
772
773        /// The raw pointer to the node allocated by prism.
774        pointer: *mut pm_false_node_t,
775
776        /// The marker to indicate the lifetime of the pointer.
777        marker: PhantomData<&'pr mut pm_false_node_t>
778    },
779    /// The `FindPatternNode` node
780    FindPatternNode {
781        /// The pointer to the associated parser this node came from.
782        parser: *const pm_parser_t,
783
784        /// The raw pointer to the node allocated by prism.
785        pointer: *mut pm_find_pattern_node_t,
786
787        /// The marker to indicate the lifetime of the pointer.
788        marker: PhantomData<&'pr mut pm_find_pattern_node_t>
789    },
790    /// The `FlipFlopNode` node
791    FlipFlopNode {
792        /// The pointer to the associated parser this node came from.
793        parser: *const pm_parser_t,
794
795        /// The raw pointer to the node allocated by prism.
796        pointer: *mut pm_flip_flop_node_t,
797
798        /// The marker to indicate the lifetime of the pointer.
799        marker: PhantomData<&'pr mut pm_flip_flop_node_t>
800    },
801    /// The `FloatNode` node
802    FloatNode {
803        /// The pointer to the associated parser this node came from.
804        parser: *const pm_parser_t,
805
806        /// The raw pointer to the node allocated by prism.
807        pointer: *mut pm_float_node_t,
808
809        /// The marker to indicate the lifetime of the pointer.
810        marker: PhantomData<&'pr mut pm_float_node_t>
811    },
812    /// The `ForNode` node
813    ForNode {
814        /// The pointer to the associated parser this node came from.
815        parser: *const pm_parser_t,
816
817        /// The raw pointer to the node allocated by prism.
818        pointer: *mut pm_for_node_t,
819
820        /// The marker to indicate the lifetime of the pointer.
821        marker: PhantomData<&'pr mut pm_for_node_t>
822    },
823    /// The `ForwardingArgumentsNode` node
824    ForwardingArgumentsNode {
825        /// The pointer to the associated parser this node came from.
826        parser: *const pm_parser_t,
827
828        /// The raw pointer to the node allocated by prism.
829        pointer: *mut pm_forwarding_arguments_node_t,
830
831        /// The marker to indicate the lifetime of the pointer.
832        marker: PhantomData<&'pr mut pm_forwarding_arguments_node_t>
833    },
834    /// The `ForwardingParameterNode` node
835    ForwardingParameterNode {
836        /// The pointer to the associated parser this node came from.
837        parser: *const pm_parser_t,
838
839        /// The raw pointer to the node allocated by prism.
840        pointer: *mut pm_forwarding_parameter_node_t,
841
842        /// The marker to indicate the lifetime of the pointer.
843        marker: PhantomData<&'pr mut pm_forwarding_parameter_node_t>
844    },
845    /// The `ForwardingSuperNode` node
846    ForwardingSuperNode {
847        /// The pointer to the associated parser this node came from.
848        parser: *const pm_parser_t,
849
850        /// The raw pointer to the node allocated by prism.
851        pointer: *mut pm_forwarding_super_node_t,
852
853        /// The marker to indicate the lifetime of the pointer.
854        marker: PhantomData<&'pr mut pm_forwarding_super_node_t>
855    },
856    /// The `GlobalVariableAndWriteNode` node
857    GlobalVariableAndWriteNode {
858        /// The pointer to the associated parser this node came from.
859        parser: *const pm_parser_t,
860
861        /// The raw pointer to the node allocated by prism.
862        pointer: *mut pm_global_variable_and_write_node_t,
863
864        /// The marker to indicate the lifetime of the pointer.
865        marker: PhantomData<&'pr mut pm_global_variable_and_write_node_t>
866    },
867    /// The `GlobalVariableOperatorWriteNode` node
868    GlobalVariableOperatorWriteNode {
869        /// The pointer to the associated parser this node came from.
870        parser: *const pm_parser_t,
871
872        /// The raw pointer to the node allocated by prism.
873        pointer: *mut pm_global_variable_operator_write_node_t,
874
875        /// The marker to indicate the lifetime of the pointer.
876        marker: PhantomData<&'pr mut pm_global_variable_operator_write_node_t>
877    },
878    /// The `GlobalVariableOrWriteNode` node
879    GlobalVariableOrWriteNode {
880        /// The pointer to the associated parser this node came from.
881        parser: *const pm_parser_t,
882
883        /// The raw pointer to the node allocated by prism.
884        pointer: *mut pm_global_variable_or_write_node_t,
885
886        /// The marker to indicate the lifetime of the pointer.
887        marker: PhantomData<&'pr mut pm_global_variable_or_write_node_t>
888    },
889    /// The `GlobalVariableReadNode` node
890    GlobalVariableReadNode {
891        /// The pointer to the associated parser this node came from.
892        parser: *const pm_parser_t,
893
894        /// The raw pointer to the node allocated by prism.
895        pointer: *mut pm_global_variable_read_node_t,
896
897        /// The marker to indicate the lifetime of the pointer.
898        marker: PhantomData<&'pr mut pm_global_variable_read_node_t>
899    },
900    /// The `GlobalVariableTargetNode` node
901    GlobalVariableTargetNode {
902        /// The pointer to the associated parser this node came from.
903        parser: *const pm_parser_t,
904
905        /// The raw pointer to the node allocated by prism.
906        pointer: *mut pm_global_variable_target_node_t,
907
908        /// The marker to indicate the lifetime of the pointer.
909        marker: PhantomData<&'pr mut pm_global_variable_target_node_t>
910    },
911    /// The `GlobalVariableWriteNode` node
912    GlobalVariableWriteNode {
913        /// The pointer to the associated parser this node came from.
914        parser: *const pm_parser_t,
915
916        /// The raw pointer to the node allocated by prism.
917        pointer: *mut pm_global_variable_write_node_t,
918
919        /// The marker to indicate the lifetime of the pointer.
920        marker: PhantomData<&'pr mut pm_global_variable_write_node_t>
921    },
922    /// The `HashNode` node
923    HashNode {
924        /// The pointer to the associated parser this node came from.
925        parser: *const pm_parser_t,
926
927        /// The raw pointer to the node allocated by prism.
928        pointer: *mut pm_hash_node_t,
929
930        /// The marker to indicate the lifetime of the pointer.
931        marker: PhantomData<&'pr mut pm_hash_node_t>
932    },
933    /// The `HashPatternNode` node
934    HashPatternNode {
935        /// The pointer to the associated parser this node came from.
936        parser: *const pm_parser_t,
937
938        /// The raw pointer to the node allocated by prism.
939        pointer: *mut pm_hash_pattern_node_t,
940
941        /// The marker to indicate the lifetime of the pointer.
942        marker: PhantomData<&'pr mut pm_hash_pattern_node_t>
943    },
944    /// The `IfNode` node
945    IfNode {
946        /// The pointer to the associated parser this node came from.
947        parser: *const pm_parser_t,
948
949        /// The raw pointer to the node allocated by prism.
950        pointer: *mut pm_if_node_t,
951
952        /// The marker to indicate the lifetime of the pointer.
953        marker: PhantomData<&'pr mut pm_if_node_t>
954    },
955    /// The `ImaginaryNode` node
956    ImaginaryNode {
957        /// The pointer to the associated parser this node came from.
958        parser: *const pm_parser_t,
959
960        /// The raw pointer to the node allocated by prism.
961        pointer: *mut pm_imaginary_node_t,
962
963        /// The marker to indicate the lifetime of the pointer.
964        marker: PhantomData<&'pr mut pm_imaginary_node_t>
965    },
966    /// The `ImplicitNode` node
967    ImplicitNode {
968        /// The pointer to the associated parser this node came from.
969        parser: *const pm_parser_t,
970
971        /// The raw pointer to the node allocated by prism.
972        pointer: *mut pm_implicit_node_t,
973
974        /// The marker to indicate the lifetime of the pointer.
975        marker: PhantomData<&'pr mut pm_implicit_node_t>
976    },
977    /// The `ImplicitRestNode` node
978    ImplicitRestNode {
979        /// The pointer to the associated parser this node came from.
980        parser: *const pm_parser_t,
981
982        /// The raw pointer to the node allocated by prism.
983        pointer: *mut pm_implicit_rest_node_t,
984
985        /// The marker to indicate the lifetime of the pointer.
986        marker: PhantomData<&'pr mut pm_implicit_rest_node_t>
987    },
988    /// The `InNode` node
989    InNode {
990        /// The pointer to the associated parser this node came from.
991        parser: *const pm_parser_t,
992
993        /// The raw pointer to the node allocated by prism.
994        pointer: *mut pm_in_node_t,
995
996        /// The marker to indicate the lifetime of the pointer.
997        marker: PhantomData<&'pr mut pm_in_node_t>
998    },
999    /// The `IndexAndWriteNode` node
1000    IndexAndWriteNode {
1001        /// The pointer to the associated parser this node came from.
1002        parser: *const pm_parser_t,
1003
1004        /// The raw pointer to the node allocated by prism.
1005        pointer: *mut pm_index_and_write_node_t,
1006
1007        /// The marker to indicate the lifetime of the pointer.
1008        marker: PhantomData<&'pr mut pm_index_and_write_node_t>
1009    },
1010    /// The `IndexOperatorWriteNode` node
1011    IndexOperatorWriteNode {
1012        /// The pointer to the associated parser this node came from.
1013        parser: *const pm_parser_t,
1014
1015        /// The raw pointer to the node allocated by prism.
1016        pointer: *mut pm_index_operator_write_node_t,
1017
1018        /// The marker to indicate the lifetime of the pointer.
1019        marker: PhantomData<&'pr mut pm_index_operator_write_node_t>
1020    },
1021    /// The `IndexOrWriteNode` node
1022    IndexOrWriteNode {
1023        /// The pointer to the associated parser this node came from.
1024        parser: *const pm_parser_t,
1025
1026        /// The raw pointer to the node allocated by prism.
1027        pointer: *mut pm_index_or_write_node_t,
1028
1029        /// The marker to indicate the lifetime of the pointer.
1030        marker: PhantomData<&'pr mut pm_index_or_write_node_t>
1031    },
1032    /// The `IndexTargetNode` node
1033    IndexTargetNode {
1034        /// The pointer to the associated parser this node came from.
1035        parser: *const pm_parser_t,
1036
1037        /// The raw pointer to the node allocated by prism.
1038        pointer: *mut pm_index_target_node_t,
1039
1040        /// The marker to indicate the lifetime of the pointer.
1041        marker: PhantomData<&'pr mut pm_index_target_node_t>
1042    },
1043    /// The `InstanceVariableAndWriteNode` node
1044    InstanceVariableAndWriteNode {
1045        /// The pointer to the associated parser this node came from.
1046        parser: *const pm_parser_t,
1047
1048        /// The raw pointer to the node allocated by prism.
1049        pointer: *mut pm_instance_variable_and_write_node_t,
1050
1051        /// The marker to indicate the lifetime of the pointer.
1052        marker: PhantomData<&'pr mut pm_instance_variable_and_write_node_t>
1053    },
1054    /// The `InstanceVariableOperatorWriteNode` node
1055    InstanceVariableOperatorWriteNode {
1056        /// The pointer to the associated parser this node came from.
1057        parser: *const pm_parser_t,
1058
1059        /// The raw pointer to the node allocated by prism.
1060        pointer: *mut pm_instance_variable_operator_write_node_t,
1061
1062        /// The marker to indicate the lifetime of the pointer.
1063        marker: PhantomData<&'pr mut pm_instance_variable_operator_write_node_t>
1064    },
1065    /// The `InstanceVariableOrWriteNode` node
1066    InstanceVariableOrWriteNode {
1067        /// The pointer to the associated parser this node came from.
1068        parser: *const pm_parser_t,
1069
1070        /// The raw pointer to the node allocated by prism.
1071        pointer: *mut pm_instance_variable_or_write_node_t,
1072
1073        /// The marker to indicate the lifetime of the pointer.
1074        marker: PhantomData<&'pr mut pm_instance_variable_or_write_node_t>
1075    },
1076    /// The `InstanceVariableReadNode` node
1077    InstanceVariableReadNode {
1078        /// The pointer to the associated parser this node came from.
1079        parser: *const pm_parser_t,
1080
1081        /// The raw pointer to the node allocated by prism.
1082        pointer: *mut pm_instance_variable_read_node_t,
1083
1084        /// The marker to indicate the lifetime of the pointer.
1085        marker: PhantomData<&'pr mut pm_instance_variable_read_node_t>
1086    },
1087    /// The `InstanceVariableTargetNode` node
1088    InstanceVariableTargetNode {
1089        /// The pointer to the associated parser this node came from.
1090        parser: *const pm_parser_t,
1091
1092        /// The raw pointer to the node allocated by prism.
1093        pointer: *mut pm_instance_variable_target_node_t,
1094
1095        /// The marker to indicate the lifetime of the pointer.
1096        marker: PhantomData<&'pr mut pm_instance_variable_target_node_t>
1097    },
1098    /// The `InstanceVariableWriteNode` node
1099    InstanceVariableWriteNode {
1100        /// The pointer to the associated parser this node came from.
1101        parser: *const pm_parser_t,
1102
1103        /// The raw pointer to the node allocated by prism.
1104        pointer: *mut pm_instance_variable_write_node_t,
1105
1106        /// The marker to indicate the lifetime of the pointer.
1107        marker: PhantomData<&'pr mut pm_instance_variable_write_node_t>
1108    },
1109    /// The `IntegerNode` node
1110    IntegerNode {
1111        /// The pointer to the associated parser this node came from.
1112        parser: *const pm_parser_t,
1113
1114        /// The raw pointer to the node allocated by prism.
1115        pointer: *mut pm_integer_node_t,
1116
1117        /// The marker to indicate the lifetime of the pointer.
1118        marker: PhantomData<&'pr mut pm_integer_node_t>
1119    },
1120    /// The `InterpolatedMatchLastLineNode` node
1121    InterpolatedMatchLastLineNode {
1122        /// The pointer to the associated parser this node came from.
1123        parser: *const pm_parser_t,
1124
1125        /// The raw pointer to the node allocated by prism.
1126        pointer: *mut pm_interpolated_match_last_line_node_t,
1127
1128        /// The marker to indicate the lifetime of the pointer.
1129        marker: PhantomData<&'pr mut pm_interpolated_match_last_line_node_t>
1130    },
1131    /// The `InterpolatedRegularExpressionNode` node
1132    InterpolatedRegularExpressionNode {
1133        /// The pointer to the associated parser this node came from.
1134        parser: *const pm_parser_t,
1135
1136        /// The raw pointer to the node allocated by prism.
1137        pointer: *mut pm_interpolated_regular_expression_node_t,
1138
1139        /// The marker to indicate the lifetime of the pointer.
1140        marker: PhantomData<&'pr mut pm_interpolated_regular_expression_node_t>
1141    },
1142    /// The `InterpolatedStringNode` node
1143    InterpolatedStringNode {
1144        /// The pointer to the associated parser this node came from.
1145        parser: *const pm_parser_t,
1146
1147        /// The raw pointer to the node allocated by prism.
1148        pointer: *mut pm_interpolated_string_node_t,
1149
1150        /// The marker to indicate the lifetime of the pointer.
1151        marker: PhantomData<&'pr mut pm_interpolated_string_node_t>
1152    },
1153    /// The `InterpolatedSymbolNode` node
1154    InterpolatedSymbolNode {
1155        /// The pointer to the associated parser this node came from.
1156        parser: *const pm_parser_t,
1157
1158        /// The raw pointer to the node allocated by prism.
1159        pointer: *mut pm_interpolated_symbol_node_t,
1160
1161        /// The marker to indicate the lifetime of the pointer.
1162        marker: PhantomData<&'pr mut pm_interpolated_symbol_node_t>
1163    },
1164    /// The `InterpolatedXStringNode` node
1165    InterpolatedXStringNode {
1166        /// The pointer to the associated parser this node came from.
1167        parser: *const pm_parser_t,
1168
1169        /// The raw pointer to the node allocated by prism.
1170        pointer: *mut pm_interpolated_x_string_node_t,
1171
1172        /// The marker to indicate the lifetime of the pointer.
1173        marker: PhantomData<&'pr mut pm_interpolated_x_string_node_t>
1174    },
1175    /// The `ItLocalVariableReadNode` node
1176    ItLocalVariableReadNode {
1177        /// The pointer to the associated parser this node came from.
1178        parser: *const pm_parser_t,
1179
1180        /// The raw pointer to the node allocated by prism.
1181        pointer: *mut pm_it_local_variable_read_node_t,
1182
1183        /// The marker to indicate the lifetime of the pointer.
1184        marker: PhantomData<&'pr mut pm_it_local_variable_read_node_t>
1185    },
1186    /// The `ItParametersNode` node
1187    ItParametersNode {
1188        /// The pointer to the associated parser this node came from.
1189        parser: *const pm_parser_t,
1190
1191        /// The raw pointer to the node allocated by prism.
1192        pointer: *mut pm_it_parameters_node_t,
1193
1194        /// The marker to indicate the lifetime of the pointer.
1195        marker: PhantomData<&'pr mut pm_it_parameters_node_t>
1196    },
1197    /// The `KeywordHashNode` node
1198    KeywordHashNode {
1199        /// The pointer to the associated parser this node came from.
1200        parser: *const pm_parser_t,
1201
1202        /// The raw pointer to the node allocated by prism.
1203        pointer: *mut pm_keyword_hash_node_t,
1204
1205        /// The marker to indicate the lifetime of the pointer.
1206        marker: PhantomData<&'pr mut pm_keyword_hash_node_t>
1207    },
1208    /// The `KeywordRestParameterNode` node
1209    KeywordRestParameterNode {
1210        /// The pointer to the associated parser this node came from.
1211        parser: *const pm_parser_t,
1212
1213        /// The raw pointer to the node allocated by prism.
1214        pointer: *mut pm_keyword_rest_parameter_node_t,
1215
1216        /// The marker to indicate the lifetime of the pointer.
1217        marker: PhantomData<&'pr mut pm_keyword_rest_parameter_node_t>
1218    },
1219    /// The `LambdaNode` node
1220    LambdaNode {
1221        /// The pointer to the associated parser this node came from.
1222        parser: *const pm_parser_t,
1223
1224        /// The raw pointer to the node allocated by prism.
1225        pointer: *mut pm_lambda_node_t,
1226
1227        /// The marker to indicate the lifetime of the pointer.
1228        marker: PhantomData<&'pr mut pm_lambda_node_t>
1229    },
1230    /// The `LocalVariableAndWriteNode` node
1231    LocalVariableAndWriteNode {
1232        /// The pointer to the associated parser this node came from.
1233        parser: *const pm_parser_t,
1234
1235        /// The raw pointer to the node allocated by prism.
1236        pointer: *mut pm_local_variable_and_write_node_t,
1237
1238        /// The marker to indicate the lifetime of the pointer.
1239        marker: PhantomData<&'pr mut pm_local_variable_and_write_node_t>
1240    },
1241    /// The `LocalVariableOperatorWriteNode` node
1242    LocalVariableOperatorWriteNode {
1243        /// The pointer to the associated parser this node came from.
1244        parser: *const pm_parser_t,
1245
1246        /// The raw pointer to the node allocated by prism.
1247        pointer: *mut pm_local_variable_operator_write_node_t,
1248
1249        /// The marker to indicate the lifetime of the pointer.
1250        marker: PhantomData<&'pr mut pm_local_variable_operator_write_node_t>
1251    },
1252    /// The `LocalVariableOrWriteNode` node
1253    LocalVariableOrWriteNode {
1254        /// The pointer to the associated parser this node came from.
1255        parser: *const pm_parser_t,
1256
1257        /// The raw pointer to the node allocated by prism.
1258        pointer: *mut pm_local_variable_or_write_node_t,
1259
1260        /// The marker to indicate the lifetime of the pointer.
1261        marker: PhantomData<&'pr mut pm_local_variable_or_write_node_t>
1262    },
1263    /// The `LocalVariableReadNode` node
1264    LocalVariableReadNode {
1265        /// The pointer to the associated parser this node came from.
1266        parser: *const pm_parser_t,
1267
1268        /// The raw pointer to the node allocated by prism.
1269        pointer: *mut pm_local_variable_read_node_t,
1270
1271        /// The marker to indicate the lifetime of the pointer.
1272        marker: PhantomData<&'pr mut pm_local_variable_read_node_t>
1273    },
1274    /// The `LocalVariableTargetNode` node
1275    LocalVariableTargetNode {
1276        /// The pointer to the associated parser this node came from.
1277        parser: *const pm_parser_t,
1278
1279        /// The raw pointer to the node allocated by prism.
1280        pointer: *mut pm_local_variable_target_node_t,
1281
1282        /// The marker to indicate the lifetime of the pointer.
1283        marker: PhantomData<&'pr mut pm_local_variable_target_node_t>
1284    },
1285    /// The `LocalVariableWriteNode` node
1286    LocalVariableWriteNode {
1287        /// The pointer to the associated parser this node came from.
1288        parser: *const pm_parser_t,
1289
1290        /// The raw pointer to the node allocated by prism.
1291        pointer: *mut pm_local_variable_write_node_t,
1292
1293        /// The marker to indicate the lifetime of the pointer.
1294        marker: PhantomData<&'pr mut pm_local_variable_write_node_t>
1295    },
1296    /// The `MatchLastLineNode` node
1297    MatchLastLineNode {
1298        /// The pointer to the associated parser this node came from.
1299        parser: *const pm_parser_t,
1300
1301        /// The raw pointer to the node allocated by prism.
1302        pointer: *mut pm_match_last_line_node_t,
1303
1304        /// The marker to indicate the lifetime of the pointer.
1305        marker: PhantomData<&'pr mut pm_match_last_line_node_t>
1306    },
1307    /// The `MatchPredicateNode` node
1308    MatchPredicateNode {
1309        /// The pointer to the associated parser this node came from.
1310        parser: *const pm_parser_t,
1311
1312        /// The raw pointer to the node allocated by prism.
1313        pointer: *mut pm_match_predicate_node_t,
1314
1315        /// The marker to indicate the lifetime of the pointer.
1316        marker: PhantomData<&'pr mut pm_match_predicate_node_t>
1317    },
1318    /// The `MatchRequiredNode` node
1319    MatchRequiredNode {
1320        /// The pointer to the associated parser this node came from.
1321        parser: *const pm_parser_t,
1322
1323        /// The raw pointer to the node allocated by prism.
1324        pointer: *mut pm_match_required_node_t,
1325
1326        /// The marker to indicate the lifetime of the pointer.
1327        marker: PhantomData<&'pr mut pm_match_required_node_t>
1328    },
1329    /// The `MatchWriteNode` node
1330    MatchWriteNode {
1331        /// The pointer to the associated parser this node came from.
1332        parser: *const pm_parser_t,
1333
1334        /// The raw pointer to the node allocated by prism.
1335        pointer: *mut pm_match_write_node_t,
1336
1337        /// The marker to indicate the lifetime of the pointer.
1338        marker: PhantomData<&'pr mut pm_match_write_node_t>
1339    },
1340    /// The `ModuleNode` node
1341    ModuleNode {
1342        /// The pointer to the associated parser this node came from.
1343        parser: *const pm_parser_t,
1344
1345        /// The raw pointer to the node allocated by prism.
1346        pointer: *mut pm_module_node_t,
1347
1348        /// The marker to indicate the lifetime of the pointer.
1349        marker: PhantomData<&'pr mut pm_module_node_t>
1350    },
1351    /// The `MultiTargetNode` node
1352    MultiTargetNode {
1353        /// The pointer to the associated parser this node came from.
1354        parser: *const pm_parser_t,
1355
1356        /// The raw pointer to the node allocated by prism.
1357        pointer: *mut pm_multi_target_node_t,
1358
1359        /// The marker to indicate the lifetime of the pointer.
1360        marker: PhantomData<&'pr mut pm_multi_target_node_t>
1361    },
1362    /// The `MultiWriteNode` node
1363    MultiWriteNode {
1364        /// The pointer to the associated parser this node came from.
1365        parser: *const pm_parser_t,
1366
1367        /// The raw pointer to the node allocated by prism.
1368        pointer: *mut pm_multi_write_node_t,
1369
1370        /// The marker to indicate the lifetime of the pointer.
1371        marker: PhantomData<&'pr mut pm_multi_write_node_t>
1372    },
1373    /// The `NextNode` node
1374    NextNode {
1375        /// The pointer to the associated parser this node came from.
1376        parser: *const pm_parser_t,
1377
1378        /// The raw pointer to the node allocated by prism.
1379        pointer: *mut pm_next_node_t,
1380
1381        /// The marker to indicate the lifetime of the pointer.
1382        marker: PhantomData<&'pr mut pm_next_node_t>
1383    },
1384    /// The `NilNode` node
1385    NilNode {
1386        /// The pointer to the associated parser this node came from.
1387        parser: *const pm_parser_t,
1388
1389        /// The raw pointer to the node allocated by prism.
1390        pointer: *mut pm_nil_node_t,
1391
1392        /// The marker to indicate the lifetime of the pointer.
1393        marker: PhantomData<&'pr mut pm_nil_node_t>
1394    },
1395    /// The `NoBlockParameterNode` node
1396    NoBlockParameterNode {
1397        /// The pointer to the associated parser this node came from.
1398        parser: *const pm_parser_t,
1399
1400        /// The raw pointer to the node allocated by prism.
1401        pointer: *mut pm_no_block_parameter_node_t,
1402
1403        /// The marker to indicate the lifetime of the pointer.
1404        marker: PhantomData<&'pr mut pm_no_block_parameter_node_t>
1405    },
1406    /// The `NoKeywordsParameterNode` node
1407    NoKeywordsParameterNode {
1408        /// The pointer to the associated parser this node came from.
1409        parser: *const pm_parser_t,
1410
1411        /// The raw pointer to the node allocated by prism.
1412        pointer: *mut pm_no_keywords_parameter_node_t,
1413
1414        /// The marker to indicate the lifetime of the pointer.
1415        marker: PhantomData<&'pr mut pm_no_keywords_parameter_node_t>
1416    },
1417    /// The `NumberedParametersNode` node
1418    NumberedParametersNode {
1419        /// The pointer to the associated parser this node came from.
1420        parser: *const pm_parser_t,
1421
1422        /// The raw pointer to the node allocated by prism.
1423        pointer: *mut pm_numbered_parameters_node_t,
1424
1425        /// The marker to indicate the lifetime of the pointer.
1426        marker: PhantomData<&'pr mut pm_numbered_parameters_node_t>
1427    },
1428    /// The `NumberedReferenceReadNode` node
1429    NumberedReferenceReadNode {
1430        /// The pointer to the associated parser this node came from.
1431        parser: *const pm_parser_t,
1432
1433        /// The raw pointer to the node allocated by prism.
1434        pointer: *mut pm_numbered_reference_read_node_t,
1435
1436        /// The marker to indicate the lifetime of the pointer.
1437        marker: PhantomData<&'pr mut pm_numbered_reference_read_node_t>
1438    },
1439    /// The `OptionalKeywordParameterNode` node
1440    OptionalKeywordParameterNode {
1441        /// The pointer to the associated parser this node came from.
1442        parser: *const pm_parser_t,
1443
1444        /// The raw pointer to the node allocated by prism.
1445        pointer: *mut pm_optional_keyword_parameter_node_t,
1446
1447        /// The marker to indicate the lifetime of the pointer.
1448        marker: PhantomData<&'pr mut pm_optional_keyword_parameter_node_t>
1449    },
1450    /// The `OptionalParameterNode` node
1451    OptionalParameterNode {
1452        /// The pointer to the associated parser this node came from.
1453        parser: *const pm_parser_t,
1454
1455        /// The raw pointer to the node allocated by prism.
1456        pointer: *mut pm_optional_parameter_node_t,
1457
1458        /// The marker to indicate the lifetime of the pointer.
1459        marker: PhantomData<&'pr mut pm_optional_parameter_node_t>
1460    },
1461    /// The `OrNode` node
1462    OrNode {
1463        /// The pointer to the associated parser this node came from.
1464        parser: *const pm_parser_t,
1465
1466        /// The raw pointer to the node allocated by prism.
1467        pointer: *mut pm_or_node_t,
1468
1469        /// The marker to indicate the lifetime of the pointer.
1470        marker: PhantomData<&'pr mut pm_or_node_t>
1471    },
1472    /// The `ParametersNode` node
1473    ParametersNode {
1474        /// The pointer to the associated parser this node came from.
1475        parser: *const pm_parser_t,
1476
1477        /// The raw pointer to the node allocated by prism.
1478        pointer: *mut pm_parameters_node_t,
1479
1480        /// The marker to indicate the lifetime of the pointer.
1481        marker: PhantomData<&'pr mut pm_parameters_node_t>
1482    },
1483    /// The `ParenthesesNode` node
1484    ParenthesesNode {
1485        /// The pointer to the associated parser this node came from.
1486        parser: *const pm_parser_t,
1487
1488        /// The raw pointer to the node allocated by prism.
1489        pointer: *mut pm_parentheses_node_t,
1490
1491        /// The marker to indicate the lifetime of the pointer.
1492        marker: PhantomData<&'pr mut pm_parentheses_node_t>
1493    },
1494    /// The `PinnedExpressionNode` node
1495    PinnedExpressionNode {
1496        /// The pointer to the associated parser this node came from.
1497        parser: *const pm_parser_t,
1498
1499        /// The raw pointer to the node allocated by prism.
1500        pointer: *mut pm_pinned_expression_node_t,
1501
1502        /// The marker to indicate the lifetime of the pointer.
1503        marker: PhantomData<&'pr mut pm_pinned_expression_node_t>
1504    },
1505    /// The `PinnedVariableNode` node
1506    PinnedVariableNode {
1507        /// The pointer to the associated parser this node came from.
1508        parser: *const pm_parser_t,
1509
1510        /// The raw pointer to the node allocated by prism.
1511        pointer: *mut pm_pinned_variable_node_t,
1512
1513        /// The marker to indicate the lifetime of the pointer.
1514        marker: PhantomData<&'pr mut pm_pinned_variable_node_t>
1515    },
1516    /// The `PostExecutionNode` node
1517    PostExecutionNode {
1518        /// The pointer to the associated parser this node came from.
1519        parser: *const pm_parser_t,
1520
1521        /// The raw pointer to the node allocated by prism.
1522        pointer: *mut pm_post_execution_node_t,
1523
1524        /// The marker to indicate the lifetime of the pointer.
1525        marker: PhantomData<&'pr mut pm_post_execution_node_t>
1526    },
1527    /// The `PreExecutionNode` node
1528    PreExecutionNode {
1529        /// The pointer to the associated parser this node came from.
1530        parser: *const pm_parser_t,
1531
1532        /// The raw pointer to the node allocated by prism.
1533        pointer: *mut pm_pre_execution_node_t,
1534
1535        /// The marker to indicate the lifetime of the pointer.
1536        marker: PhantomData<&'pr mut pm_pre_execution_node_t>
1537    },
1538    /// The `ProgramNode` node
1539    ProgramNode {
1540        /// The pointer to the associated parser this node came from.
1541        parser: *const pm_parser_t,
1542
1543        /// The raw pointer to the node allocated by prism.
1544        pointer: *mut pm_program_node_t,
1545
1546        /// The marker to indicate the lifetime of the pointer.
1547        marker: PhantomData<&'pr mut pm_program_node_t>
1548    },
1549    /// The `RangeNode` node
1550    RangeNode {
1551        /// The pointer to the associated parser this node came from.
1552        parser: *const pm_parser_t,
1553
1554        /// The raw pointer to the node allocated by prism.
1555        pointer: *mut pm_range_node_t,
1556
1557        /// The marker to indicate the lifetime of the pointer.
1558        marker: PhantomData<&'pr mut pm_range_node_t>
1559    },
1560    /// The `RationalNode` node
1561    RationalNode {
1562        /// The pointer to the associated parser this node came from.
1563        parser: *const pm_parser_t,
1564
1565        /// The raw pointer to the node allocated by prism.
1566        pointer: *mut pm_rational_node_t,
1567
1568        /// The marker to indicate the lifetime of the pointer.
1569        marker: PhantomData<&'pr mut pm_rational_node_t>
1570    },
1571    /// The `RedoNode` node
1572    RedoNode {
1573        /// The pointer to the associated parser this node came from.
1574        parser: *const pm_parser_t,
1575
1576        /// The raw pointer to the node allocated by prism.
1577        pointer: *mut pm_redo_node_t,
1578
1579        /// The marker to indicate the lifetime of the pointer.
1580        marker: PhantomData<&'pr mut pm_redo_node_t>
1581    },
1582    /// The `RegularExpressionNode` node
1583    RegularExpressionNode {
1584        /// The pointer to the associated parser this node came from.
1585        parser: *const pm_parser_t,
1586
1587        /// The raw pointer to the node allocated by prism.
1588        pointer: *mut pm_regular_expression_node_t,
1589
1590        /// The marker to indicate the lifetime of the pointer.
1591        marker: PhantomData<&'pr mut pm_regular_expression_node_t>
1592    },
1593    /// The `RequiredKeywordParameterNode` node
1594    RequiredKeywordParameterNode {
1595        /// The pointer to the associated parser this node came from.
1596        parser: *const pm_parser_t,
1597
1598        /// The raw pointer to the node allocated by prism.
1599        pointer: *mut pm_required_keyword_parameter_node_t,
1600
1601        /// The marker to indicate the lifetime of the pointer.
1602        marker: PhantomData<&'pr mut pm_required_keyword_parameter_node_t>
1603    },
1604    /// The `RequiredParameterNode` node
1605    RequiredParameterNode {
1606        /// The pointer to the associated parser this node came from.
1607        parser: *const pm_parser_t,
1608
1609        /// The raw pointer to the node allocated by prism.
1610        pointer: *mut pm_required_parameter_node_t,
1611
1612        /// The marker to indicate the lifetime of the pointer.
1613        marker: PhantomData<&'pr mut pm_required_parameter_node_t>
1614    },
1615    /// The `RescueModifierNode` node
1616    RescueModifierNode {
1617        /// The pointer to the associated parser this node came from.
1618        parser: *const pm_parser_t,
1619
1620        /// The raw pointer to the node allocated by prism.
1621        pointer: *mut pm_rescue_modifier_node_t,
1622
1623        /// The marker to indicate the lifetime of the pointer.
1624        marker: PhantomData<&'pr mut pm_rescue_modifier_node_t>
1625    },
1626    /// The `RescueNode` node
1627    RescueNode {
1628        /// The pointer to the associated parser this node came from.
1629        parser: *const pm_parser_t,
1630
1631        /// The raw pointer to the node allocated by prism.
1632        pointer: *mut pm_rescue_node_t,
1633
1634        /// The marker to indicate the lifetime of the pointer.
1635        marker: PhantomData<&'pr mut pm_rescue_node_t>
1636    },
1637    /// The `RestParameterNode` node
1638    RestParameterNode {
1639        /// The pointer to the associated parser this node came from.
1640        parser: *const pm_parser_t,
1641
1642        /// The raw pointer to the node allocated by prism.
1643        pointer: *mut pm_rest_parameter_node_t,
1644
1645        /// The marker to indicate the lifetime of the pointer.
1646        marker: PhantomData<&'pr mut pm_rest_parameter_node_t>
1647    },
1648    /// The `RetryNode` node
1649    RetryNode {
1650        /// The pointer to the associated parser this node came from.
1651        parser: *const pm_parser_t,
1652
1653        /// The raw pointer to the node allocated by prism.
1654        pointer: *mut pm_retry_node_t,
1655
1656        /// The marker to indicate the lifetime of the pointer.
1657        marker: PhantomData<&'pr mut pm_retry_node_t>
1658    },
1659    /// The `ReturnNode` node
1660    ReturnNode {
1661        /// The pointer to the associated parser this node came from.
1662        parser: *const pm_parser_t,
1663
1664        /// The raw pointer to the node allocated by prism.
1665        pointer: *mut pm_return_node_t,
1666
1667        /// The marker to indicate the lifetime of the pointer.
1668        marker: PhantomData<&'pr mut pm_return_node_t>
1669    },
1670    /// The `SelfNode` node
1671    SelfNode {
1672        /// The pointer to the associated parser this node came from.
1673        parser: *const pm_parser_t,
1674
1675        /// The raw pointer to the node allocated by prism.
1676        pointer: *mut pm_self_node_t,
1677
1678        /// The marker to indicate the lifetime of the pointer.
1679        marker: PhantomData<&'pr mut pm_self_node_t>
1680    },
1681    /// The `ShareableConstantNode` node
1682    ShareableConstantNode {
1683        /// The pointer to the associated parser this node came from.
1684        parser: *const pm_parser_t,
1685
1686        /// The raw pointer to the node allocated by prism.
1687        pointer: *mut pm_shareable_constant_node_t,
1688
1689        /// The marker to indicate the lifetime of the pointer.
1690        marker: PhantomData<&'pr mut pm_shareable_constant_node_t>
1691    },
1692    /// The `SingletonClassNode` node
1693    SingletonClassNode {
1694        /// The pointer to the associated parser this node came from.
1695        parser: *const pm_parser_t,
1696
1697        /// The raw pointer to the node allocated by prism.
1698        pointer: *mut pm_singleton_class_node_t,
1699
1700        /// The marker to indicate the lifetime of the pointer.
1701        marker: PhantomData<&'pr mut pm_singleton_class_node_t>
1702    },
1703    /// The `SourceEncodingNode` node
1704    SourceEncodingNode {
1705        /// The pointer to the associated parser this node came from.
1706        parser: *const pm_parser_t,
1707
1708        /// The raw pointer to the node allocated by prism.
1709        pointer: *mut pm_source_encoding_node_t,
1710
1711        /// The marker to indicate the lifetime of the pointer.
1712        marker: PhantomData<&'pr mut pm_source_encoding_node_t>
1713    },
1714    /// The `SourceFileNode` node
1715    SourceFileNode {
1716        /// The pointer to the associated parser this node came from.
1717        parser: *const pm_parser_t,
1718
1719        /// The raw pointer to the node allocated by prism.
1720        pointer: *mut pm_source_file_node_t,
1721
1722        /// The marker to indicate the lifetime of the pointer.
1723        marker: PhantomData<&'pr mut pm_source_file_node_t>
1724    },
1725    /// The `SourceLineNode` node
1726    SourceLineNode {
1727        /// The pointer to the associated parser this node came from.
1728        parser: *const pm_parser_t,
1729
1730        /// The raw pointer to the node allocated by prism.
1731        pointer: *mut pm_source_line_node_t,
1732
1733        /// The marker to indicate the lifetime of the pointer.
1734        marker: PhantomData<&'pr mut pm_source_line_node_t>
1735    },
1736    /// The `SplatNode` node
1737    SplatNode {
1738        /// The pointer to the associated parser this node came from.
1739        parser: *const pm_parser_t,
1740
1741        /// The raw pointer to the node allocated by prism.
1742        pointer: *mut pm_splat_node_t,
1743
1744        /// The marker to indicate the lifetime of the pointer.
1745        marker: PhantomData<&'pr mut pm_splat_node_t>
1746    },
1747    /// The `StatementsNode` node
1748    StatementsNode {
1749        /// The pointer to the associated parser this node came from.
1750        parser: *const pm_parser_t,
1751
1752        /// The raw pointer to the node allocated by prism.
1753        pointer: *mut pm_statements_node_t,
1754
1755        /// The marker to indicate the lifetime of the pointer.
1756        marker: PhantomData<&'pr mut pm_statements_node_t>
1757    },
1758    /// The `StringNode` node
1759    StringNode {
1760        /// The pointer to the associated parser this node came from.
1761        parser: *const pm_parser_t,
1762
1763        /// The raw pointer to the node allocated by prism.
1764        pointer: *mut pm_string_node_t,
1765
1766        /// The marker to indicate the lifetime of the pointer.
1767        marker: PhantomData<&'pr mut pm_string_node_t>
1768    },
1769    /// The `SuperNode` node
1770    SuperNode {
1771        /// The pointer to the associated parser this node came from.
1772        parser: *const pm_parser_t,
1773
1774        /// The raw pointer to the node allocated by prism.
1775        pointer: *mut pm_super_node_t,
1776
1777        /// The marker to indicate the lifetime of the pointer.
1778        marker: PhantomData<&'pr mut pm_super_node_t>
1779    },
1780    /// The `SymbolNode` node
1781    SymbolNode {
1782        /// The pointer to the associated parser this node came from.
1783        parser: *const pm_parser_t,
1784
1785        /// The raw pointer to the node allocated by prism.
1786        pointer: *mut pm_symbol_node_t,
1787
1788        /// The marker to indicate the lifetime of the pointer.
1789        marker: PhantomData<&'pr mut pm_symbol_node_t>
1790    },
1791    /// The `TrueNode` node
1792    TrueNode {
1793        /// The pointer to the associated parser this node came from.
1794        parser: *const pm_parser_t,
1795
1796        /// The raw pointer to the node allocated by prism.
1797        pointer: *mut pm_true_node_t,
1798
1799        /// The marker to indicate the lifetime of the pointer.
1800        marker: PhantomData<&'pr mut pm_true_node_t>
1801    },
1802    /// The `UndefNode` node
1803    UndefNode {
1804        /// The pointer to the associated parser this node came from.
1805        parser: *const pm_parser_t,
1806
1807        /// The raw pointer to the node allocated by prism.
1808        pointer: *mut pm_undef_node_t,
1809
1810        /// The marker to indicate the lifetime of the pointer.
1811        marker: PhantomData<&'pr mut pm_undef_node_t>
1812    },
1813    /// The `UnlessNode` node
1814    UnlessNode {
1815        /// The pointer to the associated parser this node came from.
1816        parser: *const pm_parser_t,
1817
1818        /// The raw pointer to the node allocated by prism.
1819        pointer: *mut pm_unless_node_t,
1820
1821        /// The marker to indicate the lifetime of the pointer.
1822        marker: PhantomData<&'pr mut pm_unless_node_t>
1823    },
1824    /// The `UntilNode` node
1825    UntilNode {
1826        /// The pointer to the associated parser this node came from.
1827        parser: *const pm_parser_t,
1828
1829        /// The raw pointer to the node allocated by prism.
1830        pointer: *mut pm_until_node_t,
1831
1832        /// The marker to indicate the lifetime of the pointer.
1833        marker: PhantomData<&'pr mut pm_until_node_t>
1834    },
1835    /// The `WhenNode` node
1836    WhenNode {
1837        /// The pointer to the associated parser this node came from.
1838        parser: *const pm_parser_t,
1839
1840        /// The raw pointer to the node allocated by prism.
1841        pointer: *mut pm_when_node_t,
1842
1843        /// The marker to indicate the lifetime of the pointer.
1844        marker: PhantomData<&'pr mut pm_when_node_t>
1845    },
1846    /// The `WhileNode` node
1847    WhileNode {
1848        /// The pointer to the associated parser this node came from.
1849        parser: *const pm_parser_t,
1850
1851        /// The raw pointer to the node allocated by prism.
1852        pointer: *mut pm_while_node_t,
1853
1854        /// The marker to indicate the lifetime of the pointer.
1855        marker: PhantomData<&'pr mut pm_while_node_t>
1856    },
1857    /// The `XStringNode` node
1858    XStringNode {
1859        /// The pointer to the associated parser this node came from.
1860        parser: *const pm_parser_t,
1861
1862        /// The raw pointer to the node allocated by prism.
1863        pointer: *mut pm_x_string_node_t,
1864
1865        /// The marker to indicate the lifetime of the pointer.
1866        marker: PhantomData<&'pr mut pm_x_string_node_t>
1867    },
1868    /// The `YieldNode` node
1869    YieldNode {
1870        /// The pointer to the associated parser this node came from.
1871        parser: *const pm_parser_t,
1872
1873        /// The raw pointer to the node allocated by prism.
1874        pointer: *mut pm_yield_node_t,
1875
1876        /// The marker to indicate the lifetime of the pointer.
1877        marker: PhantomData<&'pr mut pm_yield_node_t>
1878    },
1879}
1880
1881
1882impl<'pr> Node<'pr> {
1883    /// Creates a new node from the given pointer.
1884    ///
1885    /// # Panics
1886    ///
1887    /// Panics if the node type cannot be read.
1888    ///
1889    #[allow(clippy::not_unsafe_ptr_arg_deref)]
1890    #[allow(clippy::cast_ptr_alignment)]
1891    pub(crate) fn new(parser: *const pm_parser_t, node: *mut pm_node_t) -> Self {
1892        match unsafe { (*node).type_ } {
1893            PM_ALIAS_GLOBAL_VARIABLE_NODE => Self::AliasGlobalVariableNode { parser, pointer: node.cast::<pm_alias_global_variable_node_t>(), marker: PhantomData },
1894            PM_ALIAS_METHOD_NODE => Self::AliasMethodNode { parser, pointer: node.cast::<pm_alias_method_node_t>(), marker: PhantomData },
1895            PM_ALTERNATION_PATTERN_NODE => Self::AlternationPatternNode { parser, pointer: node.cast::<pm_alternation_pattern_node_t>(), marker: PhantomData },
1896            PM_AND_NODE => Self::AndNode { parser, pointer: node.cast::<pm_and_node_t>(), marker: PhantomData },
1897            PM_ARGUMENTS_NODE => Self::ArgumentsNode { parser, pointer: node.cast::<pm_arguments_node_t>(), marker: PhantomData },
1898            PM_ARRAY_NODE => Self::ArrayNode { parser, pointer: node.cast::<pm_array_node_t>(), marker: PhantomData },
1899            PM_ARRAY_PATTERN_NODE => Self::ArrayPatternNode { parser, pointer: node.cast::<pm_array_pattern_node_t>(), marker: PhantomData },
1900            PM_ASSOC_NODE => Self::AssocNode { parser, pointer: node.cast::<pm_assoc_node_t>(), marker: PhantomData },
1901            PM_ASSOC_SPLAT_NODE => Self::AssocSplatNode { parser, pointer: node.cast::<pm_assoc_splat_node_t>(), marker: PhantomData },
1902            PM_BACK_REFERENCE_READ_NODE => Self::BackReferenceReadNode { parser, pointer: node.cast::<pm_back_reference_read_node_t>(), marker: PhantomData },
1903            PM_BEGIN_NODE => Self::BeginNode { parser, pointer: node.cast::<pm_begin_node_t>(), marker: PhantomData },
1904            PM_BLOCK_ARGUMENT_NODE => Self::BlockArgumentNode { parser, pointer: node.cast::<pm_block_argument_node_t>(), marker: PhantomData },
1905            PM_BLOCK_LOCAL_VARIABLE_NODE => Self::BlockLocalVariableNode { parser, pointer: node.cast::<pm_block_local_variable_node_t>(), marker: PhantomData },
1906            PM_BLOCK_NODE => Self::BlockNode { parser, pointer: node.cast::<pm_block_node_t>(), marker: PhantomData },
1907            PM_BLOCK_PARAMETER_NODE => Self::BlockParameterNode { parser, pointer: node.cast::<pm_block_parameter_node_t>(), marker: PhantomData },
1908            PM_BLOCK_PARAMETERS_NODE => Self::BlockParametersNode { parser, pointer: node.cast::<pm_block_parameters_node_t>(), marker: PhantomData },
1909            PM_BREAK_NODE => Self::BreakNode { parser, pointer: node.cast::<pm_break_node_t>(), marker: PhantomData },
1910            PM_CALL_AND_WRITE_NODE => Self::CallAndWriteNode { parser, pointer: node.cast::<pm_call_and_write_node_t>(), marker: PhantomData },
1911            PM_CALL_NODE => Self::CallNode { parser, pointer: node.cast::<pm_call_node_t>(), marker: PhantomData },
1912            PM_CALL_OPERATOR_WRITE_NODE => Self::CallOperatorWriteNode { parser, pointer: node.cast::<pm_call_operator_write_node_t>(), marker: PhantomData },
1913            PM_CALL_OR_WRITE_NODE => Self::CallOrWriteNode { parser, pointer: node.cast::<pm_call_or_write_node_t>(), marker: PhantomData },
1914            PM_CALL_TARGET_NODE => Self::CallTargetNode { parser, pointer: node.cast::<pm_call_target_node_t>(), marker: PhantomData },
1915            PM_CAPTURE_PATTERN_NODE => Self::CapturePatternNode { parser, pointer: node.cast::<pm_capture_pattern_node_t>(), marker: PhantomData },
1916            PM_CASE_MATCH_NODE => Self::CaseMatchNode { parser, pointer: node.cast::<pm_case_match_node_t>(), marker: PhantomData },
1917            PM_CASE_NODE => Self::CaseNode { parser, pointer: node.cast::<pm_case_node_t>(), marker: PhantomData },
1918            PM_CLASS_NODE => Self::ClassNode { parser, pointer: node.cast::<pm_class_node_t>(), marker: PhantomData },
1919            PM_CLASS_VARIABLE_AND_WRITE_NODE => Self::ClassVariableAndWriteNode { parser, pointer: node.cast::<pm_class_variable_and_write_node_t>(), marker: PhantomData },
1920            PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE => Self::ClassVariableOperatorWriteNode { parser, pointer: node.cast::<pm_class_variable_operator_write_node_t>(), marker: PhantomData },
1921            PM_CLASS_VARIABLE_OR_WRITE_NODE => Self::ClassVariableOrWriteNode { parser, pointer: node.cast::<pm_class_variable_or_write_node_t>(), marker: PhantomData },
1922            PM_CLASS_VARIABLE_READ_NODE => Self::ClassVariableReadNode { parser, pointer: node.cast::<pm_class_variable_read_node_t>(), marker: PhantomData },
1923            PM_CLASS_VARIABLE_TARGET_NODE => Self::ClassVariableTargetNode { parser, pointer: node.cast::<pm_class_variable_target_node_t>(), marker: PhantomData },
1924            PM_CLASS_VARIABLE_WRITE_NODE => Self::ClassVariableWriteNode { parser, pointer: node.cast::<pm_class_variable_write_node_t>(), marker: PhantomData },
1925            PM_CONSTANT_AND_WRITE_NODE => Self::ConstantAndWriteNode { parser, pointer: node.cast::<pm_constant_and_write_node_t>(), marker: PhantomData },
1926            PM_CONSTANT_OPERATOR_WRITE_NODE => Self::ConstantOperatorWriteNode { parser, pointer: node.cast::<pm_constant_operator_write_node_t>(), marker: PhantomData },
1927            PM_CONSTANT_OR_WRITE_NODE => Self::ConstantOrWriteNode { parser, pointer: node.cast::<pm_constant_or_write_node_t>(), marker: PhantomData },
1928            PM_CONSTANT_PATH_AND_WRITE_NODE => Self::ConstantPathAndWriteNode { parser, pointer: node.cast::<pm_constant_path_and_write_node_t>(), marker: PhantomData },
1929            PM_CONSTANT_PATH_NODE => Self::ConstantPathNode { parser, pointer: node.cast::<pm_constant_path_node_t>(), marker: PhantomData },
1930            PM_CONSTANT_PATH_OPERATOR_WRITE_NODE => Self::ConstantPathOperatorWriteNode { parser, pointer: node.cast::<pm_constant_path_operator_write_node_t>(), marker: PhantomData },
1931            PM_CONSTANT_PATH_OR_WRITE_NODE => Self::ConstantPathOrWriteNode { parser, pointer: node.cast::<pm_constant_path_or_write_node_t>(), marker: PhantomData },
1932            PM_CONSTANT_PATH_TARGET_NODE => Self::ConstantPathTargetNode { parser, pointer: node.cast::<pm_constant_path_target_node_t>(), marker: PhantomData },
1933            PM_CONSTANT_PATH_WRITE_NODE => Self::ConstantPathWriteNode { parser, pointer: node.cast::<pm_constant_path_write_node_t>(), marker: PhantomData },
1934            PM_CONSTANT_READ_NODE => Self::ConstantReadNode { parser, pointer: node.cast::<pm_constant_read_node_t>(), marker: PhantomData },
1935            PM_CONSTANT_TARGET_NODE => Self::ConstantTargetNode { parser, pointer: node.cast::<pm_constant_target_node_t>(), marker: PhantomData },
1936            PM_CONSTANT_WRITE_NODE => Self::ConstantWriteNode { parser, pointer: node.cast::<pm_constant_write_node_t>(), marker: PhantomData },
1937            PM_DEF_NODE => Self::DefNode { parser, pointer: node.cast::<pm_def_node_t>(), marker: PhantomData },
1938            PM_DEFINED_NODE => Self::DefinedNode { parser, pointer: node.cast::<pm_defined_node_t>(), marker: PhantomData },
1939            PM_ELSE_NODE => Self::ElseNode { parser, pointer: node.cast::<pm_else_node_t>(), marker: PhantomData },
1940            PM_EMBEDDED_STATEMENTS_NODE => Self::EmbeddedStatementsNode { parser, pointer: node.cast::<pm_embedded_statements_node_t>(), marker: PhantomData },
1941            PM_EMBEDDED_VARIABLE_NODE => Self::EmbeddedVariableNode { parser, pointer: node.cast::<pm_embedded_variable_node_t>(), marker: PhantomData },
1942            PM_ENSURE_NODE => Self::EnsureNode { parser, pointer: node.cast::<pm_ensure_node_t>(), marker: PhantomData },
1943            PM_ERROR_RECOVERY_NODE => Self::ErrorRecoveryNode { parser, pointer: node.cast::<pm_error_recovery_node_t>(), marker: PhantomData },
1944            PM_FALSE_NODE => Self::FalseNode { parser, pointer: node.cast::<pm_false_node_t>(), marker: PhantomData },
1945            PM_FIND_PATTERN_NODE => Self::FindPatternNode { parser, pointer: node.cast::<pm_find_pattern_node_t>(), marker: PhantomData },
1946            PM_FLIP_FLOP_NODE => Self::FlipFlopNode { parser, pointer: node.cast::<pm_flip_flop_node_t>(), marker: PhantomData },
1947            PM_FLOAT_NODE => Self::FloatNode { parser, pointer: node.cast::<pm_float_node_t>(), marker: PhantomData },
1948            PM_FOR_NODE => Self::ForNode { parser, pointer: node.cast::<pm_for_node_t>(), marker: PhantomData },
1949            PM_FORWARDING_ARGUMENTS_NODE => Self::ForwardingArgumentsNode { parser, pointer: node.cast::<pm_forwarding_arguments_node_t>(), marker: PhantomData },
1950            PM_FORWARDING_PARAMETER_NODE => Self::ForwardingParameterNode { parser, pointer: node.cast::<pm_forwarding_parameter_node_t>(), marker: PhantomData },
1951            PM_FORWARDING_SUPER_NODE => Self::ForwardingSuperNode { parser, pointer: node.cast::<pm_forwarding_super_node_t>(), marker: PhantomData },
1952            PM_GLOBAL_VARIABLE_AND_WRITE_NODE => Self::GlobalVariableAndWriteNode { parser, pointer: node.cast::<pm_global_variable_and_write_node_t>(), marker: PhantomData },
1953            PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE => Self::GlobalVariableOperatorWriteNode { parser, pointer: node.cast::<pm_global_variable_operator_write_node_t>(), marker: PhantomData },
1954            PM_GLOBAL_VARIABLE_OR_WRITE_NODE => Self::GlobalVariableOrWriteNode { parser, pointer: node.cast::<pm_global_variable_or_write_node_t>(), marker: PhantomData },
1955            PM_GLOBAL_VARIABLE_READ_NODE => Self::GlobalVariableReadNode { parser, pointer: node.cast::<pm_global_variable_read_node_t>(), marker: PhantomData },
1956            PM_GLOBAL_VARIABLE_TARGET_NODE => Self::GlobalVariableTargetNode { parser, pointer: node.cast::<pm_global_variable_target_node_t>(), marker: PhantomData },
1957            PM_GLOBAL_VARIABLE_WRITE_NODE => Self::GlobalVariableWriteNode { parser, pointer: node.cast::<pm_global_variable_write_node_t>(), marker: PhantomData },
1958            PM_HASH_NODE => Self::HashNode { parser, pointer: node.cast::<pm_hash_node_t>(), marker: PhantomData },
1959            PM_HASH_PATTERN_NODE => Self::HashPatternNode { parser, pointer: node.cast::<pm_hash_pattern_node_t>(), marker: PhantomData },
1960            PM_IF_NODE => Self::IfNode { parser, pointer: node.cast::<pm_if_node_t>(), marker: PhantomData },
1961            PM_IMAGINARY_NODE => Self::ImaginaryNode { parser, pointer: node.cast::<pm_imaginary_node_t>(), marker: PhantomData },
1962            PM_IMPLICIT_NODE => Self::ImplicitNode { parser, pointer: node.cast::<pm_implicit_node_t>(), marker: PhantomData },
1963            PM_IMPLICIT_REST_NODE => Self::ImplicitRestNode { parser, pointer: node.cast::<pm_implicit_rest_node_t>(), marker: PhantomData },
1964            PM_IN_NODE => Self::InNode { parser, pointer: node.cast::<pm_in_node_t>(), marker: PhantomData },
1965            PM_INDEX_AND_WRITE_NODE => Self::IndexAndWriteNode { parser, pointer: node.cast::<pm_index_and_write_node_t>(), marker: PhantomData },
1966            PM_INDEX_OPERATOR_WRITE_NODE => Self::IndexOperatorWriteNode { parser, pointer: node.cast::<pm_index_operator_write_node_t>(), marker: PhantomData },
1967            PM_INDEX_OR_WRITE_NODE => Self::IndexOrWriteNode { parser, pointer: node.cast::<pm_index_or_write_node_t>(), marker: PhantomData },
1968            PM_INDEX_TARGET_NODE => Self::IndexTargetNode { parser, pointer: node.cast::<pm_index_target_node_t>(), marker: PhantomData },
1969            PM_INSTANCE_VARIABLE_AND_WRITE_NODE => Self::InstanceVariableAndWriteNode { parser, pointer: node.cast::<pm_instance_variable_and_write_node_t>(), marker: PhantomData },
1970            PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE => Self::InstanceVariableOperatorWriteNode { parser, pointer: node.cast::<pm_instance_variable_operator_write_node_t>(), marker: PhantomData },
1971            PM_INSTANCE_VARIABLE_OR_WRITE_NODE => Self::InstanceVariableOrWriteNode { parser, pointer: node.cast::<pm_instance_variable_or_write_node_t>(), marker: PhantomData },
1972            PM_INSTANCE_VARIABLE_READ_NODE => Self::InstanceVariableReadNode { parser, pointer: node.cast::<pm_instance_variable_read_node_t>(), marker: PhantomData },
1973            PM_INSTANCE_VARIABLE_TARGET_NODE => Self::InstanceVariableTargetNode { parser, pointer: node.cast::<pm_instance_variable_target_node_t>(), marker: PhantomData },
1974            PM_INSTANCE_VARIABLE_WRITE_NODE => Self::InstanceVariableWriteNode { parser, pointer: node.cast::<pm_instance_variable_write_node_t>(), marker: PhantomData },
1975            PM_INTEGER_NODE => Self::IntegerNode { parser, pointer: node.cast::<pm_integer_node_t>(), marker: PhantomData },
1976            PM_INTERPOLATED_MATCH_LAST_LINE_NODE => Self::InterpolatedMatchLastLineNode { parser, pointer: node.cast::<pm_interpolated_match_last_line_node_t>(), marker: PhantomData },
1977            PM_INTERPOLATED_REGULAR_EXPRESSION_NODE => Self::InterpolatedRegularExpressionNode { parser, pointer: node.cast::<pm_interpolated_regular_expression_node_t>(), marker: PhantomData },
1978            PM_INTERPOLATED_STRING_NODE => Self::InterpolatedStringNode { parser, pointer: node.cast::<pm_interpolated_string_node_t>(), marker: PhantomData },
1979            PM_INTERPOLATED_SYMBOL_NODE => Self::InterpolatedSymbolNode { parser, pointer: node.cast::<pm_interpolated_symbol_node_t>(), marker: PhantomData },
1980            PM_INTERPOLATED_X_STRING_NODE => Self::InterpolatedXStringNode { parser, pointer: node.cast::<pm_interpolated_x_string_node_t>(), marker: PhantomData },
1981            PM_IT_LOCAL_VARIABLE_READ_NODE => Self::ItLocalVariableReadNode { parser, pointer: node.cast::<pm_it_local_variable_read_node_t>(), marker: PhantomData },
1982            PM_IT_PARAMETERS_NODE => Self::ItParametersNode { parser, pointer: node.cast::<pm_it_parameters_node_t>(), marker: PhantomData },
1983            PM_KEYWORD_HASH_NODE => Self::KeywordHashNode { parser, pointer: node.cast::<pm_keyword_hash_node_t>(), marker: PhantomData },
1984            PM_KEYWORD_REST_PARAMETER_NODE => Self::KeywordRestParameterNode { parser, pointer: node.cast::<pm_keyword_rest_parameter_node_t>(), marker: PhantomData },
1985            PM_LAMBDA_NODE => Self::LambdaNode { parser, pointer: node.cast::<pm_lambda_node_t>(), marker: PhantomData },
1986            PM_LOCAL_VARIABLE_AND_WRITE_NODE => Self::LocalVariableAndWriteNode { parser, pointer: node.cast::<pm_local_variable_and_write_node_t>(), marker: PhantomData },
1987            PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE => Self::LocalVariableOperatorWriteNode { parser, pointer: node.cast::<pm_local_variable_operator_write_node_t>(), marker: PhantomData },
1988            PM_LOCAL_VARIABLE_OR_WRITE_NODE => Self::LocalVariableOrWriteNode { parser, pointer: node.cast::<pm_local_variable_or_write_node_t>(), marker: PhantomData },
1989            PM_LOCAL_VARIABLE_READ_NODE => Self::LocalVariableReadNode { parser, pointer: node.cast::<pm_local_variable_read_node_t>(), marker: PhantomData },
1990            PM_LOCAL_VARIABLE_TARGET_NODE => Self::LocalVariableTargetNode { parser, pointer: node.cast::<pm_local_variable_target_node_t>(), marker: PhantomData },
1991            PM_LOCAL_VARIABLE_WRITE_NODE => Self::LocalVariableWriteNode { parser, pointer: node.cast::<pm_local_variable_write_node_t>(), marker: PhantomData },
1992            PM_MATCH_LAST_LINE_NODE => Self::MatchLastLineNode { parser, pointer: node.cast::<pm_match_last_line_node_t>(), marker: PhantomData },
1993            PM_MATCH_PREDICATE_NODE => Self::MatchPredicateNode { parser, pointer: node.cast::<pm_match_predicate_node_t>(), marker: PhantomData },
1994            PM_MATCH_REQUIRED_NODE => Self::MatchRequiredNode { parser, pointer: node.cast::<pm_match_required_node_t>(), marker: PhantomData },
1995            PM_MATCH_WRITE_NODE => Self::MatchWriteNode { parser, pointer: node.cast::<pm_match_write_node_t>(), marker: PhantomData },
1996            PM_MODULE_NODE => Self::ModuleNode { parser, pointer: node.cast::<pm_module_node_t>(), marker: PhantomData },
1997            PM_MULTI_TARGET_NODE => Self::MultiTargetNode { parser, pointer: node.cast::<pm_multi_target_node_t>(), marker: PhantomData },
1998            PM_MULTI_WRITE_NODE => Self::MultiWriteNode { parser, pointer: node.cast::<pm_multi_write_node_t>(), marker: PhantomData },
1999            PM_NEXT_NODE => Self::NextNode { parser, pointer: node.cast::<pm_next_node_t>(), marker: PhantomData },
2000            PM_NIL_NODE => Self::NilNode { parser, pointer: node.cast::<pm_nil_node_t>(), marker: PhantomData },
2001            PM_NO_BLOCK_PARAMETER_NODE => Self::NoBlockParameterNode { parser, pointer: node.cast::<pm_no_block_parameter_node_t>(), marker: PhantomData },
2002            PM_NO_KEYWORDS_PARAMETER_NODE => Self::NoKeywordsParameterNode { parser, pointer: node.cast::<pm_no_keywords_parameter_node_t>(), marker: PhantomData },
2003            PM_NUMBERED_PARAMETERS_NODE => Self::NumberedParametersNode { parser, pointer: node.cast::<pm_numbered_parameters_node_t>(), marker: PhantomData },
2004            PM_NUMBERED_REFERENCE_READ_NODE => Self::NumberedReferenceReadNode { parser, pointer: node.cast::<pm_numbered_reference_read_node_t>(), marker: PhantomData },
2005            PM_OPTIONAL_KEYWORD_PARAMETER_NODE => Self::OptionalKeywordParameterNode { parser, pointer: node.cast::<pm_optional_keyword_parameter_node_t>(), marker: PhantomData },
2006            PM_OPTIONAL_PARAMETER_NODE => Self::OptionalParameterNode { parser, pointer: node.cast::<pm_optional_parameter_node_t>(), marker: PhantomData },
2007            PM_OR_NODE => Self::OrNode { parser, pointer: node.cast::<pm_or_node_t>(), marker: PhantomData },
2008            PM_PARAMETERS_NODE => Self::ParametersNode { parser, pointer: node.cast::<pm_parameters_node_t>(), marker: PhantomData },
2009            PM_PARENTHESES_NODE => Self::ParenthesesNode { parser, pointer: node.cast::<pm_parentheses_node_t>(), marker: PhantomData },
2010            PM_PINNED_EXPRESSION_NODE => Self::PinnedExpressionNode { parser, pointer: node.cast::<pm_pinned_expression_node_t>(), marker: PhantomData },
2011            PM_PINNED_VARIABLE_NODE => Self::PinnedVariableNode { parser, pointer: node.cast::<pm_pinned_variable_node_t>(), marker: PhantomData },
2012            PM_POST_EXECUTION_NODE => Self::PostExecutionNode { parser, pointer: node.cast::<pm_post_execution_node_t>(), marker: PhantomData },
2013            PM_PRE_EXECUTION_NODE => Self::PreExecutionNode { parser, pointer: node.cast::<pm_pre_execution_node_t>(), marker: PhantomData },
2014            PM_PROGRAM_NODE => Self::ProgramNode { parser, pointer: node.cast::<pm_program_node_t>(), marker: PhantomData },
2015            PM_RANGE_NODE => Self::RangeNode { parser, pointer: node.cast::<pm_range_node_t>(), marker: PhantomData },
2016            PM_RATIONAL_NODE => Self::RationalNode { parser, pointer: node.cast::<pm_rational_node_t>(), marker: PhantomData },
2017            PM_REDO_NODE => Self::RedoNode { parser, pointer: node.cast::<pm_redo_node_t>(), marker: PhantomData },
2018            PM_REGULAR_EXPRESSION_NODE => Self::RegularExpressionNode { parser, pointer: node.cast::<pm_regular_expression_node_t>(), marker: PhantomData },
2019            PM_REQUIRED_KEYWORD_PARAMETER_NODE => Self::RequiredKeywordParameterNode { parser, pointer: node.cast::<pm_required_keyword_parameter_node_t>(), marker: PhantomData },
2020            PM_REQUIRED_PARAMETER_NODE => Self::RequiredParameterNode { parser, pointer: node.cast::<pm_required_parameter_node_t>(), marker: PhantomData },
2021            PM_RESCUE_MODIFIER_NODE => Self::RescueModifierNode { parser, pointer: node.cast::<pm_rescue_modifier_node_t>(), marker: PhantomData },
2022            PM_RESCUE_NODE => Self::RescueNode { parser, pointer: node.cast::<pm_rescue_node_t>(), marker: PhantomData },
2023            PM_REST_PARAMETER_NODE => Self::RestParameterNode { parser, pointer: node.cast::<pm_rest_parameter_node_t>(), marker: PhantomData },
2024            PM_RETRY_NODE => Self::RetryNode { parser, pointer: node.cast::<pm_retry_node_t>(), marker: PhantomData },
2025            PM_RETURN_NODE => Self::ReturnNode { parser, pointer: node.cast::<pm_return_node_t>(), marker: PhantomData },
2026            PM_SELF_NODE => Self::SelfNode { parser, pointer: node.cast::<pm_self_node_t>(), marker: PhantomData },
2027            PM_SHAREABLE_CONSTANT_NODE => Self::ShareableConstantNode { parser, pointer: node.cast::<pm_shareable_constant_node_t>(), marker: PhantomData },
2028            PM_SINGLETON_CLASS_NODE => Self::SingletonClassNode { parser, pointer: node.cast::<pm_singleton_class_node_t>(), marker: PhantomData },
2029            PM_SOURCE_ENCODING_NODE => Self::SourceEncodingNode { parser, pointer: node.cast::<pm_source_encoding_node_t>(), marker: PhantomData },
2030            PM_SOURCE_FILE_NODE => Self::SourceFileNode { parser, pointer: node.cast::<pm_source_file_node_t>(), marker: PhantomData },
2031            PM_SOURCE_LINE_NODE => Self::SourceLineNode { parser, pointer: node.cast::<pm_source_line_node_t>(), marker: PhantomData },
2032            PM_SPLAT_NODE => Self::SplatNode { parser, pointer: node.cast::<pm_splat_node_t>(), marker: PhantomData },
2033            PM_STATEMENTS_NODE => Self::StatementsNode { parser, pointer: node.cast::<pm_statements_node_t>(), marker: PhantomData },
2034            PM_STRING_NODE => Self::StringNode { parser, pointer: node.cast::<pm_string_node_t>(), marker: PhantomData },
2035            PM_SUPER_NODE => Self::SuperNode { parser, pointer: node.cast::<pm_super_node_t>(), marker: PhantomData },
2036            PM_SYMBOL_NODE => Self::SymbolNode { parser, pointer: node.cast::<pm_symbol_node_t>(), marker: PhantomData },
2037            PM_TRUE_NODE => Self::TrueNode { parser, pointer: node.cast::<pm_true_node_t>(), marker: PhantomData },
2038            PM_UNDEF_NODE => Self::UndefNode { parser, pointer: node.cast::<pm_undef_node_t>(), marker: PhantomData },
2039            PM_UNLESS_NODE => Self::UnlessNode { parser, pointer: node.cast::<pm_unless_node_t>(), marker: PhantomData },
2040            PM_UNTIL_NODE => Self::UntilNode { parser, pointer: node.cast::<pm_until_node_t>(), marker: PhantomData },
2041            PM_WHEN_NODE => Self::WhenNode { parser, pointer: node.cast::<pm_when_node_t>(), marker: PhantomData },
2042            PM_WHILE_NODE => Self::WhileNode { parser, pointer: node.cast::<pm_while_node_t>(), marker: PhantomData },
2043            PM_X_STRING_NODE => Self::XStringNode { parser, pointer: node.cast::<pm_x_string_node_t>(), marker: PhantomData },
2044            PM_YIELD_NODE => Self::YieldNode { parser, pointer: node.cast::<pm_yield_node_t>(), marker: PhantomData },
2045            _ => panic!("Unknown node type: {}", unsafe { (*node).type_ })
2046        }
2047    }
2048
2049    /// Returns the location of this node.
2050    #[must_use]
2051    pub fn location(&self) -> Location<'pr> {
2052        match *self {
2053            Self::AliasGlobalVariableNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2054            Self::AliasMethodNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2055            Self::AlternationPatternNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2056            Self::AndNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2057            Self::ArgumentsNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2058            Self::ArrayNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2059            Self::ArrayPatternNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2060            Self::AssocNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2061            Self::AssocSplatNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2062            Self::BackReferenceReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2063            Self::BeginNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2064            Self::BlockArgumentNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2065            Self::BlockLocalVariableNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2066            Self::BlockNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2067            Self::BlockParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2068            Self::BlockParametersNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2069            Self::BreakNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2070            Self::CallAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2071            Self::CallNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2072            Self::CallOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2073            Self::CallOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2074            Self::CallTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2075            Self::CapturePatternNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2076            Self::CaseMatchNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2077            Self::CaseNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2078            Self::ClassNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2079            Self::ClassVariableAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2080            Self::ClassVariableOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2081            Self::ClassVariableOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2082            Self::ClassVariableReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2083            Self::ClassVariableTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2084            Self::ClassVariableWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2085            Self::ConstantAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2086            Self::ConstantOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2087            Self::ConstantOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2088            Self::ConstantPathAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2089            Self::ConstantPathNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2090            Self::ConstantPathOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2091            Self::ConstantPathOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2092            Self::ConstantPathTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2093            Self::ConstantPathWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2094            Self::ConstantReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2095            Self::ConstantTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2096            Self::ConstantWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2097            Self::DefNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2098            Self::DefinedNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2099            Self::ElseNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2100            Self::EmbeddedStatementsNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2101            Self::EmbeddedVariableNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2102            Self::EnsureNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2103            Self::ErrorRecoveryNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2104            Self::FalseNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2105            Self::FindPatternNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2106            Self::FlipFlopNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2107            Self::FloatNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2108            Self::ForNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2109            Self::ForwardingArgumentsNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2110            Self::ForwardingParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2111            Self::ForwardingSuperNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2112            Self::GlobalVariableAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2113            Self::GlobalVariableOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2114            Self::GlobalVariableOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2115            Self::GlobalVariableReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2116            Self::GlobalVariableTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2117            Self::GlobalVariableWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2118            Self::HashNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2119            Self::HashPatternNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2120            Self::IfNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2121            Self::ImaginaryNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2122            Self::ImplicitNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2123            Self::ImplicitRestNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2124            Self::InNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2125            Self::IndexAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2126            Self::IndexOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2127            Self::IndexOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2128            Self::IndexTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2129            Self::InstanceVariableAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2130            Self::InstanceVariableOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2131            Self::InstanceVariableOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2132            Self::InstanceVariableReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2133            Self::InstanceVariableTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2134            Self::InstanceVariableWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2135            Self::IntegerNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2136            Self::InterpolatedMatchLastLineNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2137            Self::InterpolatedRegularExpressionNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2138            Self::InterpolatedStringNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2139            Self::InterpolatedSymbolNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2140            Self::InterpolatedXStringNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2141            Self::ItLocalVariableReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2142            Self::ItParametersNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2143            Self::KeywordHashNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2144            Self::KeywordRestParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2145            Self::LambdaNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2146            Self::LocalVariableAndWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2147            Self::LocalVariableOperatorWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2148            Self::LocalVariableOrWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2149            Self::LocalVariableReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2150            Self::LocalVariableTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2151            Self::LocalVariableWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2152            Self::MatchLastLineNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2153            Self::MatchPredicateNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2154            Self::MatchRequiredNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2155            Self::MatchWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2156            Self::ModuleNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2157            Self::MultiTargetNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2158            Self::MultiWriteNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2159            Self::NextNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2160            Self::NilNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2161            Self::NoBlockParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2162            Self::NoKeywordsParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2163            Self::NumberedParametersNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2164            Self::NumberedReferenceReadNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2165            Self::OptionalKeywordParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2166            Self::OptionalParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2167            Self::OrNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2168            Self::ParametersNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2169            Self::ParenthesesNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2170            Self::PinnedExpressionNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2171            Self::PinnedVariableNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2172            Self::PostExecutionNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2173            Self::PreExecutionNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2174            Self::ProgramNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2175            Self::RangeNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2176            Self::RationalNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2177            Self::RedoNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2178            Self::RegularExpressionNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2179            Self::RequiredKeywordParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2180            Self::RequiredParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2181            Self::RescueModifierNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2182            Self::RescueNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2183            Self::RestParameterNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2184            Self::RetryNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2185            Self::ReturnNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2186            Self::SelfNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2187            Self::ShareableConstantNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2188            Self::SingletonClassNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2189            Self::SourceEncodingNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2190            Self::SourceFileNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2191            Self::SourceLineNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2192            Self::SplatNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2193            Self::StatementsNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2194            Self::StringNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2195            Self::SuperNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2196            Self::SymbolNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2197            Self::TrueNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2198            Self::UndefNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2199            Self::UnlessNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2200            Self::UntilNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2201            Self::WhenNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2202            Self::WhileNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2203            Self::XStringNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2204            Self::YieldNode { pointer, parser, .. } => Location::new(parser, unsafe { &((*pointer.cast::<pm_node_t>()).location) }),
2205        }
2206    }
2207
2208    /// Returns the node as a `AliasGlobalVariableNode`.
2209    #[must_use]
2210    pub const fn as_alias_global_variable_node(&self) -> Option<AliasGlobalVariableNode<'pr>> {
2211        match *self {
2212            Self::AliasGlobalVariableNode { parser, pointer, marker } => Some(AliasGlobalVariableNode { parser, pointer, marker }),
2213            _ => None
2214        }
2215    }
2216    /// Returns the node as a `AliasMethodNode`.
2217    #[must_use]
2218    pub const fn as_alias_method_node(&self) -> Option<AliasMethodNode<'pr>> {
2219        match *self {
2220            Self::AliasMethodNode { parser, pointer, marker } => Some(AliasMethodNode { parser, pointer, marker }),
2221            _ => None
2222        }
2223    }
2224    /// Returns the node as a `AlternationPatternNode`.
2225    #[must_use]
2226    pub const fn as_alternation_pattern_node(&self) -> Option<AlternationPatternNode<'pr>> {
2227        match *self {
2228            Self::AlternationPatternNode { parser, pointer, marker } => Some(AlternationPatternNode { parser, pointer, marker }),
2229            _ => None
2230        }
2231    }
2232    /// Returns the node as a `AndNode`.
2233    #[must_use]
2234    pub const fn as_and_node(&self) -> Option<AndNode<'pr>> {
2235        match *self {
2236            Self::AndNode { parser, pointer, marker } => Some(AndNode { parser, pointer, marker }),
2237            _ => None
2238        }
2239    }
2240    /// Returns the node as a `ArgumentsNode`.
2241    #[must_use]
2242    pub const fn as_arguments_node(&self) -> Option<ArgumentsNode<'pr>> {
2243        match *self {
2244            Self::ArgumentsNode { parser, pointer, marker } => Some(ArgumentsNode { parser, pointer, marker }),
2245            _ => None
2246        }
2247    }
2248    /// Returns the node as a `ArrayNode`.
2249    #[must_use]
2250    pub const fn as_array_node(&self) -> Option<ArrayNode<'pr>> {
2251        match *self {
2252            Self::ArrayNode { parser, pointer, marker } => Some(ArrayNode { parser, pointer, marker }),
2253            _ => None
2254        }
2255    }
2256    /// Returns the node as a `ArrayPatternNode`.
2257    #[must_use]
2258    pub const fn as_array_pattern_node(&self) -> Option<ArrayPatternNode<'pr>> {
2259        match *self {
2260            Self::ArrayPatternNode { parser, pointer, marker } => Some(ArrayPatternNode { parser, pointer, marker }),
2261            _ => None
2262        }
2263    }
2264    /// Returns the node as a `AssocNode`.
2265    #[must_use]
2266    pub const fn as_assoc_node(&self) -> Option<AssocNode<'pr>> {
2267        match *self {
2268            Self::AssocNode { parser, pointer, marker } => Some(AssocNode { parser, pointer, marker }),
2269            _ => None
2270        }
2271    }
2272    /// Returns the node as a `AssocSplatNode`.
2273    #[must_use]
2274    pub const fn as_assoc_splat_node(&self) -> Option<AssocSplatNode<'pr>> {
2275        match *self {
2276            Self::AssocSplatNode { parser, pointer, marker } => Some(AssocSplatNode { parser, pointer, marker }),
2277            _ => None
2278        }
2279    }
2280    /// Returns the node as a `BackReferenceReadNode`.
2281    #[must_use]
2282    pub const fn as_back_reference_read_node(&self) -> Option<BackReferenceReadNode<'pr>> {
2283        match *self {
2284            Self::BackReferenceReadNode { parser, pointer, marker } => Some(BackReferenceReadNode { parser, pointer, marker }),
2285            _ => None
2286        }
2287    }
2288    /// Returns the node as a `BeginNode`.
2289    #[must_use]
2290    pub const fn as_begin_node(&self) -> Option<BeginNode<'pr>> {
2291        match *self {
2292            Self::BeginNode { parser, pointer, marker } => Some(BeginNode { parser, pointer, marker }),
2293            _ => None
2294        }
2295    }
2296    /// Returns the node as a `BlockArgumentNode`.
2297    #[must_use]
2298    pub const fn as_block_argument_node(&self) -> Option<BlockArgumentNode<'pr>> {
2299        match *self {
2300            Self::BlockArgumentNode { parser, pointer, marker } => Some(BlockArgumentNode { parser, pointer, marker }),
2301            _ => None
2302        }
2303    }
2304    /// Returns the node as a `BlockLocalVariableNode`.
2305    #[must_use]
2306    pub const fn as_block_local_variable_node(&self) -> Option<BlockLocalVariableNode<'pr>> {
2307        match *self {
2308            Self::BlockLocalVariableNode { parser, pointer, marker } => Some(BlockLocalVariableNode { parser, pointer, marker }),
2309            _ => None
2310        }
2311    }
2312    /// Returns the node as a `BlockNode`.
2313    #[must_use]
2314    pub const fn as_block_node(&self) -> Option<BlockNode<'pr>> {
2315        match *self {
2316            Self::BlockNode { parser, pointer, marker } => Some(BlockNode { parser, pointer, marker }),
2317            _ => None
2318        }
2319    }
2320    /// Returns the node as a `BlockParameterNode`.
2321    #[must_use]
2322    pub const fn as_block_parameter_node(&self) -> Option<BlockParameterNode<'pr>> {
2323        match *self {
2324            Self::BlockParameterNode { parser, pointer, marker } => Some(BlockParameterNode { parser, pointer, marker }),
2325            _ => None
2326        }
2327    }
2328    /// Returns the node as a `BlockParametersNode`.
2329    #[must_use]
2330    pub const fn as_block_parameters_node(&self) -> Option<BlockParametersNode<'pr>> {
2331        match *self {
2332            Self::BlockParametersNode { parser, pointer, marker } => Some(BlockParametersNode { parser, pointer, marker }),
2333            _ => None
2334        }
2335    }
2336    /// Returns the node as a `BreakNode`.
2337    #[must_use]
2338    pub const fn as_break_node(&self) -> Option<BreakNode<'pr>> {
2339        match *self {
2340            Self::BreakNode { parser, pointer, marker } => Some(BreakNode { parser, pointer, marker }),
2341            _ => None
2342        }
2343    }
2344    /// Returns the node as a `CallAndWriteNode`.
2345    #[must_use]
2346    pub const fn as_call_and_write_node(&self) -> Option<CallAndWriteNode<'pr>> {
2347        match *self {
2348            Self::CallAndWriteNode { parser, pointer, marker } => Some(CallAndWriteNode { parser, pointer, marker }),
2349            _ => None
2350        }
2351    }
2352    /// Returns the node as a `CallNode`.
2353    #[must_use]
2354    pub const fn as_call_node(&self) -> Option<CallNode<'pr>> {
2355        match *self {
2356            Self::CallNode { parser, pointer, marker } => Some(CallNode { parser, pointer, marker }),
2357            _ => None
2358        }
2359    }
2360    /// Returns the node as a `CallOperatorWriteNode`.
2361    #[must_use]
2362    pub const fn as_call_operator_write_node(&self) -> Option<CallOperatorWriteNode<'pr>> {
2363        match *self {
2364            Self::CallOperatorWriteNode { parser, pointer, marker } => Some(CallOperatorWriteNode { parser, pointer, marker }),
2365            _ => None
2366        }
2367    }
2368    /// Returns the node as a `CallOrWriteNode`.
2369    #[must_use]
2370    pub const fn as_call_or_write_node(&self) -> Option<CallOrWriteNode<'pr>> {
2371        match *self {
2372            Self::CallOrWriteNode { parser, pointer, marker } => Some(CallOrWriteNode { parser, pointer, marker }),
2373            _ => None
2374        }
2375    }
2376    /// Returns the node as a `CallTargetNode`.
2377    #[must_use]
2378    pub const fn as_call_target_node(&self) -> Option<CallTargetNode<'pr>> {
2379        match *self {
2380            Self::CallTargetNode { parser, pointer, marker } => Some(CallTargetNode { parser, pointer, marker }),
2381            _ => None
2382        }
2383    }
2384    /// Returns the node as a `CapturePatternNode`.
2385    #[must_use]
2386    pub const fn as_capture_pattern_node(&self) -> Option<CapturePatternNode<'pr>> {
2387        match *self {
2388            Self::CapturePatternNode { parser, pointer, marker } => Some(CapturePatternNode { parser, pointer, marker }),
2389            _ => None
2390        }
2391    }
2392    /// Returns the node as a `CaseMatchNode`.
2393    #[must_use]
2394    pub const fn as_case_match_node(&self) -> Option<CaseMatchNode<'pr>> {
2395        match *self {
2396            Self::CaseMatchNode { parser, pointer, marker } => Some(CaseMatchNode { parser, pointer, marker }),
2397            _ => None
2398        }
2399    }
2400    /// Returns the node as a `CaseNode`.
2401    #[must_use]
2402    pub const fn as_case_node(&self) -> Option<CaseNode<'pr>> {
2403        match *self {
2404            Self::CaseNode { parser, pointer, marker } => Some(CaseNode { parser, pointer, marker }),
2405            _ => None
2406        }
2407    }
2408    /// Returns the node as a `ClassNode`.
2409    #[must_use]
2410    pub const fn as_class_node(&self) -> Option<ClassNode<'pr>> {
2411        match *self {
2412            Self::ClassNode { parser, pointer, marker } => Some(ClassNode { parser, pointer, marker }),
2413            _ => None
2414        }
2415    }
2416    /// Returns the node as a `ClassVariableAndWriteNode`.
2417    #[must_use]
2418    pub const fn as_class_variable_and_write_node(&self) -> Option<ClassVariableAndWriteNode<'pr>> {
2419        match *self {
2420            Self::ClassVariableAndWriteNode { parser, pointer, marker } => Some(ClassVariableAndWriteNode { parser, pointer, marker }),
2421            _ => None
2422        }
2423    }
2424    /// Returns the node as a `ClassVariableOperatorWriteNode`.
2425    #[must_use]
2426    pub const fn as_class_variable_operator_write_node(&self) -> Option<ClassVariableOperatorWriteNode<'pr>> {
2427        match *self {
2428            Self::ClassVariableOperatorWriteNode { parser, pointer, marker } => Some(ClassVariableOperatorWriteNode { parser, pointer, marker }),
2429            _ => None
2430        }
2431    }
2432    /// Returns the node as a `ClassVariableOrWriteNode`.
2433    #[must_use]
2434    pub const fn as_class_variable_or_write_node(&self) -> Option<ClassVariableOrWriteNode<'pr>> {
2435        match *self {
2436            Self::ClassVariableOrWriteNode { parser, pointer, marker } => Some(ClassVariableOrWriteNode { parser, pointer, marker }),
2437            _ => None
2438        }
2439    }
2440    /// Returns the node as a `ClassVariableReadNode`.
2441    #[must_use]
2442    pub const fn as_class_variable_read_node(&self) -> Option<ClassVariableReadNode<'pr>> {
2443        match *self {
2444            Self::ClassVariableReadNode { parser, pointer, marker } => Some(ClassVariableReadNode { parser, pointer, marker }),
2445            _ => None
2446        }
2447    }
2448    /// Returns the node as a `ClassVariableTargetNode`.
2449    #[must_use]
2450    pub const fn as_class_variable_target_node(&self) -> Option<ClassVariableTargetNode<'pr>> {
2451        match *self {
2452            Self::ClassVariableTargetNode { parser, pointer, marker } => Some(ClassVariableTargetNode { parser, pointer, marker }),
2453            _ => None
2454        }
2455    }
2456    /// Returns the node as a `ClassVariableWriteNode`.
2457    #[must_use]
2458    pub const fn as_class_variable_write_node(&self) -> Option<ClassVariableWriteNode<'pr>> {
2459        match *self {
2460            Self::ClassVariableWriteNode { parser, pointer, marker } => Some(ClassVariableWriteNode { parser, pointer, marker }),
2461            _ => None
2462        }
2463    }
2464    /// Returns the node as a `ConstantAndWriteNode`.
2465    #[must_use]
2466    pub const fn as_constant_and_write_node(&self) -> Option<ConstantAndWriteNode<'pr>> {
2467        match *self {
2468            Self::ConstantAndWriteNode { parser, pointer, marker } => Some(ConstantAndWriteNode { parser, pointer, marker }),
2469            _ => None
2470        }
2471    }
2472    /// Returns the node as a `ConstantOperatorWriteNode`.
2473    #[must_use]
2474    pub const fn as_constant_operator_write_node(&self) -> Option<ConstantOperatorWriteNode<'pr>> {
2475        match *self {
2476            Self::ConstantOperatorWriteNode { parser, pointer, marker } => Some(ConstantOperatorWriteNode { parser, pointer, marker }),
2477            _ => None
2478        }
2479    }
2480    /// Returns the node as a `ConstantOrWriteNode`.
2481    #[must_use]
2482    pub const fn as_constant_or_write_node(&self) -> Option<ConstantOrWriteNode<'pr>> {
2483        match *self {
2484            Self::ConstantOrWriteNode { parser, pointer, marker } => Some(ConstantOrWriteNode { parser, pointer, marker }),
2485            _ => None
2486        }
2487    }
2488    /// Returns the node as a `ConstantPathAndWriteNode`.
2489    #[must_use]
2490    pub const fn as_constant_path_and_write_node(&self) -> Option<ConstantPathAndWriteNode<'pr>> {
2491        match *self {
2492            Self::ConstantPathAndWriteNode { parser, pointer, marker } => Some(ConstantPathAndWriteNode { parser, pointer, marker }),
2493            _ => None
2494        }
2495    }
2496    /// Returns the node as a `ConstantPathNode`.
2497    #[must_use]
2498    pub const fn as_constant_path_node(&self) -> Option<ConstantPathNode<'pr>> {
2499        match *self {
2500            Self::ConstantPathNode { parser, pointer, marker } => Some(ConstantPathNode { parser, pointer, marker }),
2501            _ => None
2502        }
2503    }
2504    /// Returns the node as a `ConstantPathOperatorWriteNode`.
2505    #[must_use]
2506    pub const fn as_constant_path_operator_write_node(&self) -> Option<ConstantPathOperatorWriteNode<'pr>> {
2507        match *self {
2508            Self::ConstantPathOperatorWriteNode { parser, pointer, marker } => Some(ConstantPathOperatorWriteNode { parser, pointer, marker }),
2509            _ => None
2510        }
2511    }
2512    /// Returns the node as a `ConstantPathOrWriteNode`.
2513    #[must_use]
2514    pub const fn as_constant_path_or_write_node(&self) -> Option<ConstantPathOrWriteNode<'pr>> {
2515        match *self {
2516            Self::ConstantPathOrWriteNode { parser, pointer, marker } => Some(ConstantPathOrWriteNode { parser, pointer, marker }),
2517            _ => None
2518        }
2519    }
2520    /// Returns the node as a `ConstantPathTargetNode`.
2521    #[must_use]
2522    pub const fn as_constant_path_target_node(&self) -> Option<ConstantPathTargetNode<'pr>> {
2523        match *self {
2524            Self::ConstantPathTargetNode { parser, pointer, marker } => Some(ConstantPathTargetNode { parser, pointer, marker }),
2525            _ => None
2526        }
2527    }
2528    /// Returns the node as a `ConstantPathWriteNode`.
2529    #[must_use]
2530    pub const fn as_constant_path_write_node(&self) -> Option<ConstantPathWriteNode<'pr>> {
2531        match *self {
2532            Self::ConstantPathWriteNode { parser, pointer, marker } => Some(ConstantPathWriteNode { parser, pointer, marker }),
2533            _ => None
2534        }
2535    }
2536    /// Returns the node as a `ConstantReadNode`.
2537    #[must_use]
2538    pub const fn as_constant_read_node(&self) -> Option<ConstantReadNode<'pr>> {
2539        match *self {
2540            Self::ConstantReadNode { parser, pointer, marker } => Some(ConstantReadNode { parser, pointer, marker }),
2541            _ => None
2542        }
2543    }
2544    /// Returns the node as a `ConstantTargetNode`.
2545    #[must_use]
2546    pub const fn as_constant_target_node(&self) -> Option<ConstantTargetNode<'pr>> {
2547        match *self {
2548            Self::ConstantTargetNode { parser, pointer, marker } => Some(ConstantTargetNode { parser, pointer, marker }),
2549            _ => None
2550        }
2551    }
2552    /// Returns the node as a `ConstantWriteNode`.
2553    #[must_use]
2554    pub const fn as_constant_write_node(&self) -> Option<ConstantWriteNode<'pr>> {
2555        match *self {
2556            Self::ConstantWriteNode { parser, pointer, marker } => Some(ConstantWriteNode { parser, pointer, marker }),
2557            _ => None
2558        }
2559    }
2560    /// Returns the node as a `DefNode`.
2561    #[must_use]
2562    pub const fn as_def_node(&self) -> Option<DefNode<'pr>> {
2563        match *self {
2564            Self::DefNode { parser, pointer, marker } => Some(DefNode { parser, pointer, marker }),
2565            _ => None
2566        }
2567    }
2568    /// Returns the node as a `DefinedNode`.
2569    #[must_use]
2570    pub const fn as_defined_node(&self) -> Option<DefinedNode<'pr>> {
2571        match *self {
2572            Self::DefinedNode { parser, pointer, marker } => Some(DefinedNode { parser, pointer, marker }),
2573            _ => None
2574        }
2575    }
2576    /// Returns the node as a `ElseNode`.
2577    #[must_use]
2578    pub const fn as_else_node(&self) -> Option<ElseNode<'pr>> {
2579        match *self {
2580            Self::ElseNode { parser, pointer, marker } => Some(ElseNode { parser, pointer, marker }),
2581            _ => None
2582        }
2583    }
2584    /// Returns the node as a `EmbeddedStatementsNode`.
2585    #[must_use]
2586    pub const fn as_embedded_statements_node(&self) -> Option<EmbeddedStatementsNode<'pr>> {
2587        match *self {
2588            Self::EmbeddedStatementsNode { parser, pointer, marker } => Some(EmbeddedStatementsNode { parser, pointer, marker }),
2589            _ => None
2590        }
2591    }
2592    /// Returns the node as a `EmbeddedVariableNode`.
2593    #[must_use]
2594    pub const fn as_embedded_variable_node(&self) -> Option<EmbeddedVariableNode<'pr>> {
2595        match *self {
2596            Self::EmbeddedVariableNode { parser, pointer, marker } => Some(EmbeddedVariableNode { parser, pointer, marker }),
2597            _ => None
2598        }
2599    }
2600    /// Returns the node as a `EnsureNode`.
2601    #[must_use]
2602    pub const fn as_ensure_node(&self) -> Option<EnsureNode<'pr>> {
2603        match *self {
2604            Self::EnsureNode { parser, pointer, marker } => Some(EnsureNode { parser, pointer, marker }),
2605            _ => None
2606        }
2607    }
2608    /// Returns the node as a `ErrorRecoveryNode`.
2609    #[must_use]
2610    pub const fn as_error_recovery_node(&self) -> Option<ErrorRecoveryNode<'pr>> {
2611        match *self {
2612            Self::ErrorRecoveryNode { parser, pointer, marker } => Some(ErrorRecoveryNode { parser, pointer, marker }),
2613            _ => None
2614        }
2615    }
2616    /// Returns the node as a `FalseNode`.
2617    #[must_use]
2618    pub const fn as_false_node(&self) -> Option<FalseNode<'pr>> {
2619        match *self {
2620            Self::FalseNode { parser, pointer, marker } => Some(FalseNode { parser, pointer, marker }),
2621            _ => None
2622        }
2623    }
2624    /// Returns the node as a `FindPatternNode`.
2625    #[must_use]
2626    pub const fn as_find_pattern_node(&self) -> Option<FindPatternNode<'pr>> {
2627        match *self {
2628            Self::FindPatternNode { parser, pointer, marker } => Some(FindPatternNode { parser, pointer, marker }),
2629            _ => None
2630        }
2631    }
2632    /// Returns the node as a `FlipFlopNode`.
2633    #[must_use]
2634    pub const fn as_flip_flop_node(&self) -> Option<FlipFlopNode<'pr>> {
2635        match *self {
2636            Self::FlipFlopNode { parser, pointer, marker } => Some(FlipFlopNode { parser, pointer, marker }),
2637            _ => None
2638        }
2639    }
2640    /// Returns the node as a `FloatNode`.
2641    #[must_use]
2642    pub const fn as_float_node(&self) -> Option<FloatNode<'pr>> {
2643        match *self {
2644            Self::FloatNode { parser, pointer, marker } => Some(FloatNode { parser, pointer, marker }),
2645            _ => None
2646        }
2647    }
2648    /// Returns the node as a `ForNode`.
2649    #[must_use]
2650    pub const fn as_for_node(&self) -> Option<ForNode<'pr>> {
2651        match *self {
2652            Self::ForNode { parser, pointer, marker } => Some(ForNode { parser, pointer, marker }),
2653            _ => None
2654        }
2655    }
2656    /// Returns the node as a `ForwardingArgumentsNode`.
2657    #[must_use]
2658    pub const fn as_forwarding_arguments_node(&self) -> Option<ForwardingArgumentsNode<'pr>> {
2659        match *self {
2660            Self::ForwardingArgumentsNode { parser, pointer, marker } => Some(ForwardingArgumentsNode { parser, pointer, marker }),
2661            _ => None
2662        }
2663    }
2664    /// Returns the node as a `ForwardingParameterNode`.
2665    #[must_use]
2666    pub const fn as_forwarding_parameter_node(&self) -> Option<ForwardingParameterNode<'pr>> {
2667        match *self {
2668            Self::ForwardingParameterNode { parser, pointer, marker } => Some(ForwardingParameterNode { parser, pointer, marker }),
2669            _ => None
2670        }
2671    }
2672    /// Returns the node as a `ForwardingSuperNode`.
2673    #[must_use]
2674    pub const fn as_forwarding_super_node(&self) -> Option<ForwardingSuperNode<'pr>> {
2675        match *self {
2676            Self::ForwardingSuperNode { parser, pointer, marker } => Some(ForwardingSuperNode { parser, pointer, marker }),
2677            _ => None
2678        }
2679    }
2680    /// Returns the node as a `GlobalVariableAndWriteNode`.
2681    #[must_use]
2682    pub const fn as_global_variable_and_write_node(&self) -> Option<GlobalVariableAndWriteNode<'pr>> {
2683        match *self {
2684            Self::GlobalVariableAndWriteNode { parser, pointer, marker } => Some(GlobalVariableAndWriteNode { parser, pointer, marker }),
2685            _ => None
2686        }
2687    }
2688    /// Returns the node as a `GlobalVariableOperatorWriteNode`.
2689    #[must_use]
2690    pub const fn as_global_variable_operator_write_node(&self) -> Option<GlobalVariableOperatorWriteNode<'pr>> {
2691        match *self {
2692            Self::GlobalVariableOperatorWriteNode { parser, pointer, marker } => Some(GlobalVariableOperatorWriteNode { parser, pointer, marker }),
2693            _ => None
2694        }
2695    }
2696    /// Returns the node as a `GlobalVariableOrWriteNode`.
2697    #[must_use]
2698    pub const fn as_global_variable_or_write_node(&self) -> Option<GlobalVariableOrWriteNode<'pr>> {
2699        match *self {
2700            Self::GlobalVariableOrWriteNode { parser, pointer, marker } => Some(GlobalVariableOrWriteNode { parser, pointer, marker }),
2701            _ => None
2702        }
2703    }
2704    /// Returns the node as a `GlobalVariableReadNode`.
2705    #[must_use]
2706    pub const fn as_global_variable_read_node(&self) -> Option<GlobalVariableReadNode<'pr>> {
2707        match *self {
2708            Self::GlobalVariableReadNode { parser, pointer, marker } => Some(GlobalVariableReadNode { parser, pointer, marker }),
2709            _ => None
2710        }
2711    }
2712    /// Returns the node as a `GlobalVariableTargetNode`.
2713    #[must_use]
2714    pub const fn as_global_variable_target_node(&self) -> Option<GlobalVariableTargetNode<'pr>> {
2715        match *self {
2716            Self::GlobalVariableTargetNode { parser, pointer, marker } => Some(GlobalVariableTargetNode { parser, pointer, marker }),
2717            _ => None
2718        }
2719    }
2720    /// Returns the node as a `GlobalVariableWriteNode`.
2721    #[must_use]
2722    pub const fn as_global_variable_write_node(&self) -> Option<GlobalVariableWriteNode<'pr>> {
2723        match *self {
2724            Self::GlobalVariableWriteNode { parser, pointer, marker } => Some(GlobalVariableWriteNode { parser, pointer, marker }),
2725            _ => None
2726        }
2727    }
2728    /// Returns the node as a `HashNode`.
2729    #[must_use]
2730    pub const fn as_hash_node(&self) -> Option<HashNode<'pr>> {
2731        match *self {
2732            Self::HashNode { parser, pointer, marker } => Some(HashNode { parser, pointer, marker }),
2733            _ => None
2734        }
2735    }
2736    /// Returns the node as a `HashPatternNode`.
2737    #[must_use]
2738    pub const fn as_hash_pattern_node(&self) -> Option<HashPatternNode<'pr>> {
2739        match *self {
2740            Self::HashPatternNode { parser, pointer, marker } => Some(HashPatternNode { parser, pointer, marker }),
2741            _ => None
2742        }
2743    }
2744    /// Returns the node as a `IfNode`.
2745    #[must_use]
2746    pub const fn as_if_node(&self) -> Option<IfNode<'pr>> {
2747        match *self {
2748            Self::IfNode { parser, pointer, marker } => Some(IfNode { parser, pointer, marker }),
2749            _ => None
2750        }
2751    }
2752    /// Returns the node as a `ImaginaryNode`.
2753    #[must_use]
2754    pub const fn as_imaginary_node(&self) -> Option<ImaginaryNode<'pr>> {
2755        match *self {
2756            Self::ImaginaryNode { parser, pointer, marker } => Some(ImaginaryNode { parser, pointer, marker }),
2757            _ => None
2758        }
2759    }
2760    /// Returns the node as a `ImplicitNode`.
2761    #[must_use]
2762    pub const fn as_implicit_node(&self) -> Option<ImplicitNode<'pr>> {
2763        match *self {
2764            Self::ImplicitNode { parser, pointer, marker } => Some(ImplicitNode { parser, pointer, marker }),
2765            _ => None
2766        }
2767    }
2768    /// Returns the node as a `ImplicitRestNode`.
2769    #[must_use]
2770    pub const fn as_implicit_rest_node(&self) -> Option<ImplicitRestNode<'pr>> {
2771        match *self {
2772            Self::ImplicitRestNode { parser, pointer, marker } => Some(ImplicitRestNode { parser, pointer, marker }),
2773            _ => None
2774        }
2775    }
2776    /// Returns the node as a `InNode`.
2777    #[must_use]
2778    pub const fn as_in_node(&self) -> Option<InNode<'pr>> {
2779        match *self {
2780            Self::InNode { parser, pointer, marker } => Some(InNode { parser, pointer, marker }),
2781            _ => None
2782        }
2783    }
2784    /// Returns the node as a `IndexAndWriteNode`.
2785    #[must_use]
2786    pub const fn as_index_and_write_node(&self) -> Option<IndexAndWriteNode<'pr>> {
2787        match *self {
2788            Self::IndexAndWriteNode { parser, pointer, marker } => Some(IndexAndWriteNode { parser, pointer, marker }),
2789            _ => None
2790        }
2791    }
2792    /// Returns the node as a `IndexOperatorWriteNode`.
2793    #[must_use]
2794    pub const fn as_index_operator_write_node(&self) -> Option<IndexOperatorWriteNode<'pr>> {
2795        match *self {
2796            Self::IndexOperatorWriteNode { parser, pointer, marker } => Some(IndexOperatorWriteNode { parser, pointer, marker }),
2797            _ => None
2798        }
2799    }
2800    /// Returns the node as a `IndexOrWriteNode`.
2801    #[must_use]
2802    pub const fn as_index_or_write_node(&self) -> Option<IndexOrWriteNode<'pr>> {
2803        match *self {
2804            Self::IndexOrWriteNode { parser, pointer, marker } => Some(IndexOrWriteNode { parser, pointer, marker }),
2805            _ => None
2806        }
2807    }
2808    /// Returns the node as a `IndexTargetNode`.
2809    #[must_use]
2810    pub const fn as_index_target_node(&self) -> Option<IndexTargetNode<'pr>> {
2811        match *self {
2812            Self::IndexTargetNode { parser, pointer, marker } => Some(IndexTargetNode { parser, pointer, marker }),
2813            _ => None
2814        }
2815    }
2816    /// Returns the node as a `InstanceVariableAndWriteNode`.
2817    #[must_use]
2818    pub const fn as_instance_variable_and_write_node(&self) -> Option<InstanceVariableAndWriteNode<'pr>> {
2819        match *self {
2820            Self::InstanceVariableAndWriteNode { parser, pointer, marker } => Some(InstanceVariableAndWriteNode { parser, pointer, marker }),
2821            _ => None
2822        }
2823    }
2824    /// Returns the node as a `InstanceVariableOperatorWriteNode`.
2825    #[must_use]
2826    pub const fn as_instance_variable_operator_write_node(&self) -> Option<InstanceVariableOperatorWriteNode<'pr>> {
2827        match *self {
2828            Self::InstanceVariableOperatorWriteNode { parser, pointer, marker } => Some(InstanceVariableOperatorWriteNode { parser, pointer, marker }),
2829            _ => None
2830        }
2831    }
2832    /// Returns the node as a `InstanceVariableOrWriteNode`.
2833    #[must_use]
2834    pub const fn as_instance_variable_or_write_node(&self) -> Option<InstanceVariableOrWriteNode<'pr>> {
2835        match *self {
2836            Self::InstanceVariableOrWriteNode { parser, pointer, marker } => Some(InstanceVariableOrWriteNode { parser, pointer, marker }),
2837            _ => None
2838        }
2839    }
2840    /// Returns the node as a `InstanceVariableReadNode`.
2841    #[must_use]
2842    pub const fn as_instance_variable_read_node(&self) -> Option<InstanceVariableReadNode<'pr>> {
2843        match *self {
2844            Self::InstanceVariableReadNode { parser, pointer, marker } => Some(InstanceVariableReadNode { parser, pointer, marker }),
2845            _ => None
2846        }
2847    }
2848    /// Returns the node as a `InstanceVariableTargetNode`.
2849    #[must_use]
2850    pub const fn as_instance_variable_target_node(&self) -> Option<InstanceVariableTargetNode<'pr>> {
2851        match *self {
2852            Self::InstanceVariableTargetNode { parser, pointer, marker } => Some(InstanceVariableTargetNode { parser, pointer, marker }),
2853            _ => None
2854        }
2855    }
2856    /// Returns the node as a `InstanceVariableWriteNode`.
2857    #[must_use]
2858    pub const fn as_instance_variable_write_node(&self) -> Option<InstanceVariableWriteNode<'pr>> {
2859        match *self {
2860            Self::InstanceVariableWriteNode { parser, pointer, marker } => Some(InstanceVariableWriteNode { parser, pointer, marker }),
2861            _ => None
2862        }
2863    }
2864    /// Returns the node as a `IntegerNode`.
2865    #[must_use]
2866    pub const fn as_integer_node(&self) -> Option<IntegerNode<'pr>> {
2867        match *self {
2868            Self::IntegerNode { parser, pointer, marker } => Some(IntegerNode { parser, pointer, marker }),
2869            _ => None
2870        }
2871    }
2872    /// Returns the node as a `InterpolatedMatchLastLineNode`.
2873    #[must_use]
2874    pub const fn as_interpolated_match_last_line_node(&self) -> Option<InterpolatedMatchLastLineNode<'pr>> {
2875        match *self {
2876            Self::InterpolatedMatchLastLineNode { parser, pointer, marker } => Some(InterpolatedMatchLastLineNode { parser, pointer, marker }),
2877            _ => None
2878        }
2879    }
2880    /// Returns the node as a `InterpolatedRegularExpressionNode`.
2881    #[must_use]
2882    pub const fn as_interpolated_regular_expression_node(&self) -> Option<InterpolatedRegularExpressionNode<'pr>> {
2883        match *self {
2884            Self::InterpolatedRegularExpressionNode { parser, pointer, marker } => Some(InterpolatedRegularExpressionNode { parser, pointer, marker }),
2885            _ => None
2886        }
2887    }
2888    /// Returns the node as a `InterpolatedStringNode`.
2889    #[must_use]
2890    pub const fn as_interpolated_string_node(&self) -> Option<InterpolatedStringNode<'pr>> {
2891        match *self {
2892            Self::InterpolatedStringNode { parser, pointer, marker } => Some(InterpolatedStringNode { parser, pointer, marker }),
2893            _ => None
2894        }
2895    }
2896    /// Returns the node as a `InterpolatedSymbolNode`.
2897    #[must_use]
2898    pub const fn as_interpolated_symbol_node(&self) -> Option<InterpolatedSymbolNode<'pr>> {
2899        match *self {
2900            Self::InterpolatedSymbolNode { parser, pointer, marker } => Some(InterpolatedSymbolNode { parser, pointer, marker }),
2901            _ => None
2902        }
2903    }
2904    /// Returns the node as a `InterpolatedXStringNode`.
2905    #[must_use]
2906    pub const fn as_interpolated_x_string_node(&self) -> Option<InterpolatedXStringNode<'pr>> {
2907        match *self {
2908            Self::InterpolatedXStringNode { parser, pointer, marker } => Some(InterpolatedXStringNode { parser, pointer, marker }),
2909            _ => None
2910        }
2911    }
2912    /// Returns the node as a `ItLocalVariableReadNode`.
2913    #[must_use]
2914    pub const fn as_it_local_variable_read_node(&self) -> Option<ItLocalVariableReadNode<'pr>> {
2915        match *self {
2916            Self::ItLocalVariableReadNode { parser, pointer, marker } => Some(ItLocalVariableReadNode { parser, pointer, marker }),
2917            _ => None
2918        }
2919    }
2920    /// Returns the node as a `ItParametersNode`.
2921    #[must_use]
2922    pub const fn as_it_parameters_node(&self) -> Option<ItParametersNode<'pr>> {
2923        match *self {
2924            Self::ItParametersNode { parser, pointer, marker } => Some(ItParametersNode { parser, pointer, marker }),
2925            _ => None
2926        }
2927    }
2928    /// Returns the node as a `KeywordHashNode`.
2929    #[must_use]
2930    pub const fn as_keyword_hash_node(&self) -> Option<KeywordHashNode<'pr>> {
2931        match *self {
2932            Self::KeywordHashNode { parser, pointer, marker } => Some(KeywordHashNode { parser, pointer, marker }),
2933            _ => None
2934        }
2935    }
2936    /// Returns the node as a `KeywordRestParameterNode`.
2937    #[must_use]
2938    pub const fn as_keyword_rest_parameter_node(&self) -> Option<KeywordRestParameterNode<'pr>> {
2939        match *self {
2940            Self::KeywordRestParameterNode { parser, pointer, marker } => Some(KeywordRestParameterNode { parser, pointer, marker }),
2941            _ => None
2942        }
2943    }
2944    /// Returns the node as a `LambdaNode`.
2945    #[must_use]
2946    pub const fn as_lambda_node(&self) -> Option<LambdaNode<'pr>> {
2947        match *self {
2948            Self::LambdaNode { parser, pointer, marker } => Some(LambdaNode { parser, pointer, marker }),
2949            _ => None
2950        }
2951    }
2952    /// Returns the node as a `LocalVariableAndWriteNode`.
2953    #[must_use]
2954    pub const fn as_local_variable_and_write_node(&self) -> Option<LocalVariableAndWriteNode<'pr>> {
2955        match *self {
2956            Self::LocalVariableAndWriteNode { parser, pointer, marker } => Some(LocalVariableAndWriteNode { parser, pointer, marker }),
2957            _ => None
2958        }
2959    }
2960    /// Returns the node as a `LocalVariableOperatorWriteNode`.
2961    #[must_use]
2962    pub const fn as_local_variable_operator_write_node(&self) -> Option<LocalVariableOperatorWriteNode<'pr>> {
2963        match *self {
2964            Self::LocalVariableOperatorWriteNode { parser, pointer, marker } => Some(LocalVariableOperatorWriteNode { parser, pointer, marker }),
2965            _ => None
2966        }
2967    }
2968    /// Returns the node as a `LocalVariableOrWriteNode`.
2969    #[must_use]
2970    pub const fn as_local_variable_or_write_node(&self) -> Option<LocalVariableOrWriteNode<'pr>> {
2971        match *self {
2972            Self::LocalVariableOrWriteNode { parser, pointer, marker } => Some(LocalVariableOrWriteNode { parser, pointer, marker }),
2973            _ => None
2974        }
2975    }
2976    /// Returns the node as a `LocalVariableReadNode`.
2977    #[must_use]
2978    pub const fn as_local_variable_read_node(&self) -> Option<LocalVariableReadNode<'pr>> {
2979        match *self {
2980            Self::LocalVariableReadNode { parser, pointer, marker } => Some(LocalVariableReadNode { parser, pointer, marker }),
2981            _ => None
2982        }
2983    }
2984    /// Returns the node as a `LocalVariableTargetNode`.
2985    #[must_use]
2986    pub const fn as_local_variable_target_node(&self) -> Option<LocalVariableTargetNode<'pr>> {
2987        match *self {
2988            Self::LocalVariableTargetNode { parser, pointer, marker } => Some(LocalVariableTargetNode { parser, pointer, marker }),
2989            _ => None
2990        }
2991    }
2992    /// Returns the node as a `LocalVariableWriteNode`.
2993    #[must_use]
2994    pub const fn as_local_variable_write_node(&self) -> Option<LocalVariableWriteNode<'pr>> {
2995        match *self {
2996            Self::LocalVariableWriteNode { parser, pointer, marker } => Some(LocalVariableWriteNode { parser, pointer, marker }),
2997            _ => None
2998        }
2999    }
3000    /// Returns the node as a `MatchLastLineNode`.
3001    #[must_use]
3002    pub const fn as_match_last_line_node(&self) -> Option<MatchLastLineNode<'pr>> {
3003        match *self {
3004            Self::MatchLastLineNode { parser, pointer, marker } => Some(MatchLastLineNode { parser, pointer, marker }),
3005            _ => None
3006        }
3007    }
3008    /// Returns the node as a `MatchPredicateNode`.
3009    #[must_use]
3010    pub const fn as_match_predicate_node(&self) -> Option<MatchPredicateNode<'pr>> {
3011        match *self {
3012            Self::MatchPredicateNode { parser, pointer, marker } => Some(MatchPredicateNode { parser, pointer, marker }),
3013            _ => None
3014        }
3015    }
3016    /// Returns the node as a `MatchRequiredNode`.
3017    #[must_use]
3018    pub const fn as_match_required_node(&self) -> Option<MatchRequiredNode<'pr>> {
3019        match *self {
3020            Self::MatchRequiredNode { parser, pointer, marker } => Some(MatchRequiredNode { parser, pointer, marker }),
3021            _ => None
3022        }
3023    }
3024    /// Returns the node as a `MatchWriteNode`.
3025    #[must_use]
3026    pub const fn as_match_write_node(&self) -> Option<MatchWriteNode<'pr>> {
3027        match *self {
3028            Self::MatchWriteNode { parser, pointer, marker } => Some(MatchWriteNode { parser, pointer, marker }),
3029            _ => None
3030        }
3031    }
3032    /// Returns the node as a `ModuleNode`.
3033    #[must_use]
3034    pub const fn as_module_node(&self) -> Option<ModuleNode<'pr>> {
3035        match *self {
3036            Self::ModuleNode { parser, pointer, marker } => Some(ModuleNode { parser, pointer, marker }),
3037            _ => None
3038        }
3039    }
3040    /// Returns the node as a `MultiTargetNode`.
3041    #[must_use]
3042    pub const fn as_multi_target_node(&self) -> Option<MultiTargetNode<'pr>> {
3043        match *self {
3044            Self::MultiTargetNode { parser, pointer, marker } => Some(MultiTargetNode { parser, pointer, marker }),
3045            _ => None
3046        }
3047    }
3048    /// Returns the node as a `MultiWriteNode`.
3049    #[must_use]
3050    pub const fn as_multi_write_node(&self) -> Option<MultiWriteNode<'pr>> {
3051        match *self {
3052            Self::MultiWriteNode { parser, pointer, marker } => Some(MultiWriteNode { parser, pointer, marker }),
3053            _ => None
3054        }
3055    }
3056    /// Returns the node as a `NextNode`.
3057    #[must_use]
3058    pub const fn as_next_node(&self) -> Option<NextNode<'pr>> {
3059        match *self {
3060            Self::NextNode { parser, pointer, marker } => Some(NextNode { parser, pointer, marker }),
3061            _ => None
3062        }
3063    }
3064    /// Returns the node as a `NilNode`.
3065    #[must_use]
3066    pub const fn as_nil_node(&self) -> Option<NilNode<'pr>> {
3067        match *self {
3068            Self::NilNode { parser, pointer, marker } => Some(NilNode { parser, pointer, marker }),
3069            _ => None
3070        }
3071    }
3072    /// Returns the node as a `NoBlockParameterNode`.
3073    #[must_use]
3074    pub const fn as_no_block_parameter_node(&self) -> Option<NoBlockParameterNode<'pr>> {
3075        match *self {
3076            Self::NoBlockParameterNode { parser, pointer, marker } => Some(NoBlockParameterNode { parser, pointer, marker }),
3077            _ => None
3078        }
3079    }
3080    /// Returns the node as a `NoKeywordsParameterNode`.
3081    #[must_use]
3082    pub const fn as_no_keywords_parameter_node(&self) -> Option<NoKeywordsParameterNode<'pr>> {
3083        match *self {
3084            Self::NoKeywordsParameterNode { parser, pointer, marker } => Some(NoKeywordsParameterNode { parser, pointer, marker }),
3085            _ => None
3086        }
3087    }
3088    /// Returns the node as a `NumberedParametersNode`.
3089    #[must_use]
3090    pub const fn as_numbered_parameters_node(&self) -> Option<NumberedParametersNode<'pr>> {
3091        match *self {
3092            Self::NumberedParametersNode { parser, pointer, marker } => Some(NumberedParametersNode { parser, pointer, marker }),
3093            _ => None
3094        }
3095    }
3096    /// Returns the node as a `NumberedReferenceReadNode`.
3097    #[must_use]
3098    pub const fn as_numbered_reference_read_node(&self) -> Option<NumberedReferenceReadNode<'pr>> {
3099        match *self {
3100            Self::NumberedReferenceReadNode { parser, pointer, marker } => Some(NumberedReferenceReadNode { parser, pointer, marker }),
3101            _ => None
3102        }
3103    }
3104    /// Returns the node as a `OptionalKeywordParameterNode`.
3105    #[must_use]
3106    pub const fn as_optional_keyword_parameter_node(&self) -> Option<OptionalKeywordParameterNode<'pr>> {
3107        match *self {
3108            Self::OptionalKeywordParameterNode { parser, pointer, marker } => Some(OptionalKeywordParameterNode { parser, pointer, marker }),
3109            _ => None
3110        }
3111    }
3112    /// Returns the node as a `OptionalParameterNode`.
3113    #[must_use]
3114    pub const fn as_optional_parameter_node(&self) -> Option<OptionalParameterNode<'pr>> {
3115        match *self {
3116            Self::OptionalParameterNode { parser, pointer, marker } => Some(OptionalParameterNode { parser, pointer, marker }),
3117            _ => None
3118        }
3119    }
3120    /// Returns the node as a `OrNode`.
3121    #[must_use]
3122    pub const fn as_or_node(&self) -> Option<OrNode<'pr>> {
3123        match *self {
3124            Self::OrNode { parser, pointer, marker } => Some(OrNode { parser, pointer, marker }),
3125            _ => None
3126        }
3127    }
3128    /// Returns the node as a `ParametersNode`.
3129    #[must_use]
3130    pub const fn as_parameters_node(&self) -> Option<ParametersNode<'pr>> {
3131        match *self {
3132            Self::ParametersNode { parser, pointer, marker } => Some(ParametersNode { parser, pointer, marker }),
3133            _ => None
3134        }
3135    }
3136    /// Returns the node as a `ParenthesesNode`.
3137    #[must_use]
3138    pub const fn as_parentheses_node(&self) -> Option<ParenthesesNode<'pr>> {
3139        match *self {
3140            Self::ParenthesesNode { parser, pointer, marker } => Some(ParenthesesNode { parser, pointer, marker }),
3141            _ => None
3142        }
3143    }
3144    /// Returns the node as a `PinnedExpressionNode`.
3145    #[must_use]
3146    pub const fn as_pinned_expression_node(&self) -> Option<PinnedExpressionNode<'pr>> {
3147        match *self {
3148            Self::PinnedExpressionNode { parser, pointer, marker } => Some(PinnedExpressionNode { parser, pointer, marker }),
3149            _ => None
3150        }
3151    }
3152    /// Returns the node as a `PinnedVariableNode`.
3153    #[must_use]
3154    pub const fn as_pinned_variable_node(&self) -> Option<PinnedVariableNode<'pr>> {
3155        match *self {
3156            Self::PinnedVariableNode { parser, pointer, marker } => Some(PinnedVariableNode { parser, pointer, marker }),
3157            _ => None
3158        }
3159    }
3160    /// Returns the node as a `PostExecutionNode`.
3161    #[must_use]
3162    pub const fn as_post_execution_node(&self) -> Option<PostExecutionNode<'pr>> {
3163        match *self {
3164            Self::PostExecutionNode { parser, pointer, marker } => Some(PostExecutionNode { parser, pointer, marker }),
3165            _ => None
3166        }
3167    }
3168    /// Returns the node as a `PreExecutionNode`.
3169    #[must_use]
3170    pub const fn as_pre_execution_node(&self) -> Option<PreExecutionNode<'pr>> {
3171        match *self {
3172            Self::PreExecutionNode { parser, pointer, marker } => Some(PreExecutionNode { parser, pointer, marker }),
3173            _ => None
3174        }
3175    }
3176    /// Returns the node as a `ProgramNode`.
3177    #[must_use]
3178    pub const fn as_program_node(&self) -> Option<ProgramNode<'pr>> {
3179        match *self {
3180            Self::ProgramNode { parser, pointer, marker } => Some(ProgramNode { parser, pointer, marker }),
3181            _ => None
3182        }
3183    }
3184    /// Returns the node as a `RangeNode`.
3185    #[must_use]
3186    pub const fn as_range_node(&self) -> Option<RangeNode<'pr>> {
3187        match *self {
3188            Self::RangeNode { parser, pointer, marker } => Some(RangeNode { parser, pointer, marker }),
3189            _ => None
3190        }
3191    }
3192    /// Returns the node as a `RationalNode`.
3193    #[must_use]
3194    pub const fn as_rational_node(&self) -> Option<RationalNode<'pr>> {
3195        match *self {
3196            Self::RationalNode { parser, pointer, marker } => Some(RationalNode { parser, pointer, marker }),
3197            _ => None
3198        }
3199    }
3200    /// Returns the node as a `RedoNode`.
3201    #[must_use]
3202    pub const fn as_redo_node(&self) -> Option<RedoNode<'pr>> {
3203        match *self {
3204            Self::RedoNode { parser, pointer, marker } => Some(RedoNode { parser, pointer, marker }),
3205            _ => None
3206        }
3207    }
3208    /// Returns the node as a `RegularExpressionNode`.
3209    #[must_use]
3210    pub const fn as_regular_expression_node(&self) -> Option<RegularExpressionNode<'pr>> {
3211        match *self {
3212            Self::RegularExpressionNode { parser, pointer, marker } => Some(RegularExpressionNode { parser, pointer, marker }),
3213            _ => None
3214        }
3215    }
3216    /// Returns the node as a `RequiredKeywordParameterNode`.
3217    #[must_use]
3218    pub const fn as_required_keyword_parameter_node(&self) -> Option<RequiredKeywordParameterNode<'pr>> {
3219        match *self {
3220            Self::RequiredKeywordParameterNode { parser, pointer, marker } => Some(RequiredKeywordParameterNode { parser, pointer, marker }),
3221            _ => None
3222        }
3223    }
3224    /// Returns the node as a `RequiredParameterNode`.
3225    #[must_use]
3226    pub const fn as_required_parameter_node(&self) -> Option<RequiredParameterNode<'pr>> {
3227        match *self {
3228            Self::RequiredParameterNode { parser, pointer, marker } => Some(RequiredParameterNode { parser, pointer, marker }),
3229            _ => None
3230        }
3231    }
3232    /// Returns the node as a `RescueModifierNode`.
3233    #[must_use]
3234    pub const fn as_rescue_modifier_node(&self) -> Option<RescueModifierNode<'pr>> {
3235        match *self {
3236            Self::RescueModifierNode { parser, pointer, marker } => Some(RescueModifierNode { parser, pointer, marker }),
3237            _ => None
3238        }
3239    }
3240    /// Returns the node as a `RescueNode`.
3241    #[must_use]
3242    pub const fn as_rescue_node(&self) -> Option<RescueNode<'pr>> {
3243        match *self {
3244            Self::RescueNode { parser, pointer, marker } => Some(RescueNode { parser, pointer, marker }),
3245            _ => None
3246        }
3247    }
3248    /// Returns the node as a `RestParameterNode`.
3249    #[must_use]
3250    pub const fn as_rest_parameter_node(&self) -> Option<RestParameterNode<'pr>> {
3251        match *self {
3252            Self::RestParameterNode { parser, pointer, marker } => Some(RestParameterNode { parser, pointer, marker }),
3253            _ => None
3254        }
3255    }
3256    /// Returns the node as a `RetryNode`.
3257    #[must_use]
3258    pub const fn as_retry_node(&self) -> Option<RetryNode<'pr>> {
3259        match *self {
3260            Self::RetryNode { parser, pointer, marker } => Some(RetryNode { parser, pointer, marker }),
3261            _ => None
3262        }
3263    }
3264    /// Returns the node as a `ReturnNode`.
3265    #[must_use]
3266    pub const fn as_return_node(&self) -> Option<ReturnNode<'pr>> {
3267        match *self {
3268            Self::ReturnNode { parser, pointer, marker } => Some(ReturnNode { parser, pointer, marker }),
3269            _ => None
3270        }
3271    }
3272    /// Returns the node as a `SelfNode`.
3273    #[must_use]
3274    pub const fn as_self_node(&self) -> Option<SelfNode<'pr>> {
3275        match *self {
3276            Self::SelfNode { parser, pointer, marker } => Some(SelfNode { parser, pointer, marker }),
3277            _ => None
3278        }
3279    }
3280    /// Returns the node as a `ShareableConstantNode`.
3281    #[must_use]
3282    pub const fn as_shareable_constant_node(&self) -> Option<ShareableConstantNode<'pr>> {
3283        match *self {
3284            Self::ShareableConstantNode { parser, pointer, marker } => Some(ShareableConstantNode { parser, pointer, marker }),
3285            _ => None
3286        }
3287    }
3288    /// Returns the node as a `SingletonClassNode`.
3289    #[must_use]
3290    pub const fn as_singleton_class_node(&self) -> Option<SingletonClassNode<'pr>> {
3291        match *self {
3292            Self::SingletonClassNode { parser, pointer, marker } => Some(SingletonClassNode { parser, pointer, marker }),
3293            _ => None
3294        }
3295    }
3296    /// Returns the node as a `SourceEncodingNode`.
3297    #[must_use]
3298    pub const fn as_source_encoding_node(&self) -> Option<SourceEncodingNode<'pr>> {
3299        match *self {
3300            Self::SourceEncodingNode { parser, pointer, marker } => Some(SourceEncodingNode { parser, pointer, marker }),
3301            _ => None
3302        }
3303    }
3304    /// Returns the node as a `SourceFileNode`.
3305    #[must_use]
3306    pub const fn as_source_file_node(&self) -> Option<SourceFileNode<'pr>> {
3307        match *self {
3308            Self::SourceFileNode { parser, pointer, marker } => Some(SourceFileNode { parser, pointer, marker }),
3309            _ => None
3310        }
3311    }
3312    /// Returns the node as a `SourceLineNode`.
3313    #[must_use]
3314    pub const fn as_source_line_node(&self) -> Option<SourceLineNode<'pr>> {
3315        match *self {
3316            Self::SourceLineNode { parser, pointer, marker } => Some(SourceLineNode { parser, pointer, marker }),
3317            _ => None
3318        }
3319    }
3320    /// Returns the node as a `SplatNode`.
3321    #[must_use]
3322    pub const fn as_splat_node(&self) -> Option<SplatNode<'pr>> {
3323        match *self {
3324            Self::SplatNode { parser, pointer, marker } => Some(SplatNode { parser, pointer, marker }),
3325            _ => None
3326        }
3327    }
3328    /// Returns the node as a `StatementsNode`.
3329    #[must_use]
3330    pub const fn as_statements_node(&self) -> Option<StatementsNode<'pr>> {
3331        match *self {
3332            Self::StatementsNode { parser, pointer, marker } => Some(StatementsNode { parser, pointer, marker }),
3333            _ => None
3334        }
3335    }
3336    /// Returns the node as a `StringNode`.
3337    #[must_use]
3338    pub const fn as_string_node(&self) -> Option<StringNode<'pr>> {
3339        match *self {
3340            Self::StringNode { parser, pointer, marker } => Some(StringNode { parser, pointer, marker }),
3341            _ => None
3342        }
3343    }
3344    /// Returns the node as a `SuperNode`.
3345    #[must_use]
3346    pub const fn as_super_node(&self) -> Option<SuperNode<'pr>> {
3347        match *self {
3348            Self::SuperNode { parser, pointer, marker } => Some(SuperNode { parser, pointer, marker }),
3349            _ => None
3350        }
3351    }
3352    /// Returns the node as a `SymbolNode`.
3353    #[must_use]
3354    pub const fn as_symbol_node(&self) -> Option<SymbolNode<'pr>> {
3355        match *self {
3356            Self::SymbolNode { parser, pointer, marker } => Some(SymbolNode { parser, pointer, marker }),
3357            _ => None
3358        }
3359    }
3360    /// Returns the node as a `TrueNode`.
3361    #[must_use]
3362    pub const fn as_true_node(&self) -> Option<TrueNode<'pr>> {
3363        match *self {
3364            Self::TrueNode { parser, pointer, marker } => Some(TrueNode { parser, pointer, marker }),
3365            _ => None
3366        }
3367    }
3368    /// Returns the node as a `UndefNode`.
3369    #[must_use]
3370    pub const fn as_undef_node(&self) -> Option<UndefNode<'pr>> {
3371        match *self {
3372            Self::UndefNode { parser, pointer, marker } => Some(UndefNode { parser, pointer, marker }),
3373            _ => None
3374        }
3375    }
3376    /// Returns the node as a `UnlessNode`.
3377    #[must_use]
3378    pub const fn as_unless_node(&self) -> Option<UnlessNode<'pr>> {
3379        match *self {
3380            Self::UnlessNode { parser, pointer, marker } => Some(UnlessNode { parser, pointer, marker }),
3381            _ => None
3382        }
3383    }
3384    /// Returns the node as a `UntilNode`.
3385    #[must_use]
3386    pub const fn as_until_node(&self) -> Option<UntilNode<'pr>> {
3387        match *self {
3388            Self::UntilNode { parser, pointer, marker } => Some(UntilNode { parser, pointer, marker }),
3389            _ => None
3390        }
3391    }
3392    /// Returns the node as a `WhenNode`.
3393    #[must_use]
3394    pub const fn as_when_node(&self) -> Option<WhenNode<'pr>> {
3395        match *self {
3396            Self::WhenNode { parser, pointer, marker } => Some(WhenNode { parser, pointer, marker }),
3397            _ => None
3398        }
3399    }
3400    /// Returns the node as a `WhileNode`.
3401    #[must_use]
3402    pub const fn as_while_node(&self) -> Option<WhileNode<'pr>> {
3403        match *self {
3404            Self::WhileNode { parser, pointer, marker } => Some(WhileNode { parser, pointer, marker }),
3405            _ => None
3406        }
3407    }
3408    /// Returns the node as a `XStringNode`.
3409    #[must_use]
3410    pub const fn as_x_string_node(&self) -> Option<XStringNode<'pr>> {
3411        match *self {
3412            Self::XStringNode { parser, pointer, marker } => Some(XStringNode { parser, pointer, marker }),
3413            _ => None
3414        }
3415    }
3416    /// Returns the node as a `YieldNode`.
3417    #[must_use]
3418    pub const fn as_yield_node(&self) -> Option<YieldNode<'pr>> {
3419        match *self {
3420            Self::YieldNode { parser, pointer, marker } => Some(YieldNode { parser, pointer, marker }),
3421            _ => None
3422        }
3423    }
3424}
3425
3426impl std::fmt::Debug for Node<'_> {
3427    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3428        match *self {
3429            Self::AliasGlobalVariableNode { parser, pointer, marker } => write!(f, "{:?}", AliasGlobalVariableNode { parser, pointer, marker }),
3430            Self::AliasMethodNode { parser, pointer, marker } => write!(f, "{:?}", AliasMethodNode { parser, pointer, marker }),
3431            Self::AlternationPatternNode { parser, pointer, marker } => write!(f, "{:?}", AlternationPatternNode { parser, pointer, marker }),
3432            Self::AndNode { parser, pointer, marker } => write!(f, "{:?}", AndNode { parser, pointer, marker }),
3433            Self::ArgumentsNode { parser, pointer, marker } => write!(f, "{:?}", ArgumentsNode { parser, pointer, marker }),
3434            Self::ArrayNode { parser, pointer, marker } => write!(f, "{:?}", ArrayNode { parser, pointer, marker }),
3435            Self::ArrayPatternNode { parser, pointer, marker } => write!(f, "{:?}", ArrayPatternNode { parser, pointer, marker }),
3436            Self::AssocNode { parser, pointer, marker } => write!(f, "{:?}", AssocNode { parser, pointer, marker }),
3437            Self::AssocSplatNode { parser, pointer, marker } => write!(f, "{:?}", AssocSplatNode { parser, pointer, marker }),
3438            Self::BackReferenceReadNode { parser, pointer, marker } => write!(f, "{:?}", BackReferenceReadNode { parser, pointer, marker }),
3439            Self::BeginNode { parser, pointer, marker } => write!(f, "{:?}", BeginNode { parser, pointer, marker }),
3440            Self::BlockArgumentNode { parser, pointer, marker } => write!(f, "{:?}", BlockArgumentNode { parser, pointer, marker }),
3441            Self::BlockLocalVariableNode { parser, pointer, marker } => write!(f, "{:?}", BlockLocalVariableNode { parser, pointer, marker }),
3442            Self::BlockNode { parser, pointer, marker } => write!(f, "{:?}", BlockNode { parser, pointer, marker }),
3443            Self::BlockParameterNode { parser, pointer, marker } => write!(f, "{:?}", BlockParameterNode { parser, pointer, marker }),
3444            Self::BlockParametersNode { parser, pointer, marker } => write!(f, "{:?}", BlockParametersNode { parser, pointer, marker }),
3445            Self::BreakNode { parser, pointer, marker } => write!(f, "{:?}", BreakNode { parser, pointer, marker }),
3446            Self::CallAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", CallAndWriteNode { parser, pointer, marker }),
3447            Self::CallNode { parser, pointer, marker } => write!(f, "{:?}", CallNode { parser, pointer, marker }),
3448            Self::CallOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", CallOperatorWriteNode { parser, pointer, marker }),
3449            Self::CallOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", CallOrWriteNode { parser, pointer, marker }),
3450            Self::CallTargetNode { parser, pointer, marker } => write!(f, "{:?}", CallTargetNode { parser, pointer, marker }),
3451            Self::CapturePatternNode { parser, pointer, marker } => write!(f, "{:?}", CapturePatternNode { parser, pointer, marker }),
3452            Self::CaseMatchNode { parser, pointer, marker } => write!(f, "{:?}", CaseMatchNode { parser, pointer, marker }),
3453            Self::CaseNode { parser, pointer, marker } => write!(f, "{:?}", CaseNode { parser, pointer, marker }),
3454            Self::ClassNode { parser, pointer, marker } => write!(f, "{:?}", ClassNode { parser, pointer, marker }),
3455            Self::ClassVariableAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", ClassVariableAndWriteNode { parser, pointer, marker }),
3456            Self::ClassVariableOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", ClassVariableOperatorWriteNode { parser, pointer, marker }),
3457            Self::ClassVariableOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", ClassVariableOrWriteNode { parser, pointer, marker }),
3458            Self::ClassVariableReadNode { parser, pointer, marker } => write!(f, "{:?}", ClassVariableReadNode { parser, pointer, marker }),
3459            Self::ClassVariableTargetNode { parser, pointer, marker } => write!(f, "{:?}", ClassVariableTargetNode { parser, pointer, marker }),
3460            Self::ClassVariableWriteNode { parser, pointer, marker } => write!(f, "{:?}", ClassVariableWriteNode { parser, pointer, marker }),
3461            Self::ConstantAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantAndWriteNode { parser, pointer, marker }),
3462            Self::ConstantOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantOperatorWriteNode { parser, pointer, marker }),
3463            Self::ConstantOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantOrWriteNode { parser, pointer, marker }),
3464            Self::ConstantPathAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantPathAndWriteNode { parser, pointer, marker }),
3465            Self::ConstantPathNode { parser, pointer, marker } => write!(f, "{:?}", ConstantPathNode { parser, pointer, marker }),
3466            Self::ConstantPathOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantPathOperatorWriteNode { parser, pointer, marker }),
3467            Self::ConstantPathOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantPathOrWriteNode { parser, pointer, marker }),
3468            Self::ConstantPathTargetNode { parser, pointer, marker } => write!(f, "{:?}", ConstantPathTargetNode { parser, pointer, marker }),
3469            Self::ConstantPathWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantPathWriteNode { parser, pointer, marker }),
3470            Self::ConstantReadNode { parser, pointer, marker } => write!(f, "{:?}", ConstantReadNode { parser, pointer, marker }),
3471            Self::ConstantTargetNode { parser, pointer, marker } => write!(f, "{:?}", ConstantTargetNode { parser, pointer, marker }),
3472            Self::ConstantWriteNode { parser, pointer, marker } => write!(f, "{:?}", ConstantWriteNode { parser, pointer, marker }),
3473            Self::DefNode { parser, pointer, marker } => write!(f, "{:?}", DefNode { parser, pointer, marker }),
3474            Self::DefinedNode { parser, pointer, marker } => write!(f, "{:?}", DefinedNode { parser, pointer, marker }),
3475            Self::ElseNode { parser, pointer, marker } => write!(f, "{:?}", ElseNode { parser, pointer, marker }),
3476            Self::EmbeddedStatementsNode { parser, pointer, marker } => write!(f, "{:?}", EmbeddedStatementsNode { parser, pointer, marker }),
3477            Self::EmbeddedVariableNode { parser, pointer, marker } => write!(f, "{:?}", EmbeddedVariableNode { parser, pointer, marker }),
3478            Self::EnsureNode { parser, pointer, marker } => write!(f, "{:?}", EnsureNode { parser, pointer, marker }),
3479            Self::ErrorRecoveryNode { parser, pointer, marker } => write!(f, "{:?}", ErrorRecoveryNode { parser, pointer, marker }),
3480            Self::FalseNode { parser, pointer, marker } => write!(f, "{:?}", FalseNode { parser, pointer, marker }),
3481            Self::FindPatternNode { parser, pointer, marker } => write!(f, "{:?}", FindPatternNode { parser, pointer, marker }),
3482            Self::FlipFlopNode { parser, pointer, marker } => write!(f, "{:?}", FlipFlopNode { parser, pointer, marker }),
3483            Self::FloatNode { parser, pointer, marker } => write!(f, "{:?}", FloatNode { parser, pointer, marker }),
3484            Self::ForNode { parser, pointer, marker } => write!(f, "{:?}", ForNode { parser, pointer, marker }),
3485            Self::ForwardingArgumentsNode { parser, pointer, marker } => write!(f, "{:?}", ForwardingArgumentsNode { parser, pointer, marker }),
3486            Self::ForwardingParameterNode { parser, pointer, marker } => write!(f, "{:?}", ForwardingParameterNode { parser, pointer, marker }),
3487            Self::ForwardingSuperNode { parser, pointer, marker } => write!(f, "{:?}", ForwardingSuperNode { parser, pointer, marker }),
3488            Self::GlobalVariableAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", GlobalVariableAndWriteNode { parser, pointer, marker }),
3489            Self::GlobalVariableOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", GlobalVariableOperatorWriteNode { parser, pointer, marker }),
3490            Self::GlobalVariableOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", GlobalVariableOrWriteNode { parser, pointer, marker }),
3491            Self::GlobalVariableReadNode { parser, pointer, marker } => write!(f, "{:?}", GlobalVariableReadNode { parser, pointer, marker }),
3492            Self::GlobalVariableTargetNode { parser, pointer, marker } => write!(f, "{:?}", GlobalVariableTargetNode { parser, pointer, marker }),
3493            Self::GlobalVariableWriteNode { parser, pointer, marker } => write!(f, "{:?}", GlobalVariableWriteNode { parser, pointer, marker }),
3494            Self::HashNode { parser, pointer, marker } => write!(f, "{:?}", HashNode { parser, pointer, marker }),
3495            Self::HashPatternNode { parser, pointer, marker } => write!(f, "{:?}", HashPatternNode { parser, pointer, marker }),
3496            Self::IfNode { parser, pointer, marker } => write!(f, "{:?}", IfNode { parser, pointer, marker }),
3497            Self::ImaginaryNode { parser, pointer, marker } => write!(f, "{:?}", ImaginaryNode { parser, pointer, marker }),
3498            Self::ImplicitNode { parser, pointer, marker } => write!(f, "{:?}", ImplicitNode { parser, pointer, marker }),
3499            Self::ImplicitRestNode { parser, pointer, marker } => write!(f, "{:?}", ImplicitRestNode { parser, pointer, marker }),
3500            Self::InNode { parser, pointer, marker } => write!(f, "{:?}", InNode { parser, pointer, marker }),
3501            Self::IndexAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", IndexAndWriteNode { parser, pointer, marker }),
3502            Self::IndexOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", IndexOperatorWriteNode { parser, pointer, marker }),
3503            Self::IndexOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", IndexOrWriteNode { parser, pointer, marker }),
3504            Self::IndexTargetNode { parser, pointer, marker } => write!(f, "{:?}", IndexTargetNode { parser, pointer, marker }),
3505            Self::InstanceVariableAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", InstanceVariableAndWriteNode { parser, pointer, marker }),
3506            Self::InstanceVariableOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", InstanceVariableOperatorWriteNode { parser, pointer, marker }),
3507            Self::InstanceVariableOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", InstanceVariableOrWriteNode { parser, pointer, marker }),
3508            Self::InstanceVariableReadNode { parser, pointer, marker } => write!(f, "{:?}", InstanceVariableReadNode { parser, pointer, marker }),
3509            Self::InstanceVariableTargetNode { parser, pointer, marker } => write!(f, "{:?}", InstanceVariableTargetNode { parser, pointer, marker }),
3510            Self::InstanceVariableWriteNode { parser, pointer, marker } => write!(f, "{:?}", InstanceVariableWriteNode { parser, pointer, marker }),
3511            Self::IntegerNode { parser, pointer, marker } => write!(f, "{:?}", IntegerNode { parser, pointer, marker }),
3512            Self::InterpolatedMatchLastLineNode { parser, pointer, marker } => write!(f, "{:?}", InterpolatedMatchLastLineNode { parser, pointer, marker }),
3513            Self::InterpolatedRegularExpressionNode { parser, pointer, marker } => write!(f, "{:?}", InterpolatedRegularExpressionNode { parser, pointer, marker }),
3514            Self::InterpolatedStringNode { parser, pointer, marker } => write!(f, "{:?}", InterpolatedStringNode { parser, pointer, marker }),
3515            Self::InterpolatedSymbolNode { parser, pointer, marker } => write!(f, "{:?}", InterpolatedSymbolNode { parser, pointer, marker }),
3516            Self::InterpolatedXStringNode { parser, pointer, marker } => write!(f, "{:?}", InterpolatedXStringNode { parser, pointer, marker }),
3517            Self::ItLocalVariableReadNode { parser, pointer, marker } => write!(f, "{:?}", ItLocalVariableReadNode { parser, pointer, marker }),
3518            Self::ItParametersNode { parser, pointer, marker } => write!(f, "{:?}", ItParametersNode { parser, pointer, marker }),
3519            Self::KeywordHashNode { parser, pointer, marker } => write!(f, "{:?}", KeywordHashNode { parser, pointer, marker }),
3520            Self::KeywordRestParameterNode { parser, pointer, marker } => write!(f, "{:?}", KeywordRestParameterNode { parser, pointer, marker }),
3521            Self::LambdaNode { parser, pointer, marker } => write!(f, "{:?}", LambdaNode { parser, pointer, marker }),
3522            Self::LocalVariableAndWriteNode { parser, pointer, marker } => write!(f, "{:?}", LocalVariableAndWriteNode { parser, pointer, marker }),
3523            Self::LocalVariableOperatorWriteNode { parser, pointer, marker } => write!(f, "{:?}", LocalVariableOperatorWriteNode { parser, pointer, marker }),
3524            Self::LocalVariableOrWriteNode { parser, pointer, marker } => write!(f, "{:?}", LocalVariableOrWriteNode { parser, pointer, marker }),
3525            Self::LocalVariableReadNode { parser, pointer, marker } => write!(f, "{:?}", LocalVariableReadNode { parser, pointer, marker }),
3526            Self::LocalVariableTargetNode { parser, pointer, marker } => write!(f, "{:?}", LocalVariableTargetNode { parser, pointer, marker }),
3527            Self::LocalVariableWriteNode { parser, pointer, marker } => write!(f, "{:?}", LocalVariableWriteNode { parser, pointer, marker }),
3528            Self::MatchLastLineNode { parser, pointer, marker } => write!(f, "{:?}", MatchLastLineNode { parser, pointer, marker }),
3529            Self::MatchPredicateNode { parser, pointer, marker } => write!(f, "{:?}", MatchPredicateNode { parser, pointer, marker }),
3530            Self::MatchRequiredNode { parser, pointer, marker } => write!(f, "{:?}", MatchRequiredNode { parser, pointer, marker }),
3531            Self::MatchWriteNode { parser, pointer, marker } => write!(f, "{:?}", MatchWriteNode { parser, pointer, marker }),
3532            Self::ModuleNode { parser, pointer, marker } => write!(f, "{:?}", ModuleNode { parser, pointer, marker }),
3533            Self::MultiTargetNode { parser, pointer, marker } => write!(f, "{:?}", MultiTargetNode { parser, pointer, marker }),
3534            Self::MultiWriteNode { parser, pointer, marker } => write!(f, "{:?}", MultiWriteNode { parser, pointer, marker }),
3535            Self::NextNode { parser, pointer, marker } => write!(f, "{:?}", NextNode { parser, pointer, marker }),
3536            Self::NilNode { parser, pointer, marker } => write!(f, "{:?}", NilNode { parser, pointer, marker }),
3537            Self::NoBlockParameterNode { parser, pointer, marker } => write!(f, "{:?}", NoBlockParameterNode { parser, pointer, marker }),
3538            Self::NoKeywordsParameterNode { parser, pointer, marker } => write!(f, "{:?}", NoKeywordsParameterNode { parser, pointer, marker }),
3539            Self::NumberedParametersNode { parser, pointer, marker } => write!(f, "{:?}", NumberedParametersNode { parser, pointer, marker }),
3540            Self::NumberedReferenceReadNode { parser, pointer, marker } => write!(f, "{:?}", NumberedReferenceReadNode { parser, pointer, marker }),
3541            Self::OptionalKeywordParameterNode { parser, pointer, marker } => write!(f, "{:?}", OptionalKeywordParameterNode { parser, pointer, marker }),
3542            Self::OptionalParameterNode { parser, pointer, marker } => write!(f, "{:?}", OptionalParameterNode { parser, pointer, marker }),
3543            Self::OrNode { parser, pointer, marker } => write!(f, "{:?}", OrNode { parser, pointer, marker }),
3544            Self::ParametersNode { parser, pointer, marker } => write!(f, "{:?}", ParametersNode { parser, pointer, marker }),
3545            Self::ParenthesesNode { parser, pointer, marker } => write!(f, "{:?}", ParenthesesNode { parser, pointer, marker }),
3546            Self::PinnedExpressionNode { parser, pointer, marker } => write!(f, "{:?}", PinnedExpressionNode { parser, pointer, marker }),
3547            Self::PinnedVariableNode { parser, pointer, marker } => write!(f, "{:?}", PinnedVariableNode { parser, pointer, marker }),
3548            Self::PostExecutionNode { parser, pointer, marker } => write!(f, "{:?}", PostExecutionNode { parser, pointer, marker }),
3549            Self::PreExecutionNode { parser, pointer, marker } => write!(f, "{:?}", PreExecutionNode { parser, pointer, marker }),
3550            Self::ProgramNode { parser, pointer, marker } => write!(f, "{:?}", ProgramNode { parser, pointer, marker }),
3551            Self::RangeNode { parser, pointer, marker } => write!(f, "{:?}", RangeNode { parser, pointer, marker }),
3552            Self::RationalNode { parser, pointer, marker } => write!(f, "{:?}", RationalNode { parser, pointer, marker }),
3553            Self::RedoNode { parser, pointer, marker } => write!(f, "{:?}", RedoNode { parser, pointer, marker }),
3554            Self::RegularExpressionNode { parser, pointer, marker } => write!(f, "{:?}", RegularExpressionNode { parser, pointer, marker }),
3555            Self::RequiredKeywordParameterNode { parser, pointer, marker } => write!(f, "{:?}", RequiredKeywordParameterNode { parser, pointer, marker }),
3556            Self::RequiredParameterNode { parser, pointer, marker } => write!(f, "{:?}", RequiredParameterNode { parser, pointer, marker }),
3557            Self::RescueModifierNode { parser, pointer, marker } => write!(f, "{:?}", RescueModifierNode { parser, pointer, marker }),
3558            Self::RescueNode { parser, pointer, marker } => write!(f, "{:?}", RescueNode { parser, pointer, marker }),
3559            Self::RestParameterNode { parser, pointer, marker } => write!(f, "{:?}", RestParameterNode { parser, pointer, marker }),
3560            Self::RetryNode { parser, pointer, marker } => write!(f, "{:?}", RetryNode { parser, pointer, marker }),
3561            Self::ReturnNode { parser, pointer, marker } => write!(f, "{:?}", ReturnNode { parser, pointer, marker }),
3562            Self::SelfNode { parser, pointer, marker } => write!(f, "{:?}", SelfNode { parser, pointer, marker }),
3563            Self::ShareableConstantNode { parser, pointer, marker } => write!(f, "{:?}", ShareableConstantNode { parser, pointer, marker }),
3564            Self::SingletonClassNode { parser, pointer, marker } => write!(f, "{:?}", SingletonClassNode { parser, pointer, marker }),
3565            Self::SourceEncodingNode { parser, pointer, marker } => write!(f, "{:?}", SourceEncodingNode { parser, pointer, marker }),
3566            Self::SourceFileNode { parser, pointer, marker } => write!(f, "{:?}", SourceFileNode { parser, pointer, marker }),
3567            Self::SourceLineNode { parser, pointer, marker } => write!(f, "{:?}", SourceLineNode { parser, pointer, marker }),
3568            Self::SplatNode { parser, pointer, marker } => write!(f, "{:?}", SplatNode { parser, pointer, marker }),
3569            Self::StatementsNode { parser, pointer, marker } => write!(f, "{:?}", StatementsNode { parser, pointer, marker }),
3570            Self::StringNode { parser, pointer, marker } => write!(f, "{:?}", StringNode { parser, pointer, marker }),
3571            Self::SuperNode { parser, pointer, marker } => write!(f, "{:?}", SuperNode { parser, pointer, marker }),
3572            Self::SymbolNode { parser, pointer, marker } => write!(f, "{:?}", SymbolNode { parser, pointer, marker }),
3573            Self::TrueNode { parser, pointer, marker } => write!(f, "{:?}", TrueNode { parser, pointer, marker }),
3574            Self::UndefNode { parser, pointer, marker } => write!(f, "{:?}", UndefNode { parser, pointer, marker }),
3575            Self::UnlessNode { parser, pointer, marker } => write!(f, "{:?}", UnlessNode { parser, pointer, marker }),
3576            Self::UntilNode { parser, pointer, marker } => write!(f, "{:?}", UntilNode { parser, pointer, marker }),
3577            Self::WhenNode { parser, pointer, marker } => write!(f, "{:?}", WhenNode { parser, pointer, marker }),
3578            Self::WhileNode { parser, pointer, marker } => write!(f, "{:?}", WhileNode { parser, pointer, marker }),
3579            Self::XStringNode { parser, pointer, marker } => write!(f, "{:?}", XStringNode { parser, pointer, marker }),
3580            Self::YieldNode { parser, pointer, marker } => write!(f, "{:?}", YieldNode { parser, pointer, marker }),
3581        }
3582    }
3583}
3584
3585/// Represents the use of the `alias` keyword to alias a global variable.
3586/// 
3587/// ```ruby
3588/// alias $foo $bar
3589/// ^^^^^^^^^^^^^^^
3590/// ```
3591pub struct AliasGlobalVariableNode<'pr> {
3592    /// The pointer to the parser this node came from.
3593    parser: *const pm_parser_t,
3594
3595    /// The raw pointer to the node allocated by prism.
3596    pointer: *mut pm_alias_global_variable_node_t,
3597
3598    /// The marker to indicate the lifetime of the pointer.
3599    marker: PhantomData<&'pr mut pm_alias_global_variable_node_t>
3600}
3601
3602impl<'pr> AliasGlobalVariableNode<'pr> {
3603    /// Converts this node to a generic node.
3604    #[must_use]
3605    pub const fn as_node(&self) -> Node<'pr> {
3606        Node::AliasGlobalVariableNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
3607    }
3608
3609    /// Returns the location of this node.
3610    #[must_use]
3611    pub fn location(&self) -> Location<'pr> {
3612        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
3613        Location::new(self.parser, unsafe { &(*pointer) })
3614    }
3615
3616    /// Returns the flags of this node.
3617    #[must_use]
3618    pub fn flags(&self) -> pm_node_flags_t {
3619        unsafe { (*self.pointer).base.flags }
3620    }
3621
3622    /// Returns the `new_name` param
3623    #[must_use]
3624    pub fn new_name(&self) -> Node<'pr> {
3625        let node: *mut pm_node_t = unsafe { (*self.pointer).new_name };
3626        Node::new(self.parser, node)
3627    }
3628
3629    /// Returns the `old_name` param
3630    #[must_use]
3631    pub fn old_name(&self) -> Node<'pr> {
3632        let node: *mut pm_node_t = unsafe { (*self.pointer).old_name };
3633        Node::new(self.parser, node)
3634    }
3635
3636    /// Returns the `keyword_loc` param
3637    #[must_use]
3638    pub fn keyword_loc(&self) -> Location<'pr> {
3639        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
3640        Location::new(self.parser, unsafe { &(*pointer) })
3641    }
3642}
3643
3644impl std::fmt::Debug for AliasGlobalVariableNode<'_> {
3645    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3646        write!(f, "AliasGlobalVariableNode({:?}, {:?}, {:?})", self.new_name(), self.old_name(), self.keyword_loc())
3647    }
3648}
3649
3650/// Represents the use of the `alias` keyword to alias a method.
3651/// 
3652/// ```ruby
3653/// alias foo bar
3654/// ^^^^^^^^^^^^^
3655/// ```
3656pub struct AliasMethodNode<'pr> {
3657    /// The pointer to the parser this node came from.
3658    parser: *const pm_parser_t,
3659
3660    /// The raw pointer to the node allocated by prism.
3661    pointer: *mut pm_alias_method_node_t,
3662
3663    /// The marker to indicate the lifetime of the pointer.
3664    marker: PhantomData<&'pr mut pm_alias_method_node_t>
3665}
3666
3667impl<'pr> AliasMethodNode<'pr> {
3668    /// Converts this node to a generic node.
3669    #[must_use]
3670    pub const fn as_node(&self) -> Node<'pr> {
3671        Node::AliasMethodNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
3672    }
3673
3674    /// Returns the location of this node.
3675    #[must_use]
3676    pub fn location(&self) -> Location<'pr> {
3677        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
3678        Location::new(self.parser, unsafe { &(*pointer) })
3679    }
3680
3681    /// Returns the flags of this node.
3682    #[must_use]
3683    pub fn flags(&self) -> pm_node_flags_t {
3684        unsafe { (*self.pointer).base.flags }
3685    }
3686
3687    /// Returns the `new_name` param
3688    #[must_use]
3689    pub fn new_name(&self) -> Node<'pr> {
3690        let node: *mut pm_node_t = unsafe { (*self.pointer).new_name };
3691        Node::new(self.parser, node)
3692    }
3693
3694    /// Returns the `old_name` param
3695    #[must_use]
3696    pub fn old_name(&self) -> Node<'pr> {
3697        let node: *mut pm_node_t = unsafe { (*self.pointer).old_name };
3698        Node::new(self.parser, node)
3699    }
3700
3701    /// Returns the `keyword_loc` param
3702    #[must_use]
3703    pub fn keyword_loc(&self) -> Location<'pr> {
3704        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
3705        Location::new(self.parser, unsafe { &(*pointer) })
3706    }
3707}
3708
3709impl std::fmt::Debug for AliasMethodNode<'_> {
3710    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3711        write!(f, "AliasMethodNode({:?}, {:?}, {:?})", self.new_name(), self.old_name(), self.keyword_loc())
3712    }
3713}
3714
3715/// Represents an alternation pattern in pattern matching.
3716/// 
3717/// ```ruby
3718/// foo => bar | baz
3719///        ^^^^^^^^^
3720/// ```
3721pub struct AlternationPatternNode<'pr> {
3722    /// The pointer to the parser this node came from.
3723    parser: *const pm_parser_t,
3724
3725    /// The raw pointer to the node allocated by prism.
3726    pointer: *mut pm_alternation_pattern_node_t,
3727
3728    /// The marker to indicate the lifetime of the pointer.
3729    marker: PhantomData<&'pr mut pm_alternation_pattern_node_t>
3730}
3731
3732impl<'pr> AlternationPatternNode<'pr> {
3733    /// Converts this node to a generic node.
3734    #[must_use]
3735    pub const fn as_node(&self) -> Node<'pr> {
3736        Node::AlternationPatternNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
3737    }
3738
3739    /// Returns the location of this node.
3740    #[must_use]
3741    pub fn location(&self) -> Location<'pr> {
3742        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
3743        Location::new(self.parser, unsafe { &(*pointer) })
3744    }
3745
3746    /// Returns the flags of this node.
3747    #[must_use]
3748    pub fn flags(&self) -> pm_node_flags_t {
3749        unsafe { (*self.pointer).base.flags }
3750    }
3751
3752    /// Returns the `left` param
3753    #[must_use]
3754    pub fn left(&self) -> Node<'pr> {
3755        let node: *mut pm_node_t = unsafe { (*self.pointer).left };
3756        Node::new(self.parser, node)
3757    }
3758
3759    /// Returns the `right` param
3760    #[must_use]
3761    pub fn right(&self) -> Node<'pr> {
3762        let node: *mut pm_node_t = unsafe { (*self.pointer).right };
3763        Node::new(self.parser, node)
3764    }
3765
3766    /// Returns the `operator_loc` param
3767    #[must_use]
3768    pub fn operator_loc(&self) -> Location<'pr> {
3769        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
3770        Location::new(self.parser, unsafe { &(*pointer) })
3771    }
3772}
3773
3774impl std::fmt::Debug for AlternationPatternNode<'_> {
3775    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3776        write!(f, "AlternationPatternNode({:?}, {:?}, {:?})", self.left(), self.right(), self.operator_loc())
3777    }
3778}
3779
3780/// Represents the use of the `&&` operator or the `and` keyword.
3781/// 
3782/// ```ruby
3783/// left and right
3784/// ^^^^^^^^^^^^^^
3785/// ```
3786pub struct AndNode<'pr> {
3787    /// The pointer to the parser this node came from.
3788    parser: *const pm_parser_t,
3789
3790    /// The raw pointer to the node allocated by prism.
3791    pointer: *mut pm_and_node_t,
3792
3793    /// The marker to indicate the lifetime of the pointer.
3794    marker: PhantomData<&'pr mut pm_and_node_t>
3795}
3796
3797impl<'pr> AndNode<'pr> {
3798    /// Converts this node to a generic node.
3799    #[must_use]
3800    pub const fn as_node(&self) -> Node<'pr> {
3801        Node::AndNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
3802    }
3803
3804    /// Returns the location of this node.
3805    #[must_use]
3806    pub fn location(&self) -> Location<'pr> {
3807        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
3808        Location::new(self.parser, unsafe { &(*pointer) })
3809    }
3810
3811    /// Returns the flags of this node.
3812    #[must_use]
3813    pub fn flags(&self) -> pm_node_flags_t {
3814        unsafe { (*self.pointer).base.flags }
3815    }
3816
3817    /// Returns the `left` param
3818    #[must_use]
3819    pub fn left(&self) -> Node<'pr> {
3820        let node: *mut pm_node_t = unsafe { (*self.pointer).left };
3821        Node::new(self.parser, node)
3822    }
3823
3824    /// Returns the `right` param
3825    #[must_use]
3826    pub fn right(&self) -> Node<'pr> {
3827        let node: *mut pm_node_t = unsafe { (*self.pointer).right };
3828        Node::new(self.parser, node)
3829    }
3830
3831    /// Returns the `operator_loc` param
3832    #[must_use]
3833    pub fn operator_loc(&self) -> Location<'pr> {
3834        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
3835        Location::new(self.parser, unsafe { &(*pointer) })
3836    }
3837}
3838
3839impl std::fmt::Debug for AndNode<'_> {
3840    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3841        write!(f, "AndNode({:?}, {:?}, {:?})", self.left(), self.right(), self.operator_loc())
3842    }
3843}
3844
3845/// Represents a set of arguments to a method or a keyword.
3846/// 
3847/// ```ruby
3848/// return foo, bar, baz
3849///        ^^^^^^^^^^^^^
3850/// ```
3851pub struct ArgumentsNode<'pr> {
3852    /// The pointer to the parser this node came from.
3853    parser: *const pm_parser_t,
3854
3855    /// The raw pointer to the node allocated by prism.
3856    pointer: *mut pm_arguments_node_t,
3857
3858    /// The marker to indicate the lifetime of the pointer.
3859    marker: PhantomData<&'pr mut pm_arguments_node_t>
3860}
3861
3862impl<'pr> ArgumentsNode<'pr> {
3863    /// Converts this node to a generic node.
3864    #[must_use]
3865    pub const fn as_node(&self) -> Node<'pr> {
3866        Node::ArgumentsNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
3867    }
3868
3869    /// Returns the location of this node.
3870    #[must_use]
3871    pub fn location(&self) -> Location<'pr> {
3872        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
3873        Location::new(self.parser, unsafe { &(*pointer) })
3874    }
3875
3876    /// Returns the flags of this node.
3877    #[must_use]
3878    pub fn flags(&self) -> pm_node_flags_t {
3879        unsafe { (*self.pointer).base.flags }
3880    }
3881
3882    /// if the arguments contain forwarding
3883    #[must_use]
3884    pub fn is_contains_forwarding(&self) -> bool {
3885        (self.flags() & PM_ARGUMENTS_NODE_FLAGS_CONTAINS_FORWARDING) != 0
3886    }
3887
3888    /// if the arguments contain keywords
3889    #[must_use]
3890    pub fn is_contains_keywords(&self) -> bool {
3891        (self.flags() & PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORDS) != 0
3892    }
3893
3894    /// if the arguments contain a keyword splat
3895    #[must_use]
3896    pub fn is_contains_keyword_splat(&self) -> bool {
3897        (self.flags() & PM_ARGUMENTS_NODE_FLAGS_CONTAINS_KEYWORD_SPLAT) != 0
3898    }
3899
3900    /// if the arguments contain a splat
3901    #[must_use]
3902    pub fn is_contains_splat(&self) -> bool {
3903        (self.flags() & PM_ARGUMENTS_NODE_FLAGS_CONTAINS_SPLAT) != 0
3904    }
3905
3906    /// if the arguments contain multiple splats
3907    #[must_use]
3908    pub fn is_contains_multiple_splats(&self) -> bool {
3909        (self.flags() & PM_ARGUMENTS_NODE_FLAGS_CONTAINS_MULTIPLE_SPLATS) != 0
3910    }
3911
3912    /// Returns the `arguments` param
3913    #[must_use]
3914    pub fn arguments(&self) -> NodeList<'pr> {
3915        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).arguments };
3916        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
3917    }
3918}
3919
3920impl std::fmt::Debug for ArgumentsNode<'_> {
3921    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3922        write!(f, "ArgumentsNode({:?})", self.arguments())
3923    }
3924}
3925
3926/// Represents an array literal. This can be a regular array using brackets or a special array using % like %w or %i.
3927/// 
3928/// ```ruby
3929/// [1, 2, 3]
3930/// ^^^^^^^^^
3931/// ```
3932pub struct ArrayNode<'pr> {
3933    /// The pointer to the parser this node came from.
3934    parser: *const pm_parser_t,
3935
3936    /// The raw pointer to the node allocated by prism.
3937    pointer: *mut pm_array_node_t,
3938
3939    /// The marker to indicate the lifetime of the pointer.
3940    marker: PhantomData<&'pr mut pm_array_node_t>
3941}
3942
3943impl<'pr> ArrayNode<'pr> {
3944    /// Converts this node to a generic node.
3945    #[must_use]
3946    pub const fn as_node(&self) -> Node<'pr> {
3947        Node::ArrayNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
3948    }
3949
3950    /// Returns the location of this node.
3951    #[must_use]
3952    pub fn location(&self) -> Location<'pr> {
3953        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
3954        Location::new(self.parser, unsafe { &(*pointer) })
3955    }
3956
3957    /// Returns the flags of this node.
3958    #[must_use]
3959    pub fn flags(&self) -> pm_node_flags_t {
3960        unsafe { (*self.pointer).base.flags }
3961    }
3962
3963    /// if array contains splat nodes
3964    #[must_use]
3965    pub fn is_contains_splat(&self) -> bool {
3966        (self.flags() & PM_ARRAY_NODE_FLAGS_CONTAINS_SPLAT) != 0
3967    }
3968
3969    /// Returns the `elements` param
3970    #[must_use]
3971    pub fn elements(&self) -> NodeList<'pr> {
3972        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).elements };
3973        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
3974    }
3975
3976    /// Returns the `opening_loc` param
3977    #[must_use]
3978    pub fn opening_loc(&self) -> Option<Location<'pr>> {
3979        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
3980        let length = unsafe { (*pointer).length };
3981        if length == 0 {
3982            None
3983        } else {
3984            Some(Location::new(self.parser, unsafe { &(*pointer) }))
3985        }
3986    }
3987
3988    /// Returns the `closing_loc` param
3989    #[must_use]
3990    pub fn closing_loc(&self) -> Option<Location<'pr>> {
3991        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
3992        let length = unsafe { (*pointer).length };
3993        if length == 0 {
3994            None
3995        } else {
3996            Some(Location::new(self.parser, unsafe { &(*pointer) }))
3997        }
3998    }
3999}
4000
4001impl std::fmt::Debug for ArrayNode<'_> {
4002    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4003        write!(f, "ArrayNode({:?}, {:?}, {:?})", self.elements(), self.opening_loc(), self.closing_loc())
4004    }
4005}
4006
4007/// Represents an array pattern in pattern matching.
4008/// 
4009/// ```ruby
4010/// foo in 1, 2
4011///        ^^^^
4012/// ```
4013/// 
4014/// ```ruby
4015/// foo in [1, 2]
4016///        ^^^^^^
4017/// ```
4018/// 
4019/// ```ruby
4020/// foo in *bar
4021///        ^^^^
4022/// ```
4023/// 
4024/// ```ruby
4025/// foo in Bar[]
4026///        ^^^^^
4027/// ```
4028/// 
4029/// ```ruby
4030/// foo in Bar[1, 2, 3]
4031///        ^^^^^^^^^^^^
4032/// ```
4033pub struct ArrayPatternNode<'pr> {
4034    /// The pointer to the parser this node came from.
4035    parser: *const pm_parser_t,
4036
4037    /// The raw pointer to the node allocated by prism.
4038    pointer: *mut pm_array_pattern_node_t,
4039
4040    /// The marker to indicate the lifetime of the pointer.
4041    marker: PhantomData<&'pr mut pm_array_pattern_node_t>
4042}
4043
4044impl<'pr> ArrayPatternNode<'pr> {
4045    /// Converts this node to a generic node.
4046    #[must_use]
4047    pub const fn as_node(&self) -> Node<'pr> {
4048        Node::ArrayPatternNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4049    }
4050
4051    /// Returns the location of this node.
4052    #[must_use]
4053    pub fn location(&self) -> Location<'pr> {
4054        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4055        Location::new(self.parser, unsafe { &(*pointer) })
4056    }
4057
4058    /// Returns the flags of this node.
4059    #[must_use]
4060    pub fn flags(&self) -> pm_node_flags_t {
4061        unsafe { (*self.pointer).base.flags }
4062    }
4063
4064    /// Returns the `constant` param
4065    #[must_use]
4066    pub fn constant(&self) -> Option<Node<'pr>> {
4067        let node: *mut pm_node_t = unsafe { (*self.pointer).constant };
4068        if node.is_null() {
4069            None
4070        } else {
4071            Some(Node::new(self.parser, node))
4072        }
4073    }
4074
4075    /// Returns the `requireds` param
4076    #[must_use]
4077    pub fn requireds(&self) -> NodeList<'pr> {
4078        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).requireds };
4079        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
4080    }
4081
4082    /// Returns the `rest` param
4083    #[must_use]
4084    pub fn rest(&self) -> Option<Node<'pr>> {
4085        let node: *mut pm_node_t = unsafe { (*self.pointer).rest };
4086        if node.is_null() {
4087            None
4088        } else {
4089            Some(Node::new(self.parser, node))
4090        }
4091    }
4092
4093    /// Returns the `posts` param
4094    #[must_use]
4095    pub fn posts(&self) -> NodeList<'pr> {
4096        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).posts };
4097        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
4098    }
4099
4100    /// Returns the `opening_loc` param
4101    #[must_use]
4102    pub fn opening_loc(&self) -> Option<Location<'pr>> {
4103        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
4104        let length = unsafe { (*pointer).length };
4105        if length == 0 {
4106            None
4107        } else {
4108            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4109        }
4110    }
4111
4112    /// Returns the `closing_loc` param
4113    #[must_use]
4114    pub fn closing_loc(&self) -> Option<Location<'pr>> {
4115        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
4116        let length = unsafe { (*pointer).length };
4117        if length == 0 {
4118            None
4119        } else {
4120            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4121        }
4122    }
4123}
4124
4125impl std::fmt::Debug for ArrayPatternNode<'_> {
4126    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4127        write!(f, "ArrayPatternNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.constant(), self.requireds(), self.rest(), self.posts(), self.opening_loc(), self.closing_loc())
4128    }
4129}
4130
4131/// Represents a hash key/value pair.
4132/// 
4133/// ```ruby
4134/// { a => b }
4135///   ^^^^^^
4136/// ```
4137pub struct AssocNode<'pr> {
4138    /// The pointer to the parser this node came from.
4139    parser: *const pm_parser_t,
4140
4141    /// The raw pointer to the node allocated by prism.
4142    pointer: *mut pm_assoc_node_t,
4143
4144    /// The marker to indicate the lifetime of the pointer.
4145    marker: PhantomData<&'pr mut pm_assoc_node_t>
4146}
4147
4148impl<'pr> AssocNode<'pr> {
4149    /// Converts this node to a generic node.
4150    #[must_use]
4151    pub const fn as_node(&self) -> Node<'pr> {
4152        Node::AssocNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4153    }
4154
4155    /// Returns the location of this node.
4156    #[must_use]
4157    pub fn location(&self) -> Location<'pr> {
4158        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4159        Location::new(self.parser, unsafe { &(*pointer) })
4160    }
4161
4162    /// Returns the flags of this node.
4163    #[must_use]
4164    pub fn flags(&self) -> pm_node_flags_t {
4165        unsafe { (*self.pointer).base.flags }
4166    }
4167
4168    /// Returns the `key` param
4169    #[must_use]
4170    pub fn key(&self) -> Node<'pr> {
4171        let node: *mut pm_node_t = unsafe { (*self.pointer).key };
4172        Node::new(self.parser, node)
4173    }
4174
4175    /// Returns the `value` param
4176    #[must_use]
4177    pub fn value(&self) -> Node<'pr> {
4178        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
4179        Node::new(self.parser, node)
4180    }
4181
4182    /// Returns the `operator_loc` param
4183    #[must_use]
4184    pub fn operator_loc(&self) -> Option<Location<'pr>> {
4185        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
4186        let length = unsafe { (*pointer).length };
4187        if length == 0 {
4188            None
4189        } else {
4190            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4191        }
4192    }
4193}
4194
4195impl std::fmt::Debug for AssocNode<'_> {
4196    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4197        write!(f, "AssocNode({:?}, {:?}, {:?})", self.key(), self.value(), self.operator_loc())
4198    }
4199}
4200
4201/// Represents a splat in a hash literal.
4202/// 
4203/// ```ruby
4204/// { **foo }
4205///   ^^^^^
4206/// ```
4207pub struct AssocSplatNode<'pr> {
4208    /// The pointer to the parser this node came from.
4209    parser: *const pm_parser_t,
4210
4211    /// The raw pointer to the node allocated by prism.
4212    pointer: *mut pm_assoc_splat_node_t,
4213
4214    /// The marker to indicate the lifetime of the pointer.
4215    marker: PhantomData<&'pr mut pm_assoc_splat_node_t>
4216}
4217
4218impl<'pr> AssocSplatNode<'pr> {
4219    /// Converts this node to a generic node.
4220    #[must_use]
4221    pub const fn as_node(&self) -> Node<'pr> {
4222        Node::AssocSplatNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4223    }
4224
4225    /// Returns the location of this node.
4226    #[must_use]
4227    pub fn location(&self) -> Location<'pr> {
4228        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4229        Location::new(self.parser, unsafe { &(*pointer) })
4230    }
4231
4232    /// Returns the flags of this node.
4233    #[must_use]
4234    pub fn flags(&self) -> pm_node_flags_t {
4235        unsafe { (*self.pointer).base.flags }
4236    }
4237
4238    /// Returns the `value` param
4239    #[must_use]
4240    pub fn value(&self) -> Option<Node<'pr>> {
4241        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
4242        if node.is_null() {
4243            None
4244        } else {
4245            Some(Node::new(self.parser, node))
4246        }
4247    }
4248
4249    /// Returns the `operator_loc` param
4250    #[must_use]
4251    pub fn operator_loc(&self) -> Location<'pr> {
4252        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
4253        Location::new(self.parser, unsafe { &(*pointer) })
4254    }
4255}
4256
4257impl std::fmt::Debug for AssocSplatNode<'_> {
4258    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4259        write!(f, "AssocSplatNode({:?}, {:?})", self.value(), self.operator_loc())
4260    }
4261}
4262
4263/// Represents reading a reference to a field in the previous match.
4264/// 
4265/// ```ruby
4266/// $'
4267/// ^^
4268/// ```
4269pub struct BackReferenceReadNode<'pr> {
4270    /// The pointer to the parser this node came from.
4271    parser: *const pm_parser_t,
4272
4273    /// The raw pointer to the node allocated by prism.
4274    pointer: *mut pm_back_reference_read_node_t,
4275
4276    /// The marker to indicate the lifetime of the pointer.
4277    marker: PhantomData<&'pr mut pm_back_reference_read_node_t>
4278}
4279
4280impl<'pr> BackReferenceReadNode<'pr> {
4281    /// Converts this node to a generic node.
4282    #[must_use]
4283    pub const fn as_node(&self) -> Node<'pr> {
4284        Node::BackReferenceReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4285    }
4286
4287    /// Returns the location of this node.
4288    #[must_use]
4289    pub fn location(&self) -> Location<'pr> {
4290        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4291        Location::new(self.parser, unsafe { &(*pointer) })
4292    }
4293
4294    /// Returns the flags of this node.
4295    #[must_use]
4296    pub fn flags(&self) -> pm_node_flags_t {
4297        unsafe { (*self.pointer).base.flags }
4298    }
4299
4300    /// Returns the `name` param
4301    #[must_use]
4302    pub fn name(&self) -> ConstantId<'pr> {
4303        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
4304    }
4305}
4306
4307impl std::fmt::Debug for BackReferenceReadNode<'_> {
4308    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4309        write!(f, "BackReferenceReadNode({:?})", self.name())
4310    }
4311}
4312
4313/// Represents a begin statement.
4314/// 
4315/// ```ruby
4316/// begin
4317///   foo
4318/// end
4319/// ^^^^^
4320/// ```
4321pub struct BeginNode<'pr> {
4322    /// The pointer to the parser this node came from.
4323    parser: *const pm_parser_t,
4324
4325    /// The raw pointer to the node allocated by prism.
4326    pointer: *mut pm_begin_node_t,
4327
4328    /// The marker to indicate the lifetime of the pointer.
4329    marker: PhantomData<&'pr mut pm_begin_node_t>
4330}
4331
4332impl<'pr> BeginNode<'pr> {
4333    /// Converts this node to a generic node.
4334    #[must_use]
4335    pub const fn as_node(&self) -> Node<'pr> {
4336        Node::BeginNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4337    }
4338
4339    /// Returns the location of this node.
4340    #[must_use]
4341    pub fn location(&self) -> Location<'pr> {
4342        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4343        Location::new(self.parser, unsafe { &(*pointer) })
4344    }
4345
4346    /// Returns the flags of this node.
4347    #[must_use]
4348    pub fn flags(&self) -> pm_node_flags_t {
4349        unsafe { (*self.pointer).base.flags }
4350    }
4351
4352    /// Returns the `begin_keyword_loc` param
4353    #[must_use]
4354    pub fn begin_keyword_loc(&self) -> Option<Location<'pr>> {
4355        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).begin_keyword_loc };
4356        let length = unsafe { (*pointer).length };
4357        if length == 0 {
4358            None
4359        } else {
4360            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4361        }
4362    }
4363
4364    /// Returns the `statements` param
4365    #[must_use]
4366    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
4367        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
4368        if node.is_null() {
4369            None
4370        } else {
4371            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
4372        }
4373    }
4374
4375    /// Returns the `rescue_clause` param
4376    #[must_use]
4377    pub fn rescue_clause(&self) -> Option<RescueNode<'pr>> {
4378        let node: *mut pm_rescue_node_t = unsafe { (*self.pointer).rescue_clause };
4379        if node.is_null() {
4380            None
4381        } else {
4382            Some(RescueNode { parser: self.parser, pointer: node, marker: PhantomData })
4383        }
4384    }
4385
4386    /// Returns the `else_clause` param
4387    #[must_use]
4388    pub fn else_clause(&self) -> Option<ElseNode<'pr>> {
4389        let node: *mut pm_else_node_t = unsafe { (*self.pointer).else_clause };
4390        if node.is_null() {
4391            None
4392        } else {
4393            Some(ElseNode { parser: self.parser, pointer: node, marker: PhantomData })
4394        }
4395    }
4396
4397    /// Returns the `ensure_clause` param
4398    #[must_use]
4399    pub fn ensure_clause(&self) -> Option<EnsureNode<'pr>> {
4400        let node: *mut pm_ensure_node_t = unsafe { (*self.pointer).ensure_clause };
4401        if node.is_null() {
4402            None
4403        } else {
4404            Some(EnsureNode { parser: self.parser, pointer: node, marker: PhantomData })
4405        }
4406    }
4407
4408    /// Returns the `end_keyword_loc` param
4409    #[must_use]
4410    pub fn end_keyword_loc(&self) -> Option<Location<'pr>> {
4411        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
4412        let length = unsafe { (*pointer).length };
4413        if length == 0 {
4414            None
4415        } else {
4416            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4417        }
4418    }
4419}
4420
4421impl std::fmt::Debug for BeginNode<'_> {
4422    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4423        write!(f, "BeginNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.begin_keyword_loc(), self.statements(), self.rescue_clause(), self.else_clause(), self.ensure_clause(), self.end_keyword_loc())
4424    }
4425}
4426
4427/// Represents a block argument using `&`.
4428/// 
4429/// ```ruby
4430/// bar(&args)
4431///     ^^^^^
4432/// ```
4433pub struct BlockArgumentNode<'pr> {
4434    /// The pointer to the parser this node came from.
4435    parser: *const pm_parser_t,
4436
4437    /// The raw pointer to the node allocated by prism.
4438    pointer: *mut pm_block_argument_node_t,
4439
4440    /// The marker to indicate the lifetime of the pointer.
4441    marker: PhantomData<&'pr mut pm_block_argument_node_t>
4442}
4443
4444impl<'pr> BlockArgumentNode<'pr> {
4445    /// Converts this node to a generic node.
4446    #[must_use]
4447    pub const fn as_node(&self) -> Node<'pr> {
4448        Node::BlockArgumentNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4449    }
4450
4451    /// Returns the location of this node.
4452    #[must_use]
4453    pub fn location(&self) -> Location<'pr> {
4454        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4455        Location::new(self.parser, unsafe { &(*pointer) })
4456    }
4457
4458    /// Returns the flags of this node.
4459    #[must_use]
4460    pub fn flags(&self) -> pm_node_flags_t {
4461        unsafe { (*self.pointer).base.flags }
4462    }
4463
4464    /// Returns the `expression` param
4465    #[must_use]
4466    pub fn expression(&self) -> Option<Node<'pr>> {
4467        let node: *mut pm_node_t = unsafe { (*self.pointer).expression };
4468        if node.is_null() {
4469            None
4470        } else {
4471            Some(Node::new(self.parser, node))
4472        }
4473    }
4474
4475    /// Returns the `operator_loc` param
4476    #[must_use]
4477    pub fn operator_loc(&self) -> Location<'pr> {
4478        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
4479        Location::new(self.parser, unsafe { &(*pointer) })
4480    }
4481}
4482
4483impl std::fmt::Debug for BlockArgumentNode<'_> {
4484    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4485        write!(f, "BlockArgumentNode({:?}, {:?})", self.expression(), self.operator_loc())
4486    }
4487}
4488
4489/// Represents a block local variable.
4490/// 
4491/// ```ruby
4492/// a { |; b| }
4493///        ^
4494/// ```
4495pub struct BlockLocalVariableNode<'pr> {
4496    /// The pointer to the parser this node came from.
4497    parser: *const pm_parser_t,
4498
4499    /// The raw pointer to the node allocated by prism.
4500    pointer: *mut pm_block_local_variable_node_t,
4501
4502    /// The marker to indicate the lifetime of the pointer.
4503    marker: PhantomData<&'pr mut pm_block_local_variable_node_t>
4504}
4505
4506impl<'pr> BlockLocalVariableNode<'pr> {
4507    /// Converts this node to a generic node.
4508    #[must_use]
4509    pub const fn as_node(&self) -> Node<'pr> {
4510        Node::BlockLocalVariableNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4511    }
4512
4513    /// Returns the location of this node.
4514    #[must_use]
4515    pub fn location(&self) -> Location<'pr> {
4516        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4517        Location::new(self.parser, unsafe { &(*pointer) })
4518    }
4519
4520    /// Returns the flags of this node.
4521    #[must_use]
4522    pub fn flags(&self) -> pm_node_flags_t {
4523        unsafe { (*self.pointer).base.flags }
4524    }
4525
4526    /// a parameter name that has been repeated in the method signature
4527    #[must_use]
4528    pub fn is_repeated_parameter(&self) -> bool {
4529        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
4530    }
4531
4532    /// Returns the `name` param
4533    #[must_use]
4534    pub fn name(&self) -> ConstantId<'pr> {
4535        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
4536    }
4537}
4538
4539impl std::fmt::Debug for BlockLocalVariableNode<'_> {
4540    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4541        write!(f, "BlockLocalVariableNode({:?})", self.name())
4542    }
4543}
4544
4545/// Represents a block of ruby code.
4546/// 
4547/// ```ruby
4548/// [1, 2, 3].each { |i| puts x }
4549///                ^^^^^^^^^^^^^^
4550/// ```
4551pub struct BlockNode<'pr> {
4552    /// The pointer to the parser this node came from.
4553    parser: *const pm_parser_t,
4554
4555    /// The raw pointer to the node allocated by prism.
4556    pointer: *mut pm_block_node_t,
4557
4558    /// The marker to indicate the lifetime of the pointer.
4559    marker: PhantomData<&'pr mut pm_block_node_t>
4560}
4561
4562impl<'pr> BlockNode<'pr> {
4563    /// Converts this node to a generic node.
4564    #[must_use]
4565    pub const fn as_node(&self) -> Node<'pr> {
4566        Node::BlockNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4567    }
4568
4569    /// Returns the location of this node.
4570    #[must_use]
4571    pub fn location(&self) -> Location<'pr> {
4572        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4573        Location::new(self.parser, unsafe { &(*pointer) })
4574    }
4575
4576    /// Returns the flags of this node.
4577    #[must_use]
4578    pub fn flags(&self) -> pm_node_flags_t {
4579        unsafe { (*self.pointer).base.flags }
4580    }
4581
4582    /// Returns the `locals` param
4583    #[must_use]
4584    pub fn locals(&self) -> ConstantList<'pr> {
4585        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
4586        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
4587    }
4588
4589    /// Returns the `parameters` param
4590    #[must_use]
4591    pub fn parameters(&self) -> Option<Node<'pr>> {
4592        let node: *mut pm_node_t = unsafe { (*self.pointer).parameters };
4593        if node.is_null() {
4594            None
4595        } else {
4596            Some(Node::new(self.parser, node))
4597        }
4598    }
4599
4600    /// Returns the `body` param
4601    #[must_use]
4602    pub fn body(&self) -> Option<Node<'pr>> {
4603        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
4604        if node.is_null() {
4605            None
4606        } else {
4607            Some(Node::new(self.parser, node))
4608        }
4609    }
4610
4611    /// Returns the `opening_loc` param
4612    #[must_use]
4613    pub fn opening_loc(&self) -> Location<'pr> {
4614        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
4615        Location::new(self.parser, unsafe { &(*pointer) })
4616    }
4617
4618    /// Returns the `closing_loc` param
4619    #[must_use]
4620    pub fn closing_loc(&self) -> Location<'pr> {
4621        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
4622        Location::new(self.parser, unsafe { &(*pointer) })
4623    }
4624}
4625
4626impl std::fmt::Debug for BlockNode<'_> {
4627    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4628        write!(f, "BlockNode({:?}, {:?}, {:?}, {:?}, {:?})", self.locals(), self.parameters(), self.body(), self.opening_loc(), self.closing_loc())
4629    }
4630}
4631
4632/// Represents a block parameter of a method, block, or lambda definition.
4633/// 
4634/// ```ruby
4635/// def a(&b)
4636///       ^^
4637/// end
4638/// ```
4639pub struct BlockParameterNode<'pr> {
4640    /// The pointer to the parser this node came from.
4641    parser: *const pm_parser_t,
4642
4643    /// The raw pointer to the node allocated by prism.
4644    pointer: *mut pm_block_parameter_node_t,
4645
4646    /// The marker to indicate the lifetime of the pointer.
4647    marker: PhantomData<&'pr mut pm_block_parameter_node_t>
4648}
4649
4650impl<'pr> BlockParameterNode<'pr> {
4651    /// Converts this node to a generic node.
4652    #[must_use]
4653    pub const fn as_node(&self) -> Node<'pr> {
4654        Node::BlockParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4655    }
4656
4657    /// Returns the location of this node.
4658    #[must_use]
4659    pub fn location(&self) -> Location<'pr> {
4660        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4661        Location::new(self.parser, unsafe { &(*pointer) })
4662    }
4663
4664    /// Returns the flags of this node.
4665    #[must_use]
4666    pub fn flags(&self) -> pm_node_flags_t {
4667        unsafe { (*self.pointer).base.flags }
4668    }
4669
4670    /// a parameter name that has been repeated in the method signature
4671    #[must_use]
4672    pub fn is_repeated_parameter(&self) -> bool {
4673        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
4674    }
4675
4676    /// Returns the `name` param
4677    #[must_use]
4678    pub fn name(&self) -> Option<ConstantId<'pr>> {
4679        let id = unsafe { (*self.pointer).name };
4680        if id == 0 {
4681            None
4682        } else {
4683            Some(ConstantId::new(self.parser, id))
4684        }
4685    }
4686
4687    /// Returns the `name_loc` param
4688    #[must_use]
4689    pub fn name_loc(&self) -> Option<Location<'pr>> {
4690        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
4691        let length = unsafe { (*pointer).length };
4692        if length == 0 {
4693            None
4694        } else {
4695            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4696        }
4697    }
4698
4699    /// Returns the `operator_loc` param
4700    #[must_use]
4701    pub fn operator_loc(&self) -> Location<'pr> {
4702        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
4703        Location::new(self.parser, unsafe { &(*pointer) })
4704    }
4705}
4706
4707impl std::fmt::Debug for BlockParameterNode<'_> {
4708    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4709        write!(f, "BlockParameterNode({:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc())
4710    }
4711}
4712
4713/// Represents a block's parameters declaration.
4714/// 
4715/// ```ruby
4716/// -> (a, b = 1; local) { }
4717///    ^^^^^^^^^^^^^^^^^
4718/// ```
4719/// 
4720/// ```ruby
4721/// foo do |a, b = 1; local|
4722///        ^^^^^^^^^^^^^^^^^
4723/// end
4724/// ```
4725pub struct BlockParametersNode<'pr> {
4726    /// The pointer to the parser this node came from.
4727    parser: *const pm_parser_t,
4728
4729    /// The raw pointer to the node allocated by prism.
4730    pointer: *mut pm_block_parameters_node_t,
4731
4732    /// The marker to indicate the lifetime of the pointer.
4733    marker: PhantomData<&'pr mut pm_block_parameters_node_t>
4734}
4735
4736impl<'pr> BlockParametersNode<'pr> {
4737    /// Converts this node to a generic node.
4738    #[must_use]
4739    pub const fn as_node(&self) -> Node<'pr> {
4740        Node::BlockParametersNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4741    }
4742
4743    /// Returns the location of this node.
4744    #[must_use]
4745    pub fn location(&self) -> Location<'pr> {
4746        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4747        Location::new(self.parser, unsafe { &(*pointer) })
4748    }
4749
4750    /// Returns the flags of this node.
4751    #[must_use]
4752    pub fn flags(&self) -> pm_node_flags_t {
4753        unsafe { (*self.pointer).base.flags }
4754    }
4755
4756    /// Returns the `parameters` param
4757    #[must_use]
4758    pub fn parameters(&self) -> Option<ParametersNode<'pr>> {
4759        let node: *mut pm_parameters_node_t = unsafe { (*self.pointer).parameters };
4760        if node.is_null() {
4761            None
4762        } else {
4763            Some(ParametersNode { parser: self.parser, pointer: node, marker: PhantomData })
4764        }
4765    }
4766
4767    /// Returns the `locals` param
4768    #[must_use]
4769    pub fn locals(&self) -> NodeList<'pr> {
4770        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).locals };
4771        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
4772    }
4773
4774    /// Returns the `opening_loc` param
4775    #[must_use]
4776    pub fn opening_loc(&self) -> Option<Location<'pr>> {
4777        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
4778        let length = unsafe { (*pointer).length };
4779        if length == 0 {
4780            None
4781        } else {
4782            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4783        }
4784    }
4785
4786    /// Returns the `closing_loc` param
4787    #[must_use]
4788    pub fn closing_loc(&self) -> Option<Location<'pr>> {
4789        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
4790        let length = unsafe { (*pointer).length };
4791        if length == 0 {
4792            None
4793        } else {
4794            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4795        }
4796    }
4797}
4798
4799impl std::fmt::Debug for BlockParametersNode<'_> {
4800    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4801        write!(f, "BlockParametersNode({:?}, {:?}, {:?}, {:?})", self.parameters(), self.locals(), self.opening_loc(), self.closing_loc())
4802    }
4803}
4804
4805/// Represents the use of the `break` keyword.
4806/// 
4807/// ```ruby
4808/// break foo
4809/// ^^^^^^^^^
4810/// ```
4811pub struct BreakNode<'pr> {
4812    /// The pointer to the parser this node came from.
4813    parser: *const pm_parser_t,
4814
4815    /// The raw pointer to the node allocated by prism.
4816    pointer: *mut pm_break_node_t,
4817
4818    /// The marker to indicate the lifetime of the pointer.
4819    marker: PhantomData<&'pr mut pm_break_node_t>
4820}
4821
4822impl<'pr> BreakNode<'pr> {
4823    /// Converts this node to a generic node.
4824    #[must_use]
4825    pub const fn as_node(&self) -> Node<'pr> {
4826        Node::BreakNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4827    }
4828
4829    /// Returns the location of this node.
4830    #[must_use]
4831    pub fn location(&self) -> Location<'pr> {
4832        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4833        Location::new(self.parser, unsafe { &(*pointer) })
4834    }
4835
4836    /// Returns the flags of this node.
4837    #[must_use]
4838    pub fn flags(&self) -> pm_node_flags_t {
4839        unsafe { (*self.pointer).base.flags }
4840    }
4841
4842    /// Returns the `arguments` param
4843    #[must_use]
4844    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
4845        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
4846        if node.is_null() {
4847            None
4848        } else {
4849            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
4850        }
4851    }
4852
4853    /// Returns the `keyword_loc` param
4854    #[must_use]
4855    pub fn keyword_loc(&self) -> Location<'pr> {
4856        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
4857        Location::new(self.parser, unsafe { &(*pointer) })
4858    }
4859}
4860
4861impl std::fmt::Debug for BreakNode<'_> {
4862    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4863        write!(f, "BreakNode({:?}, {:?})", self.arguments(), self.keyword_loc())
4864    }
4865}
4866
4867/// Represents the use of the `&&=` operator on a call.
4868/// 
4869/// ```ruby
4870/// foo.bar &&= value
4871/// ^^^^^^^^^^^^^^^^^
4872/// ```
4873pub struct CallAndWriteNode<'pr> {
4874    /// The pointer to the parser this node came from.
4875    parser: *const pm_parser_t,
4876
4877    /// The raw pointer to the node allocated by prism.
4878    pointer: *mut pm_call_and_write_node_t,
4879
4880    /// The marker to indicate the lifetime of the pointer.
4881    marker: PhantomData<&'pr mut pm_call_and_write_node_t>
4882}
4883
4884impl<'pr> CallAndWriteNode<'pr> {
4885    /// Converts this node to a generic node.
4886    #[must_use]
4887    pub const fn as_node(&self) -> Node<'pr> {
4888        Node::CallAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
4889    }
4890
4891    /// Returns the location of this node.
4892    #[must_use]
4893    pub fn location(&self) -> Location<'pr> {
4894        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
4895        Location::new(self.parser, unsafe { &(*pointer) })
4896    }
4897
4898    /// Returns the flags of this node.
4899    #[must_use]
4900    pub fn flags(&self) -> pm_node_flags_t {
4901        unsafe { (*self.pointer).base.flags }
4902    }
4903
4904    /// &. operator
4905    #[must_use]
4906    pub fn is_safe_navigation(&self) -> bool {
4907        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
4908    }
4909
4910    /// a call that could have been a local variable
4911    #[must_use]
4912    pub fn is_variable_call(&self) -> bool {
4913        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
4914    }
4915
4916    /// a call that is an attribute write, so the value being written should be returned
4917    #[must_use]
4918    pub fn is_attribute_write(&self) -> bool {
4919        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
4920    }
4921
4922    /// a call that ignores method visibility
4923    #[must_use]
4924    pub fn is_ignore_visibility(&self) -> bool {
4925        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
4926    }
4927
4928    /// Returns the `receiver` param
4929    #[must_use]
4930    pub fn receiver(&self) -> Option<Node<'pr>> {
4931        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
4932        if node.is_null() {
4933            None
4934        } else {
4935            Some(Node::new(self.parser, node))
4936        }
4937    }
4938
4939    /// Returns the `call_operator_loc` param
4940    #[must_use]
4941    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
4942        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
4943        let length = unsafe { (*pointer).length };
4944        if length == 0 {
4945            None
4946        } else {
4947            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4948        }
4949    }
4950
4951    /// Returns the `message_loc` param
4952    #[must_use]
4953    pub fn message_loc(&self) -> Option<Location<'pr>> {
4954        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).message_loc };
4955        let length = unsafe { (*pointer).length };
4956        if length == 0 {
4957            None
4958        } else {
4959            Some(Location::new(self.parser, unsafe { &(*pointer) }))
4960        }
4961    }
4962
4963    /// Returns the `read_name` param
4964    #[must_use]
4965    pub fn read_name(&self) -> ConstantId<'pr> {
4966        ConstantId::new(self.parser, unsafe { (*self.pointer).read_name })
4967    }
4968
4969    /// Returns the `write_name` param
4970    #[must_use]
4971    pub fn write_name(&self) -> ConstantId<'pr> {
4972        ConstantId::new(self.parser, unsafe { (*self.pointer).write_name })
4973    }
4974
4975    /// Returns the `operator_loc` param
4976    #[must_use]
4977    pub fn operator_loc(&self) -> Location<'pr> {
4978        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
4979        Location::new(self.parser, unsafe { &(*pointer) })
4980    }
4981
4982    /// Returns the `value` param
4983    #[must_use]
4984    pub fn value(&self) -> Node<'pr> {
4985        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
4986        Node::new(self.parser, node)
4987    }
4988}
4989
4990impl std::fmt::Debug for CallAndWriteNode<'_> {
4991    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4992        write!(f, "CallAndWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.message_loc(), self.read_name(), self.write_name(), self.operator_loc(), self.value())
4993    }
4994}
4995
4996/// Represents a method call, in all of the various forms that can take.
4997/// 
4998/// ```ruby
4999/// foo
5000/// ^^^
5001/// ```
5002/// 
5003/// ```ruby
5004/// foo()
5005/// ^^^^^
5006/// ```
5007/// 
5008/// ```ruby
5009/// +foo
5010/// ^^^^
5011/// ```
5012/// 
5013/// ```ruby
5014/// foo + bar
5015/// ^^^^^^^^^
5016/// ```
5017/// 
5018/// ```ruby
5019/// foo.bar
5020/// ^^^^^^^
5021/// ```
5022/// 
5023/// ```ruby
5024/// foo&.bar
5025/// ^^^^^^^^
5026/// ```
5027pub struct CallNode<'pr> {
5028    /// The pointer to the parser this node came from.
5029    parser: *const pm_parser_t,
5030
5031    /// The raw pointer to the node allocated by prism.
5032    pointer: *mut pm_call_node_t,
5033
5034    /// The marker to indicate the lifetime of the pointer.
5035    marker: PhantomData<&'pr mut pm_call_node_t>
5036}
5037
5038impl<'pr> CallNode<'pr> {
5039    /// Converts this node to a generic node.
5040    #[must_use]
5041    pub const fn as_node(&self) -> Node<'pr> {
5042        Node::CallNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5043    }
5044
5045    /// Returns the location of this node.
5046    #[must_use]
5047    pub fn location(&self) -> Location<'pr> {
5048        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5049        Location::new(self.parser, unsafe { &(*pointer) })
5050    }
5051
5052    /// Returns the flags of this node.
5053    #[must_use]
5054    pub fn flags(&self) -> pm_node_flags_t {
5055        unsafe { (*self.pointer).base.flags }
5056    }
5057
5058    /// &. operator
5059    #[must_use]
5060    pub fn is_safe_navigation(&self) -> bool {
5061        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
5062    }
5063
5064    /// a call that could have been a local variable
5065    #[must_use]
5066    pub fn is_variable_call(&self) -> bool {
5067        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
5068    }
5069
5070    /// a call that is an attribute write, so the value being written should be returned
5071    #[must_use]
5072    pub fn is_attribute_write(&self) -> bool {
5073        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
5074    }
5075
5076    /// a call that ignores method visibility
5077    #[must_use]
5078    pub fn is_ignore_visibility(&self) -> bool {
5079        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
5080    }
5081
5082    /// Returns the `receiver` param
5083    #[must_use]
5084    pub fn receiver(&self) -> Option<Node<'pr>> {
5085        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
5086        if node.is_null() {
5087            None
5088        } else {
5089            Some(Node::new(self.parser, node))
5090        }
5091    }
5092
5093    /// Returns the `call_operator_loc` param
5094    #[must_use]
5095    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
5096        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
5097        let length = unsafe { (*pointer).length };
5098        if length == 0 {
5099            None
5100        } else {
5101            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5102        }
5103    }
5104
5105    /// Returns the `name` param
5106    #[must_use]
5107    pub fn name(&self) -> ConstantId<'pr> {
5108        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
5109    }
5110
5111    /// Returns the `message_loc` param
5112    #[must_use]
5113    pub fn message_loc(&self) -> Option<Location<'pr>> {
5114        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).message_loc };
5115        let length = unsafe { (*pointer).length };
5116        if length == 0 {
5117            None
5118        } else {
5119            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5120        }
5121    }
5122
5123    /// Returns the `opening_loc` param
5124    #[must_use]
5125    pub fn opening_loc(&self) -> Option<Location<'pr>> {
5126        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
5127        let length = unsafe { (*pointer).length };
5128        if length == 0 {
5129            None
5130        } else {
5131            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5132        }
5133    }
5134
5135    /// Returns the `arguments` param
5136    #[must_use]
5137    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
5138        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
5139        if node.is_null() {
5140            None
5141        } else {
5142            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
5143        }
5144    }
5145
5146    /// Returns the `closing_loc` param
5147    #[must_use]
5148    pub fn closing_loc(&self) -> Option<Location<'pr>> {
5149        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
5150        let length = unsafe { (*pointer).length };
5151        if length == 0 {
5152            None
5153        } else {
5154            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5155        }
5156    }
5157
5158    /// Returns the `equal_loc` param
5159    #[must_use]
5160    pub fn equal_loc(&self) -> Option<Location<'pr>> {
5161        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).equal_loc };
5162        let length = unsafe { (*pointer).length };
5163        if length == 0 {
5164            None
5165        } else {
5166            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5167        }
5168    }
5169
5170    /// Returns the `block` param
5171    #[must_use]
5172    pub fn block(&self) -> Option<Node<'pr>> {
5173        let node: *mut pm_node_t = unsafe { (*self.pointer).block };
5174        if node.is_null() {
5175            None
5176        } else {
5177            Some(Node::new(self.parser, node))
5178        }
5179    }
5180}
5181
5182impl std::fmt::Debug for CallNode<'_> {
5183    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5184        write!(f, "CallNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.name(), self.message_loc(), self.opening_loc(), self.arguments(), self.closing_loc(), self.equal_loc(), self.block())
5185    }
5186}
5187
5188/// Represents the use of an assignment operator on a call.
5189/// 
5190/// ```ruby
5191/// foo.bar += baz
5192/// ^^^^^^^^^^^^^^
5193/// ```
5194pub struct CallOperatorWriteNode<'pr> {
5195    /// The pointer to the parser this node came from.
5196    parser: *const pm_parser_t,
5197
5198    /// The raw pointer to the node allocated by prism.
5199    pointer: *mut pm_call_operator_write_node_t,
5200
5201    /// The marker to indicate the lifetime of the pointer.
5202    marker: PhantomData<&'pr mut pm_call_operator_write_node_t>
5203}
5204
5205impl<'pr> CallOperatorWriteNode<'pr> {
5206    /// Converts this node to a generic node.
5207    #[must_use]
5208    pub const fn as_node(&self) -> Node<'pr> {
5209        Node::CallOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5210    }
5211
5212    /// Returns the location of this node.
5213    #[must_use]
5214    pub fn location(&self) -> Location<'pr> {
5215        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5216        Location::new(self.parser, unsafe { &(*pointer) })
5217    }
5218
5219    /// Returns the flags of this node.
5220    #[must_use]
5221    pub fn flags(&self) -> pm_node_flags_t {
5222        unsafe { (*self.pointer).base.flags }
5223    }
5224
5225    /// &. operator
5226    #[must_use]
5227    pub fn is_safe_navigation(&self) -> bool {
5228        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
5229    }
5230
5231    /// a call that could have been a local variable
5232    #[must_use]
5233    pub fn is_variable_call(&self) -> bool {
5234        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
5235    }
5236
5237    /// a call that is an attribute write, so the value being written should be returned
5238    #[must_use]
5239    pub fn is_attribute_write(&self) -> bool {
5240        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
5241    }
5242
5243    /// a call that ignores method visibility
5244    #[must_use]
5245    pub fn is_ignore_visibility(&self) -> bool {
5246        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
5247    }
5248
5249    /// Returns the `receiver` param
5250    #[must_use]
5251    pub fn receiver(&self) -> Option<Node<'pr>> {
5252        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
5253        if node.is_null() {
5254            None
5255        } else {
5256            Some(Node::new(self.parser, node))
5257        }
5258    }
5259
5260    /// Returns the `call_operator_loc` param
5261    #[must_use]
5262    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
5263        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
5264        let length = unsafe { (*pointer).length };
5265        if length == 0 {
5266            None
5267        } else {
5268            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5269        }
5270    }
5271
5272    /// Returns the `message_loc` param
5273    #[must_use]
5274    pub fn message_loc(&self) -> Option<Location<'pr>> {
5275        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).message_loc };
5276        let length = unsafe { (*pointer).length };
5277        if length == 0 {
5278            None
5279        } else {
5280            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5281        }
5282    }
5283
5284    /// Returns the `read_name` param
5285    #[must_use]
5286    pub fn read_name(&self) -> ConstantId<'pr> {
5287        ConstantId::new(self.parser, unsafe { (*self.pointer).read_name })
5288    }
5289
5290    /// Returns the `write_name` param
5291    #[must_use]
5292    pub fn write_name(&self) -> ConstantId<'pr> {
5293        ConstantId::new(self.parser, unsafe { (*self.pointer).write_name })
5294    }
5295
5296    /// Returns the `binary_operator` param
5297    #[must_use]
5298    pub fn binary_operator(&self) -> ConstantId<'pr> {
5299        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
5300    }
5301
5302    /// Returns the `binary_operator_loc` param
5303    #[must_use]
5304    pub fn binary_operator_loc(&self) -> Location<'pr> {
5305        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
5306        Location::new(self.parser, unsafe { &(*pointer) })
5307    }
5308
5309    /// Returns the `value` param
5310    #[must_use]
5311    pub fn value(&self) -> Node<'pr> {
5312        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
5313        Node::new(self.parser, node)
5314    }
5315}
5316
5317impl std::fmt::Debug for CallOperatorWriteNode<'_> {
5318    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5319        write!(f, "CallOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.message_loc(), self.read_name(), self.write_name(), self.binary_operator(), self.binary_operator_loc(), self.value())
5320    }
5321}
5322
5323/// Represents the use of the `||=` operator on a call.
5324/// 
5325/// ```ruby
5326/// foo.bar ||= value
5327/// ^^^^^^^^^^^^^^^^^
5328/// ```
5329pub struct CallOrWriteNode<'pr> {
5330    /// The pointer to the parser this node came from.
5331    parser: *const pm_parser_t,
5332
5333    /// The raw pointer to the node allocated by prism.
5334    pointer: *mut pm_call_or_write_node_t,
5335
5336    /// The marker to indicate the lifetime of the pointer.
5337    marker: PhantomData<&'pr mut pm_call_or_write_node_t>
5338}
5339
5340impl<'pr> CallOrWriteNode<'pr> {
5341    /// Converts this node to a generic node.
5342    #[must_use]
5343    pub const fn as_node(&self) -> Node<'pr> {
5344        Node::CallOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5345    }
5346
5347    /// Returns the location of this node.
5348    #[must_use]
5349    pub fn location(&self) -> Location<'pr> {
5350        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5351        Location::new(self.parser, unsafe { &(*pointer) })
5352    }
5353
5354    /// Returns the flags of this node.
5355    #[must_use]
5356    pub fn flags(&self) -> pm_node_flags_t {
5357        unsafe { (*self.pointer).base.flags }
5358    }
5359
5360    /// &. operator
5361    #[must_use]
5362    pub fn is_safe_navigation(&self) -> bool {
5363        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
5364    }
5365
5366    /// a call that could have been a local variable
5367    #[must_use]
5368    pub fn is_variable_call(&self) -> bool {
5369        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
5370    }
5371
5372    /// a call that is an attribute write, so the value being written should be returned
5373    #[must_use]
5374    pub fn is_attribute_write(&self) -> bool {
5375        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
5376    }
5377
5378    /// a call that ignores method visibility
5379    #[must_use]
5380    pub fn is_ignore_visibility(&self) -> bool {
5381        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
5382    }
5383
5384    /// Returns the `receiver` param
5385    #[must_use]
5386    pub fn receiver(&self) -> Option<Node<'pr>> {
5387        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
5388        if node.is_null() {
5389            None
5390        } else {
5391            Some(Node::new(self.parser, node))
5392        }
5393    }
5394
5395    /// Returns the `call_operator_loc` param
5396    #[must_use]
5397    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
5398        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
5399        let length = unsafe { (*pointer).length };
5400        if length == 0 {
5401            None
5402        } else {
5403            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5404        }
5405    }
5406
5407    /// Returns the `message_loc` param
5408    #[must_use]
5409    pub fn message_loc(&self) -> Option<Location<'pr>> {
5410        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).message_loc };
5411        let length = unsafe { (*pointer).length };
5412        if length == 0 {
5413            None
5414        } else {
5415            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5416        }
5417    }
5418
5419    /// Returns the `read_name` param
5420    #[must_use]
5421    pub fn read_name(&self) -> ConstantId<'pr> {
5422        ConstantId::new(self.parser, unsafe { (*self.pointer).read_name })
5423    }
5424
5425    /// Returns the `write_name` param
5426    #[must_use]
5427    pub fn write_name(&self) -> ConstantId<'pr> {
5428        ConstantId::new(self.parser, unsafe { (*self.pointer).write_name })
5429    }
5430
5431    /// Returns the `operator_loc` param
5432    #[must_use]
5433    pub fn operator_loc(&self) -> Location<'pr> {
5434        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
5435        Location::new(self.parser, unsafe { &(*pointer) })
5436    }
5437
5438    /// Returns the `value` param
5439    #[must_use]
5440    pub fn value(&self) -> Node<'pr> {
5441        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
5442        Node::new(self.parser, node)
5443    }
5444}
5445
5446impl std::fmt::Debug for CallOrWriteNode<'_> {
5447    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5448        write!(f, "CallOrWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.message_loc(), self.read_name(), self.write_name(), self.operator_loc(), self.value())
5449    }
5450}
5451
5452/// Represents assigning to a method call.
5453/// 
5454/// ```ruby
5455/// foo.bar, = 1
5456/// ^^^^^^^
5457/// ```
5458/// 
5459/// ```ruby
5460/// begin
5461/// rescue => foo.bar
5462///           ^^^^^^^
5463/// end
5464/// ```
5465/// 
5466/// ```ruby
5467/// for foo.bar in baz do end
5468///     ^^^^^^^
5469/// ```
5470pub struct CallTargetNode<'pr> {
5471    /// The pointer to the parser this node came from.
5472    parser: *const pm_parser_t,
5473
5474    /// The raw pointer to the node allocated by prism.
5475    pointer: *mut pm_call_target_node_t,
5476
5477    /// The marker to indicate the lifetime of the pointer.
5478    marker: PhantomData<&'pr mut pm_call_target_node_t>
5479}
5480
5481impl<'pr> CallTargetNode<'pr> {
5482    /// Converts this node to a generic node.
5483    #[must_use]
5484    pub const fn as_node(&self) -> Node<'pr> {
5485        Node::CallTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5486    }
5487
5488    /// Returns the location of this node.
5489    #[must_use]
5490    pub fn location(&self) -> Location<'pr> {
5491        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5492        Location::new(self.parser, unsafe { &(*pointer) })
5493    }
5494
5495    /// Returns the flags of this node.
5496    #[must_use]
5497    pub fn flags(&self) -> pm_node_flags_t {
5498        unsafe { (*self.pointer).base.flags }
5499    }
5500
5501    /// &. operator
5502    #[must_use]
5503    pub fn is_safe_navigation(&self) -> bool {
5504        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
5505    }
5506
5507    /// a call that could have been a local variable
5508    #[must_use]
5509    pub fn is_variable_call(&self) -> bool {
5510        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
5511    }
5512
5513    /// a call that is an attribute write, so the value being written should be returned
5514    #[must_use]
5515    pub fn is_attribute_write(&self) -> bool {
5516        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
5517    }
5518
5519    /// a call that ignores method visibility
5520    #[must_use]
5521    pub fn is_ignore_visibility(&self) -> bool {
5522        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
5523    }
5524
5525    /// Returns the `receiver` param
5526    #[must_use]
5527    pub fn receiver(&self) -> Node<'pr> {
5528        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
5529        Node::new(self.parser, node)
5530    }
5531
5532    /// Returns the `call_operator_loc` param
5533    #[must_use]
5534    pub fn call_operator_loc(&self) -> Location<'pr> {
5535        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
5536        Location::new(self.parser, unsafe { &(*pointer) })
5537    }
5538
5539    /// Returns the `name` param
5540    #[must_use]
5541    pub fn name(&self) -> ConstantId<'pr> {
5542        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
5543    }
5544
5545    /// Returns the `message_loc` param
5546    #[must_use]
5547    pub fn message_loc(&self) -> Location<'pr> {
5548        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).message_loc };
5549        Location::new(self.parser, unsafe { &(*pointer) })
5550    }
5551}
5552
5553impl std::fmt::Debug for CallTargetNode<'_> {
5554    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5555        write!(f, "CallTargetNode({:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.name(), self.message_loc())
5556    }
5557}
5558
5559/// Represents assigning to a local variable in pattern matching.
5560/// 
5561/// ```ruby
5562/// foo => [bar => baz]
5563///         ^^^^^^^^^^
5564/// ```
5565pub struct CapturePatternNode<'pr> {
5566    /// The pointer to the parser this node came from.
5567    parser: *const pm_parser_t,
5568
5569    /// The raw pointer to the node allocated by prism.
5570    pointer: *mut pm_capture_pattern_node_t,
5571
5572    /// The marker to indicate the lifetime of the pointer.
5573    marker: PhantomData<&'pr mut pm_capture_pattern_node_t>
5574}
5575
5576impl<'pr> CapturePatternNode<'pr> {
5577    /// Converts this node to a generic node.
5578    #[must_use]
5579    pub const fn as_node(&self) -> Node<'pr> {
5580        Node::CapturePatternNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5581    }
5582
5583    /// Returns the location of this node.
5584    #[must_use]
5585    pub fn location(&self) -> Location<'pr> {
5586        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5587        Location::new(self.parser, unsafe { &(*pointer) })
5588    }
5589
5590    /// Returns the flags of this node.
5591    #[must_use]
5592    pub fn flags(&self) -> pm_node_flags_t {
5593        unsafe { (*self.pointer).base.flags }
5594    }
5595
5596    /// Returns the `value` param
5597    #[must_use]
5598    pub fn value(&self) -> Node<'pr> {
5599        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
5600        Node::new(self.parser, node)
5601    }
5602
5603    /// Returns the `target` param
5604    #[must_use]
5605    pub fn target(&self) -> LocalVariableTargetNode<'pr> {
5606        let node: *mut pm_local_variable_target_node_t = unsafe { (*self.pointer).target };
5607        LocalVariableTargetNode { parser: self.parser, pointer: node, marker: PhantomData }
5608    }
5609
5610    /// Returns the `operator_loc` param
5611    #[must_use]
5612    pub fn operator_loc(&self) -> Location<'pr> {
5613        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
5614        Location::new(self.parser, unsafe { &(*pointer) })
5615    }
5616}
5617
5618impl std::fmt::Debug for CapturePatternNode<'_> {
5619    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5620        write!(f, "CapturePatternNode({:?}, {:?}, {:?})", self.value(), self.target(), self.operator_loc())
5621    }
5622}
5623
5624/// Represents the use of a case statement for pattern matching.
5625/// 
5626/// ```ruby
5627/// case true
5628/// in false
5629/// end
5630/// ^^^^^^^^^
5631/// ```
5632pub struct CaseMatchNode<'pr> {
5633    /// The pointer to the parser this node came from.
5634    parser: *const pm_parser_t,
5635
5636    /// The raw pointer to the node allocated by prism.
5637    pointer: *mut pm_case_match_node_t,
5638
5639    /// The marker to indicate the lifetime of the pointer.
5640    marker: PhantomData<&'pr mut pm_case_match_node_t>
5641}
5642
5643impl<'pr> CaseMatchNode<'pr> {
5644    /// Converts this node to a generic node.
5645    #[must_use]
5646    pub const fn as_node(&self) -> Node<'pr> {
5647        Node::CaseMatchNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5648    }
5649
5650    /// Returns the location of this node.
5651    #[must_use]
5652    pub fn location(&self) -> Location<'pr> {
5653        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5654        Location::new(self.parser, unsafe { &(*pointer) })
5655    }
5656
5657    /// Returns the flags of this node.
5658    #[must_use]
5659    pub fn flags(&self) -> pm_node_flags_t {
5660        unsafe { (*self.pointer).base.flags }
5661    }
5662
5663    /// Returns the `predicate` param
5664    #[must_use]
5665    pub fn predicate(&self) -> Option<Node<'pr>> {
5666        let node: *mut pm_node_t = unsafe { (*self.pointer).predicate };
5667        if node.is_null() {
5668            None
5669        } else {
5670            Some(Node::new(self.parser, node))
5671        }
5672    }
5673
5674    /// Returns the `conditions` param
5675    #[must_use]
5676    pub fn conditions(&self) -> NodeList<'pr> {
5677        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).conditions };
5678        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
5679    }
5680
5681    /// Returns the `else_clause` param
5682    #[must_use]
5683    pub fn else_clause(&self) -> Option<ElseNode<'pr>> {
5684        let node: *mut pm_else_node_t = unsafe { (*self.pointer).else_clause };
5685        if node.is_null() {
5686            None
5687        } else {
5688            Some(ElseNode { parser: self.parser, pointer: node, marker: PhantomData })
5689        }
5690    }
5691
5692    /// Returns the `case_keyword_loc` param
5693    #[must_use]
5694    pub fn case_keyword_loc(&self) -> Location<'pr> {
5695        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).case_keyword_loc };
5696        Location::new(self.parser, unsafe { &(*pointer) })
5697    }
5698
5699    /// Returns the `end_keyword_loc` param
5700    #[must_use]
5701    pub fn end_keyword_loc(&self) -> Location<'pr> {
5702        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
5703        Location::new(self.parser, unsafe { &(*pointer) })
5704    }
5705}
5706
5707impl std::fmt::Debug for CaseMatchNode<'_> {
5708    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5709        write!(f, "CaseMatchNode({:?}, {:?}, {:?}, {:?}, {:?})", self.predicate(), self.conditions(), self.else_clause(), self.case_keyword_loc(), self.end_keyword_loc())
5710    }
5711}
5712
5713/// Represents the use of a case statement.
5714/// 
5715/// ```ruby
5716/// case true
5717/// when false
5718/// end
5719/// ^^^^^^^^^^
5720/// ```
5721pub struct CaseNode<'pr> {
5722    /// The pointer to the parser this node came from.
5723    parser: *const pm_parser_t,
5724
5725    /// The raw pointer to the node allocated by prism.
5726    pointer: *mut pm_case_node_t,
5727
5728    /// The marker to indicate the lifetime of the pointer.
5729    marker: PhantomData<&'pr mut pm_case_node_t>
5730}
5731
5732impl<'pr> CaseNode<'pr> {
5733    /// Converts this node to a generic node.
5734    #[must_use]
5735    pub const fn as_node(&self) -> Node<'pr> {
5736        Node::CaseNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5737    }
5738
5739    /// Returns the location of this node.
5740    #[must_use]
5741    pub fn location(&self) -> Location<'pr> {
5742        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5743        Location::new(self.parser, unsafe { &(*pointer) })
5744    }
5745
5746    /// Returns the flags of this node.
5747    #[must_use]
5748    pub fn flags(&self) -> pm_node_flags_t {
5749        unsafe { (*self.pointer).base.flags }
5750    }
5751
5752    /// Returns the `predicate` param
5753    #[must_use]
5754    pub fn predicate(&self) -> Option<Node<'pr>> {
5755        let node: *mut pm_node_t = unsafe { (*self.pointer).predicate };
5756        if node.is_null() {
5757            None
5758        } else {
5759            Some(Node::new(self.parser, node))
5760        }
5761    }
5762
5763    /// Returns the `conditions` param
5764    #[must_use]
5765    pub fn conditions(&self) -> NodeList<'pr> {
5766        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).conditions };
5767        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
5768    }
5769
5770    /// Returns the `else_clause` param
5771    #[must_use]
5772    pub fn else_clause(&self) -> Option<ElseNode<'pr>> {
5773        let node: *mut pm_else_node_t = unsafe { (*self.pointer).else_clause };
5774        if node.is_null() {
5775            None
5776        } else {
5777            Some(ElseNode { parser: self.parser, pointer: node, marker: PhantomData })
5778        }
5779    }
5780
5781    /// Returns the `case_keyword_loc` param
5782    #[must_use]
5783    pub fn case_keyword_loc(&self) -> Location<'pr> {
5784        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).case_keyword_loc };
5785        Location::new(self.parser, unsafe { &(*pointer) })
5786    }
5787
5788    /// Returns the `end_keyword_loc` param
5789    #[must_use]
5790    pub fn end_keyword_loc(&self) -> Location<'pr> {
5791        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
5792        Location::new(self.parser, unsafe { &(*pointer) })
5793    }
5794}
5795
5796impl std::fmt::Debug for CaseNode<'_> {
5797    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5798        write!(f, "CaseNode({:?}, {:?}, {:?}, {:?}, {:?})", self.predicate(), self.conditions(), self.else_clause(), self.case_keyword_loc(), self.end_keyword_loc())
5799    }
5800}
5801
5802/// Represents a class declaration involving the `class` keyword.
5803/// 
5804/// ```ruby
5805/// class Foo end
5806/// ^^^^^^^^^^^^^
5807/// ```
5808pub struct ClassNode<'pr> {
5809    /// The pointer to the parser this node came from.
5810    parser: *const pm_parser_t,
5811
5812    /// The raw pointer to the node allocated by prism.
5813    pointer: *mut pm_class_node_t,
5814
5815    /// The marker to indicate the lifetime of the pointer.
5816    marker: PhantomData<&'pr mut pm_class_node_t>
5817}
5818
5819impl<'pr> ClassNode<'pr> {
5820    /// Converts this node to a generic node.
5821    #[must_use]
5822    pub const fn as_node(&self) -> Node<'pr> {
5823        Node::ClassNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5824    }
5825
5826    /// Returns the location of this node.
5827    #[must_use]
5828    pub fn location(&self) -> Location<'pr> {
5829        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5830        Location::new(self.parser, unsafe { &(*pointer) })
5831    }
5832
5833    /// Returns the flags of this node.
5834    #[must_use]
5835    pub fn flags(&self) -> pm_node_flags_t {
5836        unsafe { (*self.pointer).base.flags }
5837    }
5838
5839    /// Returns the `locals` param
5840    #[must_use]
5841    pub fn locals(&self) -> ConstantList<'pr> {
5842        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
5843        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
5844    }
5845
5846    /// Returns the `class_keyword_loc` param
5847    #[must_use]
5848    pub fn class_keyword_loc(&self) -> Location<'pr> {
5849        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).class_keyword_loc };
5850        Location::new(self.parser, unsafe { &(*pointer) })
5851    }
5852
5853    /// Returns the `constant_path` param
5854    #[must_use]
5855    pub fn constant_path(&self) -> Node<'pr> {
5856        let node: *mut pm_node_t = unsafe { (*self.pointer).constant_path };
5857        Node::new(self.parser, node)
5858    }
5859
5860    /// Returns the `inheritance_operator_loc` param
5861    #[must_use]
5862    pub fn inheritance_operator_loc(&self) -> Option<Location<'pr>> {
5863        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).inheritance_operator_loc };
5864        let length = unsafe { (*pointer).length };
5865        if length == 0 {
5866            None
5867        } else {
5868            Some(Location::new(self.parser, unsafe { &(*pointer) }))
5869        }
5870    }
5871
5872    /// Returns the `superclass` param
5873    #[must_use]
5874    pub fn superclass(&self) -> Option<Node<'pr>> {
5875        let node: *mut pm_node_t = unsafe { (*self.pointer).superclass };
5876        if node.is_null() {
5877            None
5878        } else {
5879            Some(Node::new(self.parser, node))
5880        }
5881    }
5882
5883    /// Returns the `body` param
5884    #[must_use]
5885    pub fn body(&self) -> Option<Node<'pr>> {
5886        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
5887        if node.is_null() {
5888            None
5889        } else {
5890            Some(Node::new(self.parser, node))
5891        }
5892    }
5893
5894    /// Returns the `end_keyword_loc` param
5895    #[must_use]
5896    pub fn end_keyword_loc(&self) -> Location<'pr> {
5897        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
5898        Location::new(self.parser, unsafe { &(*pointer) })
5899    }
5900
5901    /// Returns the `name` param
5902    #[must_use]
5903    pub fn name(&self) -> ConstantId<'pr> {
5904        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
5905    }
5906}
5907
5908impl std::fmt::Debug for ClassNode<'_> {
5909    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5910        write!(f, "ClassNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.locals(), self.class_keyword_loc(), self.constant_path(), self.inheritance_operator_loc(), self.superclass(), self.body(), self.end_keyword_loc(), self.name())
5911    }
5912}
5913
5914/// Represents the use of the `&&=` operator for assignment to a class variable.
5915/// 
5916/// ```ruby
5917/// @@target &&= value
5918/// ^^^^^^^^^^^^^^^^^^
5919/// ```
5920pub struct ClassVariableAndWriteNode<'pr> {
5921    /// The pointer to the parser this node came from.
5922    parser: *const pm_parser_t,
5923
5924    /// The raw pointer to the node allocated by prism.
5925    pointer: *mut pm_class_variable_and_write_node_t,
5926
5927    /// The marker to indicate the lifetime of the pointer.
5928    marker: PhantomData<&'pr mut pm_class_variable_and_write_node_t>
5929}
5930
5931impl<'pr> ClassVariableAndWriteNode<'pr> {
5932    /// Converts this node to a generic node.
5933    #[must_use]
5934    pub const fn as_node(&self) -> Node<'pr> {
5935        Node::ClassVariableAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
5936    }
5937
5938    /// Returns the location of this node.
5939    #[must_use]
5940    pub fn location(&self) -> Location<'pr> {
5941        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
5942        Location::new(self.parser, unsafe { &(*pointer) })
5943    }
5944
5945    /// Returns the flags of this node.
5946    #[must_use]
5947    pub fn flags(&self) -> pm_node_flags_t {
5948        unsafe { (*self.pointer).base.flags }
5949    }
5950
5951    /// Returns the `name` param
5952    #[must_use]
5953    pub fn name(&self) -> ConstantId<'pr> {
5954        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
5955    }
5956
5957    /// Returns the `name_loc` param
5958    #[must_use]
5959    pub fn name_loc(&self) -> Location<'pr> {
5960        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
5961        Location::new(self.parser, unsafe { &(*pointer) })
5962    }
5963
5964    /// Returns the `operator_loc` param
5965    #[must_use]
5966    pub fn operator_loc(&self) -> Location<'pr> {
5967        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
5968        Location::new(self.parser, unsafe { &(*pointer) })
5969    }
5970
5971    /// Returns the `value` param
5972    #[must_use]
5973    pub fn value(&self) -> Node<'pr> {
5974        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
5975        Node::new(self.parser, node)
5976    }
5977}
5978
5979impl std::fmt::Debug for ClassVariableAndWriteNode<'_> {
5980    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5981        write!(f, "ClassVariableAndWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
5982    }
5983}
5984
5985/// Represents assigning to a class variable using an operator that isn't `=`.
5986/// 
5987/// ```ruby
5988/// @@target += value
5989/// ^^^^^^^^^^^^^^^^^
5990/// ```
5991pub struct ClassVariableOperatorWriteNode<'pr> {
5992    /// The pointer to the parser this node came from.
5993    parser: *const pm_parser_t,
5994
5995    /// The raw pointer to the node allocated by prism.
5996    pointer: *mut pm_class_variable_operator_write_node_t,
5997
5998    /// The marker to indicate the lifetime of the pointer.
5999    marker: PhantomData<&'pr mut pm_class_variable_operator_write_node_t>
6000}
6001
6002impl<'pr> ClassVariableOperatorWriteNode<'pr> {
6003    /// Converts this node to a generic node.
6004    #[must_use]
6005    pub const fn as_node(&self) -> Node<'pr> {
6006        Node::ClassVariableOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6007    }
6008
6009    /// Returns the location of this node.
6010    #[must_use]
6011    pub fn location(&self) -> Location<'pr> {
6012        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6013        Location::new(self.parser, unsafe { &(*pointer) })
6014    }
6015
6016    /// Returns the flags of this node.
6017    #[must_use]
6018    pub fn flags(&self) -> pm_node_flags_t {
6019        unsafe { (*self.pointer).base.flags }
6020    }
6021
6022    /// Returns the `name` param
6023    #[must_use]
6024    pub fn name(&self) -> ConstantId<'pr> {
6025        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6026    }
6027
6028    /// Returns the `name_loc` param
6029    #[must_use]
6030    pub fn name_loc(&self) -> Location<'pr> {
6031        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6032        Location::new(self.parser, unsafe { &(*pointer) })
6033    }
6034
6035    /// Returns the `binary_operator_loc` param
6036    #[must_use]
6037    pub fn binary_operator_loc(&self) -> Location<'pr> {
6038        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
6039        Location::new(self.parser, unsafe { &(*pointer) })
6040    }
6041
6042    /// Returns the `value` param
6043    #[must_use]
6044    pub fn value(&self) -> Node<'pr> {
6045        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6046        Node::new(self.parser, node)
6047    }
6048
6049    /// Returns the `binary_operator` param
6050    #[must_use]
6051    pub fn binary_operator(&self) -> ConstantId<'pr> {
6052        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
6053    }
6054}
6055
6056impl std::fmt::Debug for ClassVariableOperatorWriteNode<'_> {
6057    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6058        write!(f, "ClassVariableOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.binary_operator_loc(), self.value(), self.binary_operator())
6059    }
6060}
6061
6062/// Represents the use of the `||=` operator for assignment to a class variable.
6063/// 
6064/// ```ruby
6065/// @@target ||= value
6066/// ^^^^^^^^^^^^^^^^^^
6067/// ```
6068pub struct ClassVariableOrWriteNode<'pr> {
6069    /// The pointer to the parser this node came from.
6070    parser: *const pm_parser_t,
6071
6072    /// The raw pointer to the node allocated by prism.
6073    pointer: *mut pm_class_variable_or_write_node_t,
6074
6075    /// The marker to indicate the lifetime of the pointer.
6076    marker: PhantomData<&'pr mut pm_class_variable_or_write_node_t>
6077}
6078
6079impl<'pr> ClassVariableOrWriteNode<'pr> {
6080    /// Converts this node to a generic node.
6081    #[must_use]
6082    pub const fn as_node(&self) -> Node<'pr> {
6083        Node::ClassVariableOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6084    }
6085
6086    /// Returns the location of this node.
6087    #[must_use]
6088    pub fn location(&self) -> Location<'pr> {
6089        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6090        Location::new(self.parser, unsafe { &(*pointer) })
6091    }
6092
6093    /// Returns the flags of this node.
6094    #[must_use]
6095    pub fn flags(&self) -> pm_node_flags_t {
6096        unsafe { (*self.pointer).base.flags }
6097    }
6098
6099    /// Returns the `name` param
6100    #[must_use]
6101    pub fn name(&self) -> ConstantId<'pr> {
6102        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6103    }
6104
6105    /// Returns the `name_loc` param
6106    #[must_use]
6107    pub fn name_loc(&self) -> Location<'pr> {
6108        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6109        Location::new(self.parser, unsafe { &(*pointer) })
6110    }
6111
6112    /// Returns the `operator_loc` param
6113    #[must_use]
6114    pub fn operator_loc(&self) -> Location<'pr> {
6115        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6116        Location::new(self.parser, unsafe { &(*pointer) })
6117    }
6118
6119    /// Returns the `value` param
6120    #[must_use]
6121    pub fn value(&self) -> Node<'pr> {
6122        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6123        Node::new(self.parser, node)
6124    }
6125}
6126
6127impl std::fmt::Debug for ClassVariableOrWriteNode<'_> {
6128    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6129        write!(f, "ClassVariableOrWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
6130    }
6131}
6132
6133/// Represents referencing a class variable.
6134/// 
6135/// ```ruby
6136/// @@foo
6137/// ^^^^^
6138/// ```
6139pub struct ClassVariableReadNode<'pr> {
6140    /// The pointer to the parser this node came from.
6141    parser: *const pm_parser_t,
6142
6143    /// The raw pointer to the node allocated by prism.
6144    pointer: *mut pm_class_variable_read_node_t,
6145
6146    /// The marker to indicate the lifetime of the pointer.
6147    marker: PhantomData<&'pr mut pm_class_variable_read_node_t>
6148}
6149
6150impl<'pr> ClassVariableReadNode<'pr> {
6151    /// Converts this node to a generic node.
6152    #[must_use]
6153    pub const fn as_node(&self) -> Node<'pr> {
6154        Node::ClassVariableReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6155    }
6156
6157    /// Returns the location of this node.
6158    #[must_use]
6159    pub fn location(&self) -> Location<'pr> {
6160        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6161        Location::new(self.parser, unsafe { &(*pointer) })
6162    }
6163
6164    /// Returns the flags of this node.
6165    #[must_use]
6166    pub fn flags(&self) -> pm_node_flags_t {
6167        unsafe { (*self.pointer).base.flags }
6168    }
6169
6170    /// Returns the `name` param
6171    #[must_use]
6172    pub fn name(&self) -> ConstantId<'pr> {
6173        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6174    }
6175}
6176
6177impl std::fmt::Debug for ClassVariableReadNode<'_> {
6178    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6179        write!(f, "ClassVariableReadNode({:?})", self.name())
6180    }
6181}
6182
6183/// Represents writing to a class variable in a context that doesn't have an explicit value.
6184/// 
6185/// ```ruby
6186/// @@foo, @@bar = baz
6187/// ^^^^^  ^^^^^
6188/// ```
6189pub struct ClassVariableTargetNode<'pr> {
6190    /// The pointer to the parser this node came from.
6191    parser: *const pm_parser_t,
6192
6193    /// The raw pointer to the node allocated by prism.
6194    pointer: *mut pm_class_variable_target_node_t,
6195
6196    /// The marker to indicate the lifetime of the pointer.
6197    marker: PhantomData<&'pr mut pm_class_variable_target_node_t>
6198}
6199
6200impl<'pr> ClassVariableTargetNode<'pr> {
6201    /// Converts this node to a generic node.
6202    #[must_use]
6203    pub const fn as_node(&self) -> Node<'pr> {
6204        Node::ClassVariableTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6205    }
6206
6207    /// Returns the location of this node.
6208    #[must_use]
6209    pub fn location(&self) -> Location<'pr> {
6210        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6211        Location::new(self.parser, unsafe { &(*pointer) })
6212    }
6213
6214    /// Returns the flags of this node.
6215    #[must_use]
6216    pub fn flags(&self) -> pm_node_flags_t {
6217        unsafe { (*self.pointer).base.flags }
6218    }
6219
6220    /// Returns the `name` param
6221    #[must_use]
6222    pub fn name(&self) -> ConstantId<'pr> {
6223        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6224    }
6225}
6226
6227impl std::fmt::Debug for ClassVariableTargetNode<'_> {
6228    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6229        write!(f, "ClassVariableTargetNode({:?})", self.name())
6230    }
6231}
6232
6233/// Represents writing to a class variable.
6234/// 
6235/// ```ruby
6236/// @@foo = 1
6237/// ^^^^^^^^^
6238/// ```
6239pub struct ClassVariableWriteNode<'pr> {
6240    /// The pointer to the parser this node came from.
6241    parser: *const pm_parser_t,
6242
6243    /// The raw pointer to the node allocated by prism.
6244    pointer: *mut pm_class_variable_write_node_t,
6245
6246    /// The marker to indicate the lifetime of the pointer.
6247    marker: PhantomData<&'pr mut pm_class_variable_write_node_t>
6248}
6249
6250impl<'pr> ClassVariableWriteNode<'pr> {
6251    /// Converts this node to a generic node.
6252    #[must_use]
6253    pub const fn as_node(&self) -> Node<'pr> {
6254        Node::ClassVariableWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6255    }
6256
6257    /// Returns the location of this node.
6258    #[must_use]
6259    pub fn location(&self) -> Location<'pr> {
6260        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6261        Location::new(self.parser, unsafe { &(*pointer) })
6262    }
6263
6264    /// Returns the flags of this node.
6265    #[must_use]
6266    pub fn flags(&self) -> pm_node_flags_t {
6267        unsafe { (*self.pointer).base.flags }
6268    }
6269
6270    /// Returns the `name` param
6271    #[must_use]
6272    pub fn name(&self) -> ConstantId<'pr> {
6273        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6274    }
6275
6276    /// Returns the `name_loc` param
6277    #[must_use]
6278    pub fn name_loc(&self) -> Location<'pr> {
6279        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6280        Location::new(self.parser, unsafe { &(*pointer) })
6281    }
6282
6283    /// Returns the `value` param
6284    #[must_use]
6285    pub fn value(&self) -> Node<'pr> {
6286        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6287        Node::new(self.parser, node)
6288    }
6289
6290    /// Returns the `operator_loc` param
6291    #[must_use]
6292    pub fn operator_loc(&self) -> Location<'pr> {
6293        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6294        Location::new(self.parser, unsafe { &(*pointer) })
6295    }
6296}
6297
6298impl std::fmt::Debug for ClassVariableWriteNode<'_> {
6299    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6300        write!(f, "ClassVariableWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.value(), self.operator_loc())
6301    }
6302}
6303
6304/// Represents the use of the `&&=` operator for assignment to a constant.
6305/// 
6306/// ```ruby
6307/// Target &&= value
6308/// ^^^^^^^^^^^^^^^^
6309/// ```
6310pub struct ConstantAndWriteNode<'pr> {
6311    /// The pointer to the parser this node came from.
6312    parser: *const pm_parser_t,
6313
6314    /// The raw pointer to the node allocated by prism.
6315    pointer: *mut pm_constant_and_write_node_t,
6316
6317    /// The marker to indicate the lifetime of the pointer.
6318    marker: PhantomData<&'pr mut pm_constant_and_write_node_t>
6319}
6320
6321impl<'pr> ConstantAndWriteNode<'pr> {
6322    /// Converts this node to a generic node.
6323    #[must_use]
6324    pub const fn as_node(&self) -> Node<'pr> {
6325        Node::ConstantAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6326    }
6327
6328    /// Returns the location of this node.
6329    #[must_use]
6330    pub fn location(&self) -> Location<'pr> {
6331        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6332        Location::new(self.parser, unsafe { &(*pointer) })
6333    }
6334
6335    /// Returns the flags of this node.
6336    #[must_use]
6337    pub fn flags(&self) -> pm_node_flags_t {
6338        unsafe { (*self.pointer).base.flags }
6339    }
6340
6341    /// Returns the `name` param
6342    #[must_use]
6343    pub fn name(&self) -> ConstantId<'pr> {
6344        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6345    }
6346
6347    /// Returns the `name_loc` param
6348    #[must_use]
6349    pub fn name_loc(&self) -> Location<'pr> {
6350        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6351        Location::new(self.parser, unsafe { &(*pointer) })
6352    }
6353
6354    /// Returns the `operator_loc` param
6355    #[must_use]
6356    pub fn operator_loc(&self) -> Location<'pr> {
6357        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6358        Location::new(self.parser, unsafe { &(*pointer) })
6359    }
6360
6361    /// Returns the `value` param
6362    #[must_use]
6363    pub fn value(&self) -> Node<'pr> {
6364        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6365        Node::new(self.parser, node)
6366    }
6367}
6368
6369impl std::fmt::Debug for ConstantAndWriteNode<'_> {
6370    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6371        write!(f, "ConstantAndWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
6372    }
6373}
6374
6375/// Represents assigning to a constant using an operator that isn't `=`.
6376/// 
6377/// ```ruby
6378/// Target += value
6379/// ^^^^^^^^^^^^^^^
6380/// ```
6381pub struct ConstantOperatorWriteNode<'pr> {
6382    /// The pointer to the parser this node came from.
6383    parser: *const pm_parser_t,
6384
6385    /// The raw pointer to the node allocated by prism.
6386    pointer: *mut pm_constant_operator_write_node_t,
6387
6388    /// The marker to indicate the lifetime of the pointer.
6389    marker: PhantomData<&'pr mut pm_constant_operator_write_node_t>
6390}
6391
6392impl<'pr> ConstantOperatorWriteNode<'pr> {
6393    /// Converts this node to a generic node.
6394    #[must_use]
6395    pub const fn as_node(&self) -> Node<'pr> {
6396        Node::ConstantOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6397    }
6398
6399    /// Returns the location of this node.
6400    #[must_use]
6401    pub fn location(&self) -> Location<'pr> {
6402        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6403        Location::new(self.parser, unsafe { &(*pointer) })
6404    }
6405
6406    /// Returns the flags of this node.
6407    #[must_use]
6408    pub fn flags(&self) -> pm_node_flags_t {
6409        unsafe { (*self.pointer).base.flags }
6410    }
6411
6412    /// Returns the `name` param
6413    #[must_use]
6414    pub fn name(&self) -> ConstantId<'pr> {
6415        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6416    }
6417
6418    /// Returns the `name_loc` param
6419    #[must_use]
6420    pub fn name_loc(&self) -> Location<'pr> {
6421        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6422        Location::new(self.parser, unsafe { &(*pointer) })
6423    }
6424
6425    /// Returns the `binary_operator_loc` param
6426    #[must_use]
6427    pub fn binary_operator_loc(&self) -> Location<'pr> {
6428        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
6429        Location::new(self.parser, unsafe { &(*pointer) })
6430    }
6431
6432    /// Returns the `value` param
6433    #[must_use]
6434    pub fn value(&self) -> Node<'pr> {
6435        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6436        Node::new(self.parser, node)
6437    }
6438
6439    /// Returns the `binary_operator` param
6440    #[must_use]
6441    pub fn binary_operator(&self) -> ConstantId<'pr> {
6442        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
6443    }
6444}
6445
6446impl std::fmt::Debug for ConstantOperatorWriteNode<'_> {
6447    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6448        write!(f, "ConstantOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.binary_operator_loc(), self.value(), self.binary_operator())
6449    }
6450}
6451
6452/// Represents the use of the `||=` operator for assignment to a constant.
6453/// 
6454/// ```ruby
6455/// Target ||= value
6456/// ^^^^^^^^^^^^^^^^
6457/// ```
6458pub struct ConstantOrWriteNode<'pr> {
6459    /// The pointer to the parser this node came from.
6460    parser: *const pm_parser_t,
6461
6462    /// The raw pointer to the node allocated by prism.
6463    pointer: *mut pm_constant_or_write_node_t,
6464
6465    /// The marker to indicate the lifetime of the pointer.
6466    marker: PhantomData<&'pr mut pm_constant_or_write_node_t>
6467}
6468
6469impl<'pr> ConstantOrWriteNode<'pr> {
6470    /// Converts this node to a generic node.
6471    #[must_use]
6472    pub const fn as_node(&self) -> Node<'pr> {
6473        Node::ConstantOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6474    }
6475
6476    /// Returns the location of this node.
6477    #[must_use]
6478    pub fn location(&self) -> Location<'pr> {
6479        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6480        Location::new(self.parser, unsafe { &(*pointer) })
6481    }
6482
6483    /// Returns the flags of this node.
6484    #[must_use]
6485    pub fn flags(&self) -> pm_node_flags_t {
6486        unsafe { (*self.pointer).base.flags }
6487    }
6488
6489    /// Returns the `name` param
6490    #[must_use]
6491    pub fn name(&self) -> ConstantId<'pr> {
6492        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
6493    }
6494
6495    /// Returns the `name_loc` param
6496    #[must_use]
6497    pub fn name_loc(&self) -> Location<'pr> {
6498        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6499        Location::new(self.parser, unsafe { &(*pointer) })
6500    }
6501
6502    /// Returns the `operator_loc` param
6503    #[must_use]
6504    pub fn operator_loc(&self) -> Location<'pr> {
6505        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6506        Location::new(self.parser, unsafe { &(*pointer) })
6507    }
6508
6509    /// Returns the `value` param
6510    #[must_use]
6511    pub fn value(&self) -> Node<'pr> {
6512        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6513        Node::new(self.parser, node)
6514    }
6515}
6516
6517impl std::fmt::Debug for ConstantOrWriteNode<'_> {
6518    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6519        write!(f, "ConstantOrWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
6520    }
6521}
6522
6523/// Represents the use of the `&&=` operator for assignment to a constant path.
6524/// 
6525/// ```ruby
6526/// Parent::Child &&= value
6527/// ^^^^^^^^^^^^^^^^^^^^^^^
6528/// ```
6529pub struct ConstantPathAndWriteNode<'pr> {
6530    /// The pointer to the parser this node came from.
6531    parser: *const pm_parser_t,
6532
6533    /// The raw pointer to the node allocated by prism.
6534    pointer: *mut pm_constant_path_and_write_node_t,
6535
6536    /// The marker to indicate the lifetime of the pointer.
6537    marker: PhantomData<&'pr mut pm_constant_path_and_write_node_t>
6538}
6539
6540impl<'pr> ConstantPathAndWriteNode<'pr> {
6541    /// Converts this node to a generic node.
6542    #[must_use]
6543    pub const fn as_node(&self) -> Node<'pr> {
6544        Node::ConstantPathAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6545    }
6546
6547    /// Returns the location of this node.
6548    #[must_use]
6549    pub fn location(&self) -> Location<'pr> {
6550        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6551        Location::new(self.parser, unsafe { &(*pointer) })
6552    }
6553
6554    /// Returns the flags of this node.
6555    #[must_use]
6556    pub fn flags(&self) -> pm_node_flags_t {
6557        unsafe { (*self.pointer).base.flags }
6558    }
6559
6560    /// Returns the `target` param
6561    #[must_use]
6562    pub fn target(&self) -> ConstantPathNode<'pr> {
6563        let node: *mut pm_constant_path_node_t = unsafe { (*self.pointer).target };
6564        ConstantPathNode { parser: self.parser, pointer: node, marker: PhantomData }
6565    }
6566
6567    /// Returns the `operator_loc` param
6568    #[must_use]
6569    pub fn operator_loc(&self) -> Location<'pr> {
6570        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6571        Location::new(self.parser, unsafe { &(*pointer) })
6572    }
6573
6574    /// Returns the `value` param
6575    #[must_use]
6576    pub fn value(&self) -> Node<'pr> {
6577        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6578        Node::new(self.parser, node)
6579    }
6580}
6581
6582impl std::fmt::Debug for ConstantPathAndWriteNode<'_> {
6583    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6584        write!(f, "ConstantPathAndWriteNode({:?}, {:?}, {:?})", self.target(), self.operator_loc(), self.value())
6585    }
6586}
6587
6588/// Represents accessing a constant through a path of `::` operators.
6589/// 
6590/// ```ruby
6591/// Foo::Bar
6592/// ^^^^^^^^
6593/// ```
6594pub struct ConstantPathNode<'pr> {
6595    /// The pointer to the parser this node came from.
6596    parser: *const pm_parser_t,
6597
6598    /// The raw pointer to the node allocated by prism.
6599    pointer: *mut pm_constant_path_node_t,
6600
6601    /// The marker to indicate the lifetime of the pointer.
6602    marker: PhantomData<&'pr mut pm_constant_path_node_t>
6603}
6604
6605impl<'pr> ConstantPathNode<'pr> {
6606    /// Converts this node to a generic node.
6607    #[must_use]
6608    pub const fn as_node(&self) -> Node<'pr> {
6609        Node::ConstantPathNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6610    }
6611
6612    /// Returns the location of this node.
6613    #[must_use]
6614    pub fn location(&self) -> Location<'pr> {
6615        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6616        Location::new(self.parser, unsafe { &(*pointer) })
6617    }
6618
6619    /// Returns the flags of this node.
6620    #[must_use]
6621    pub fn flags(&self) -> pm_node_flags_t {
6622        unsafe { (*self.pointer).base.flags }
6623    }
6624
6625    /// Returns the `parent` param
6626    #[must_use]
6627    pub fn parent(&self) -> Option<Node<'pr>> {
6628        let node: *mut pm_node_t = unsafe { (*self.pointer).parent };
6629        if node.is_null() {
6630            None
6631        } else {
6632            Some(Node::new(self.parser, node))
6633        }
6634    }
6635
6636    /// Returns the `name` param
6637    #[must_use]
6638    pub fn name(&self) -> Option<ConstantId<'pr>> {
6639        let id = unsafe { (*self.pointer).name };
6640        if id == 0 {
6641            None
6642        } else {
6643            Some(ConstantId::new(self.parser, id))
6644        }
6645    }
6646
6647    /// Returns the `delimiter_loc` param
6648    #[must_use]
6649    pub fn delimiter_loc(&self) -> Location<'pr> {
6650        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).delimiter_loc };
6651        Location::new(self.parser, unsafe { &(*pointer) })
6652    }
6653
6654    /// Returns the `name_loc` param
6655    #[must_use]
6656    pub fn name_loc(&self) -> Location<'pr> {
6657        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6658        Location::new(self.parser, unsafe { &(*pointer) })
6659    }
6660}
6661
6662impl std::fmt::Debug for ConstantPathNode<'_> {
6663    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6664        write!(f, "ConstantPathNode({:?}, {:?}, {:?}, {:?})", self.parent(), self.name(), self.delimiter_loc(), self.name_loc())
6665    }
6666}
6667
6668/// Represents assigning to a constant path using an operator that isn't `=`.
6669/// 
6670/// ```ruby
6671/// Parent::Child += value
6672/// ^^^^^^^^^^^^^^^^^^^^^^
6673/// ```
6674pub struct ConstantPathOperatorWriteNode<'pr> {
6675    /// The pointer to the parser this node came from.
6676    parser: *const pm_parser_t,
6677
6678    /// The raw pointer to the node allocated by prism.
6679    pointer: *mut pm_constant_path_operator_write_node_t,
6680
6681    /// The marker to indicate the lifetime of the pointer.
6682    marker: PhantomData<&'pr mut pm_constant_path_operator_write_node_t>
6683}
6684
6685impl<'pr> ConstantPathOperatorWriteNode<'pr> {
6686    /// Converts this node to a generic node.
6687    #[must_use]
6688    pub const fn as_node(&self) -> Node<'pr> {
6689        Node::ConstantPathOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6690    }
6691
6692    /// Returns the location of this node.
6693    #[must_use]
6694    pub fn location(&self) -> Location<'pr> {
6695        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6696        Location::new(self.parser, unsafe { &(*pointer) })
6697    }
6698
6699    /// Returns the flags of this node.
6700    #[must_use]
6701    pub fn flags(&self) -> pm_node_flags_t {
6702        unsafe { (*self.pointer).base.flags }
6703    }
6704
6705    /// Returns the `target` param
6706    #[must_use]
6707    pub fn target(&self) -> ConstantPathNode<'pr> {
6708        let node: *mut pm_constant_path_node_t = unsafe { (*self.pointer).target };
6709        ConstantPathNode { parser: self.parser, pointer: node, marker: PhantomData }
6710    }
6711
6712    /// Returns the `binary_operator_loc` param
6713    #[must_use]
6714    pub fn binary_operator_loc(&self) -> Location<'pr> {
6715        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
6716        Location::new(self.parser, unsafe { &(*pointer) })
6717    }
6718
6719    /// Returns the `value` param
6720    #[must_use]
6721    pub fn value(&self) -> Node<'pr> {
6722        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6723        Node::new(self.parser, node)
6724    }
6725
6726    /// Returns the `binary_operator` param
6727    #[must_use]
6728    pub fn binary_operator(&self) -> ConstantId<'pr> {
6729        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
6730    }
6731}
6732
6733impl std::fmt::Debug for ConstantPathOperatorWriteNode<'_> {
6734    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6735        write!(f, "ConstantPathOperatorWriteNode({:?}, {:?}, {:?}, {:?})", self.target(), self.binary_operator_loc(), self.value(), self.binary_operator())
6736    }
6737}
6738
6739/// Represents the use of the `||=` operator for assignment to a constant path.
6740/// 
6741/// ```ruby
6742/// Parent::Child ||= value
6743/// ^^^^^^^^^^^^^^^^^^^^^^^
6744/// ```
6745pub struct ConstantPathOrWriteNode<'pr> {
6746    /// The pointer to the parser this node came from.
6747    parser: *const pm_parser_t,
6748
6749    /// The raw pointer to the node allocated by prism.
6750    pointer: *mut pm_constant_path_or_write_node_t,
6751
6752    /// The marker to indicate the lifetime of the pointer.
6753    marker: PhantomData<&'pr mut pm_constant_path_or_write_node_t>
6754}
6755
6756impl<'pr> ConstantPathOrWriteNode<'pr> {
6757    /// Converts this node to a generic node.
6758    #[must_use]
6759    pub const fn as_node(&self) -> Node<'pr> {
6760        Node::ConstantPathOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6761    }
6762
6763    /// Returns the location of this node.
6764    #[must_use]
6765    pub fn location(&self) -> Location<'pr> {
6766        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6767        Location::new(self.parser, unsafe { &(*pointer) })
6768    }
6769
6770    /// Returns the flags of this node.
6771    #[must_use]
6772    pub fn flags(&self) -> pm_node_flags_t {
6773        unsafe { (*self.pointer).base.flags }
6774    }
6775
6776    /// Returns the `target` param
6777    #[must_use]
6778    pub fn target(&self) -> ConstantPathNode<'pr> {
6779        let node: *mut pm_constant_path_node_t = unsafe { (*self.pointer).target };
6780        ConstantPathNode { parser: self.parser, pointer: node, marker: PhantomData }
6781    }
6782
6783    /// Returns the `operator_loc` param
6784    #[must_use]
6785    pub fn operator_loc(&self) -> Location<'pr> {
6786        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6787        Location::new(self.parser, unsafe { &(*pointer) })
6788    }
6789
6790    /// Returns the `value` param
6791    #[must_use]
6792    pub fn value(&self) -> Node<'pr> {
6793        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6794        Node::new(self.parser, node)
6795    }
6796}
6797
6798impl std::fmt::Debug for ConstantPathOrWriteNode<'_> {
6799    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6800        write!(f, "ConstantPathOrWriteNode({:?}, {:?}, {:?})", self.target(), self.operator_loc(), self.value())
6801    }
6802}
6803
6804/// Represents writing to a constant path in a context that doesn't have an explicit value.
6805/// 
6806/// ```ruby
6807/// Foo::Foo, Bar::Bar = baz
6808/// ^^^^^^^^  ^^^^^^^^
6809/// ```
6810pub struct ConstantPathTargetNode<'pr> {
6811    /// The pointer to the parser this node came from.
6812    parser: *const pm_parser_t,
6813
6814    /// The raw pointer to the node allocated by prism.
6815    pointer: *mut pm_constant_path_target_node_t,
6816
6817    /// The marker to indicate the lifetime of the pointer.
6818    marker: PhantomData<&'pr mut pm_constant_path_target_node_t>
6819}
6820
6821impl<'pr> ConstantPathTargetNode<'pr> {
6822    /// Converts this node to a generic node.
6823    #[must_use]
6824    pub const fn as_node(&self) -> Node<'pr> {
6825        Node::ConstantPathTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6826    }
6827
6828    /// Returns the location of this node.
6829    #[must_use]
6830    pub fn location(&self) -> Location<'pr> {
6831        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6832        Location::new(self.parser, unsafe { &(*pointer) })
6833    }
6834
6835    /// Returns the flags of this node.
6836    #[must_use]
6837    pub fn flags(&self) -> pm_node_flags_t {
6838        unsafe { (*self.pointer).base.flags }
6839    }
6840
6841    /// Returns the `parent` param
6842    #[must_use]
6843    pub fn parent(&self) -> Option<Node<'pr>> {
6844        let node: *mut pm_node_t = unsafe { (*self.pointer).parent };
6845        if node.is_null() {
6846            None
6847        } else {
6848            Some(Node::new(self.parser, node))
6849        }
6850    }
6851
6852    /// Returns the `name` param
6853    #[must_use]
6854    pub fn name(&self) -> Option<ConstantId<'pr>> {
6855        let id = unsafe { (*self.pointer).name };
6856        if id == 0 {
6857            None
6858        } else {
6859            Some(ConstantId::new(self.parser, id))
6860        }
6861    }
6862
6863    /// Returns the `delimiter_loc` param
6864    #[must_use]
6865    pub fn delimiter_loc(&self) -> Location<'pr> {
6866        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).delimiter_loc };
6867        Location::new(self.parser, unsafe { &(*pointer) })
6868    }
6869
6870    /// Returns the `name_loc` param
6871    #[must_use]
6872    pub fn name_loc(&self) -> Location<'pr> {
6873        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
6874        Location::new(self.parser, unsafe { &(*pointer) })
6875    }
6876}
6877
6878impl std::fmt::Debug for ConstantPathTargetNode<'_> {
6879    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6880        write!(f, "ConstantPathTargetNode({:?}, {:?}, {:?}, {:?})", self.parent(), self.name(), self.delimiter_loc(), self.name_loc())
6881    }
6882}
6883
6884/// Represents writing to a constant path.
6885/// 
6886/// ```ruby
6887/// ::Foo = 1
6888/// ^^^^^^^^^
6889/// ```
6890/// 
6891/// ```ruby
6892/// Foo::Bar = 1
6893/// ^^^^^^^^^^^^
6894/// ```
6895/// 
6896/// ```ruby
6897/// ::Foo::Bar = 1
6898/// ^^^^^^^^^^^^^^
6899/// ```
6900pub struct ConstantPathWriteNode<'pr> {
6901    /// The pointer to the parser this node came from.
6902    parser: *const pm_parser_t,
6903
6904    /// The raw pointer to the node allocated by prism.
6905    pointer: *mut pm_constant_path_write_node_t,
6906
6907    /// The marker to indicate the lifetime of the pointer.
6908    marker: PhantomData<&'pr mut pm_constant_path_write_node_t>
6909}
6910
6911impl<'pr> ConstantPathWriteNode<'pr> {
6912    /// Converts this node to a generic node.
6913    #[must_use]
6914    pub const fn as_node(&self) -> Node<'pr> {
6915        Node::ConstantPathWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6916    }
6917
6918    /// Returns the location of this node.
6919    #[must_use]
6920    pub fn location(&self) -> Location<'pr> {
6921        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6922        Location::new(self.parser, unsafe { &(*pointer) })
6923    }
6924
6925    /// Returns the flags of this node.
6926    #[must_use]
6927    pub fn flags(&self) -> pm_node_flags_t {
6928        unsafe { (*self.pointer).base.flags }
6929    }
6930
6931    /// Returns the `target` param
6932    #[must_use]
6933    pub fn target(&self) -> ConstantPathNode<'pr> {
6934        let node: *mut pm_constant_path_node_t = unsafe { (*self.pointer).target };
6935        ConstantPathNode { parser: self.parser, pointer: node, marker: PhantomData }
6936    }
6937
6938    /// Returns the `operator_loc` param
6939    #[must_use]
6940    pub fn operator_loc(&self) -> Location<'pr> {
6941        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
6942        Location::new(self.parser, unsafe { &(*pointer) })
6943    }
6944
6945    /// Returns the `value` param
6946    #[must_use]
6947    pub fn value(&self) -> Node<'pr> {
6948        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
6949        Node::new(self.parser, node)
6950    }
6951}
6952
6953impl std::fmt::Debug for ConstantPathWriteNode<'_> {
6954    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6955        write!(f, "ConstantPathWriteNode({:?}, {:?}, {:?})", self.target(), self.operator_loc(), self.value())
6956    }
6957}
6958
6959/// Represents referencing a constant.
6960/// 
6961/// ```ruby
6962/// Foo
6963/// ^^^
6964/// ```
6965pub struct ConstantReadNode<'pr> {
6966    /// The pointer to the parser this node came from.
6967    parser: *const pm_parser_t,
6968
6969    /// The raw pointer to the node allocated by prism.
6970    pointer: *mut pm_constant_read_node_t,
6971
6972    /// The marker to indicate the lifetime of the pointer.
6973    marker: PhantomData<&'pr mut pm_constant_read_node_t>
6974}
6975
6976impl<'pr> ConstantReadNode<'pr> {
6977    /// Converts this node to a generic node.
6978    #[must_use]
6979    pub const fn as_node(&self) -> Node<'pr> {
6980        Node::ConstantReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
6981    }
6982
6983    /// Returns the location of this node.
6984    #[must_use]
6985    pub fn location(&self) -> Location<'pr> {
6986        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
6987        Location::new(self.parser, unsafe { &(*pointer) })
6988    }
6989
6990    /// Returns the flags of this node.
6991    #[must_use]
6992    pub fn flags(&self) -> pm_node_flags_t {
6993        unsafe { (*self.pointer).base.flags }
6994    }
6995
6996    /// Returns the `name` param
6997    #[must_use]
6998    pub fn name(&self) -> ConstantId<'pr> {
6999        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
7000    }
7001}
7002
7003impl std::fmt::Debug for ConstantReadNode<'_> {
7004    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7005        write!(f, "ConstantReadNode({:?})", self.name())
7006    }
7007}
7008
7009/// Represents writing to a constant in a context that doesn't have an explicit value.
7010/// 
7011/// ```ruby
7012/// Foo, Bar = baz
7013/// ^^^  ^^^
7014/// ```
7015pub struct ConstantTargetNode<'pr> {
7016    /// The pointer to the parser this node came from.
7017    parser: *const pm_parser_t,
7018
7019    /// The raw pointer to the node allocated by prism.
7020    pointer: *mut pm_constant_target_node_t,
7021
7022    /// The marker to indicate the lifetime of the pointer.
7023    marker: PhantomData<&'pr mut pm_constant_target_node_t>
7024}
7025
7026impl<'pr> ConstantTargetNode<'pr> {
7027    /// Converts this node to a generic node.
7028    #[must_use]
7029    pub const fn as_node(&self) -> Node<'pr> {
7030        Node::ConstantTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7031    }
7032
7033    /// Returns the location of this node.
7034    #[must_use]
7035    pub fn location(&self) -> Location<'pr> {
7036        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7037        Location::new(self.parser, unsafe { &(*pointer) })
7038    }
7039
7040    /// Returns the flags of this node.
7041    #[must_use]
7042    pub fn flags(&self) -> pm_node_flags_t {
7043        unsafe { (*self.pointer).base.flags }
7044    }
7045
7046    /// Returns the `name` param
7047    #[must_use]
7048    pub fn name(&self) -> ConstantId<'pr> {
7049        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
7050    }
7051}
7052
7053impl std::fmt::Debug for ConstantTargetNode<'_> {
7054    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7055        write!(f, "ConstantTargetNode({:?})", self.name())
7056    }
7057}
7058
7059/// Represents writing to a constant.
7060/// 
7061/// ```ruby
7062/// Foo = 1
7063/// ^^^^^^^
7064/// ```
7065pub struct ConstantWriteNode<'pr> {
7066    /// The pointer to the parser this node came from.
7067    parser: *const pm_parser_t,
7068
7069    /// The raw pointer to the node allocated by prism.
7070    pointer: *mut pm_constant_write_node_t,
7071
7072    /// The marker to indicate the lifetime of the pointer.
7073    marker: PhantomData<&'pr mut pm_constant_write_node_t>
7074}
7075
7076impl<'pr> ConstantWriteNode<'pr> {
7077    /// Converts this node to a generic node.
7078    #[must_use]
7079    pub const fn as_node(&self) -> Node<'pr> {
7080        Node::ConstantWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7081    }
7082
7083    /// Returns the location of this node.
7084    #[must_use]
7085    pub fn location(&self) -> Location<'pr> {
7086        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7087        Location::new(self.parser, unsafe { &(*pointer) })
7088    }
7089
7090    /// Returns the flags of this node.
7091    #[must_use]
7092    pub fn flags(&self) -> pm_node_flags_t {
7093        unsafe { (*self.pointer).base.flags }
7094    }
7095
7096    /// Returns the `name` param
7097    #[must_use]
7098    pub fn name(&self) -> ConstantId<'pr> {
7099        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
7100    }
7101
7102    /// Returns the `name_loc` param
7103    #[must_use]
7104    pub fn name_loc(&self) -> Location<'pr> {
7105        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
7106        Location::new(self.parser, unsafe { &(*pointer) })
7107    }
7108
7109    /// Returns the `value` param
7110    #[must_use]
7111    pub fn value(&self) -> Node<'pr> {
7112        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
7113        Node::new(self.parser, node)
7114    }
7115
7116    /// Returns the `operator_loc` param
7117    #[must_use]
7118    pub fn operator_loc(&self) -> Location<'pr> {
7119        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
7120        Location::new(self.parser, unsafe { &(*pointer) })
7121    }
7122}
7123
7124impl std::fmt::Debug for ConstantWriteNode<'_> {
7125    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7126        write!(f, "ConstantWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.value(), self.operator_loc())
7127    }
7128}
7129
7130/// Represents a method definition.
7131/// 
7132/// ```ruby
7133/// def method
7134/// end
7135/// ^^^^^^^^^^
7136/// ```
7137pub struct DefNode<'pr> {
7138    /// The pointer to the parser this node came from.
7139    parser: *const pm_parser_t,
7140
7141    /// The raw pointer to the node allocated by prism.
7142    pointer: *mut pm_def_node_t,
7143
7144    /// The marker to indicate the lifetime of the pointer.
7145    marker: PhantomData<&'pr mut pm_def_node_t>
7146}
7147
7148impl<'pr> DefNode<'pr> {
7149    /// Converts this node to a generic node.
7150    #[must_use]
7151    pub const fn as_node(&self) -> Node<'pr> {
7152        Node::DefNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7153    }
7154
7155    /// Returns the location of this node.
7156    #[must_use]
7157    pub fn location(&self) -> Location<'pr> {
7158        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7159        Location::new(self.parser, unsafe { &(*pointer) })
7160    }
7161
7162    /// Returns the flags of this node.
7163    #[must_use]
7164    pub fn flags(&self) -> pm_node_flags_t {
7165        unsafe { (*self.pointer).base.flags }
7166    }
7167
7168    /// Returns the `name` param
7169    #[must_use]
7170    pub fn name(&self) -> ConstantId<'pr> {
7171        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
7172    }
7173
7174    /// Returns the `name_loc` param
7175    #[must_use]
7176    pub fn name_loc(&self) -> Location<'pr> {
7177        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
7178        Location::new(self.parser, unsafe { &(*pointer) })
7179    }
7180
7181    /// Returns the `receiver` param
7182    #[must_use]
7183    pub fn receiver(&self) -> Option<Node<'pr>> {
7184        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
7185        if node.is_null() {
7186            None
7187        } else {
7188            Some(Node::new(self.parser, node))
7189        }
7190    }
7191
7192    /// Returns the `parameters` param
7193    #[must_use]
7194    pub fn parameters(&self) -> Option<ParametersNode<'pr>> {
7195        let node: *mut pm_parameters_node_t = unsafe { (*self.pointer).parameters };
7196        if node.is_null() {
7197            None
7198        } else {
7199            Some(ParametersNode { parser: self.parser, pointer: node, marker: PhantomData })
7200        }
7201    }
7202
7203    /// Returns the `body` param
7204    #[must_use]
7205    pub fn body(&self) -> Option<Node<'pr>> {
7206        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
7207        if node.is_null() {
7208            None
7209        } else {
7210            Some(Node::new(self.parser, node))
7211        }
7212    }
7213
7214    /// Returns the `locals` param
7215    #[must_use]
7216    pub fn locals(&self) -> ConstantList<'pr> {
7217        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
7218        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
7219    }
7220
7221    /// Returns the `def_keyword_loc` param
7222    #[must_use]
7223    pub fn def_keyword_loc(&self) -> Location<'pr> {
7224        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).def_keyword_loc };
7225        Location::new(self.parser, unsafe { &(*pointer) })
7226    }
7227
7228    /// Returns the `operator_loc` param
7229    #[must_use]
7230    pub fn operator_loc(&self) -> Option<Location<'pr>> {
7231        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
7232        let length = unsafe { (*pointer).length };
7233        if length == 0 {
7234            None
7235        } else {
7236            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7237        }
7238    }
7239
7240    /// Returns the `lparen_loc` param
7241    #[must_use]
7242    pub fn lparen_loc(&self) -> Option<Location<'pr>> {
7243        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
7244        let length = unsafe { (*pointer).length };
7245        if length == 0 {
7246            None
7247        } else {
7248            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7249        }
7250    }
7251
7252    /// Returns the `rparen_loc` param
7253    #[must_use]
7254    pub fn rparen_loc(&self) -> Option<Location<'pr>> {
7255        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
7256        let length = unsafe { (*pointer).length };
7257        if length == 0 {
7258            None
7259        } else {
7260            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7261        }
7262    }
7263
7264    /// Returns the `equal_loc` param
7265    #[must_use]
7266    pub fn equal_loc(&self) -> Option<Location<'pr>> {
7267        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).equal_loc };
7268        let length = unsafe { (*pointer).length };
7269        if length == 0 {
7270            None
7271        } else {
7272            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7273        }
7274    }
7275
7276    /// Returns the `end_keyword_loc` param
7277    #[must_use]
7278    pub fn end_keyword_loc(&self) -> Option<Location<'pr>> {
7279        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
7280        let length = unsafe { (*pointer).length };
7281        if length == 0 {
7282            None
7283        } else {
7284            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7285        }
7286    }
7287}
7288
7289impl std::fmt::Debug for DefNode<'_> {
7290    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7291        write!(f, "DefNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.receiver(), self.parameters(), self.body(), self.locals(), self.def_keyword_loc(), self.operator_loc(), self.lparen_loc(), self.rparen_loc(), self.equal_loc(), self.end_keyword_loc())
7292    }
7293}
7294
7295/// Represents the use of the `defined?` keyword.
7296/// 
7297/// ```ruby
7298/// defined?(a)
7299/// ^^^^^^^^^^^
7300/// ```
7301pub struct DefinedNode<'pr> {
7302    /// The pointer to the parser this node came from.
7303    parser: *const pm_parser_t,
7304
7305    /// The raw pointer to the node allocated by prism.
7306    pointer: *mut pm_defined_node_t,
7307
7308    /// The marker to indicate the lifetime of the pointer.
7309    marker: PhantomData<&'pr mut pm_defined_node_t>
7310}
7311
7312impl<'pr> DefinedNode<'pr> {
7313    /// Converts this node to a generic node.
7314    #[must_use]
7315    pub const fn as_node(&self) -> Node<'pr> {
7316        Node::DefinedNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7317    }
7318
7319    /// Returns the location of this node.
7320    #[must_use]
7321    pub fn location(&self) -> Location<'pr> {
7322        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7323        Location::new(self.parser, unsafe { &(*pointer) })
7324    }
7325
7326    /// Returns the flags of this node.
7327    #[must_use]
7328    pub fn flags(&self) -> pm_node_flags_t {
7329        unsafe { (*self.pointer).base.flags }
7330    }
7331
7332    /// Returns the `lparen_loc` param
7333    #[must_use]
7334    pub fn lparen_loc(&self) -> Option<Location<'pr>> {
7335        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
7336        let length = unsafe { (*pointer).length };
7337        if length == 0 {
7338            None
7339        } else {
7340            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7341        }
7342    }
7343
7344    /// Returns the `value` param
7345    #[must_use]
7346    pub fn value(&self) -> Node<'pr> {
7347        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
7348        Node::new(self.parser, node)
7349    }
7350
7351    /// Returns the `rparen_loc` param
7352    #[must_use]
7353    pub fn rparen_loc(&self) -> Option<Location<'pr>> {
7354        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
7355        let length = unsafe { (*pointer).length };
7356        if length == 0 {
7357            None
7358        } else {
7359            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7360        }
7361    }
7362
7363    /// Returns the `keyword_loc` param
7364    #[must_use]
7365    pub fn keyword_loc(&self) -> Location<'pr> {
7366        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
7367        Location::new(self.parser, unsafe { &(*pointer) })
7368    }
7369}
7370
7371impl std::fmt::Debug for DefinedNode<'_> {
7372    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7373        write!(f, "DefinedNode({:?}, {:?}, {:?}, {:?})", self.lparen_loc(), self.value(), self.rparen_loc(), self.keyword_loc())
7374    }
7375}
7376
7377/// Represents an `else` clause in a `case`, `if`, or `unless` statement.
7378/// 
7379/// ```ruby
7380/// if a then b else c end
7381///             ^^^^^^^^^^
7382/// ```
7383pub struct ElseNode<'pr> {
7384    /// The pointer to the parser this node came from.
7385    parser: *const pm_parser_t,
7386
7387    /// The raw pointer to the node allocated by prism.
7388    pointer: *mut pm_else_node_t,
7389
7390    /// The marker to indicate the lifetime of the pointer.
7391    marker: PhantomData<&'pr mut pm_else_node_t>
7392}
7393
7394impl<'pr> ElseNode<'pr> {
7395    /// Converts this node to a generic node.
7396    #[must_use]
7397    pub const fn as_node(&self) -> Node<'pr> {
7398        Node::ElseNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7399    }
7400
7401    /// Returns the location of this node.
7402    #[must_use]
7403    pub fn location(&self) -> Location<'pr> {
7404        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7405        Location::new(self.parser, unsafe { &(*pointer) })
7406    }
7407
7408    /// Returns the flags of this node.
7409    #[must_use]
7410    pub fn flags(&self) -> pm_node_flags_t {
7411        unsafe { (*self.pointer).base.flags }
7412    }
7413
7414    /// Returns the `else_keyword_loc` param
7415    #[must_use]
7416    pub fn else_keyword_loc(&self) -> Location<'pr> {
7417        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).else_keyword_loc };
7418        Location::new(self.parser, unsafe { &(*pointer) })
7419    }
7420
7421    /// Returns the `statements` param
7422    #[must_use]
7423    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
7424        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
7425        if node.is_null() {
7426            None
7427        } else {
7428            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
7429        }
7430    }
7431
7432    /// Returns the `end_keyword_loc` param
7433    #[must_use]
7434    pub fn end_keyword_loc(&self) -> Option<Location<'pr>> {
7435        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
7436        let length = unsafe { (*pointer).length };
7437        if length == 0 {
7438            None
7439        } else {
7440            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7441        }
7442    }
7443}
7444
7445impl std::fmt::Debug for ElseNode<'_> {
7446    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7447        write!(f, "ElseNode({:?}, {:?}, {:?})", self.else_keyword_loc(), self.statements(), self.end_keyword_loc())
7448    }
7449}
7450
7451/// Represents an interpolated set of statements.
7452/// 
7453/// ```ruby
7454/// "foo #{bar}"
7455///      ^^^^^^
7456/// ```
7457pub struct EmbeddedStatementsNode<'pr> {
7458    /// The pointer to the parser this node came from.
7459    parser: *const pm_parser_t,
7460
7461    /// The raw pointer to the node allocated by prism.
7462    pointer: *mut pm_embedded_statements_node_t,
7463
7464    /// The marker to indicate the lifetime of the pointer.
7465    marker: PhantomData<&'pr mut pm_embedded_statements_node_t>
7466}
7467
7468impl<'pr> EmbeddedStatementsNode<'pr> {
7469    /// Converts this node to a generic node.
7470    #[must_use]
7471    pub const fn as_node(&self) -> Node<'pr> {
7472        Node::EmbeddedStatementsNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7473    }
7474
7475    /// Returns the location of this node.
7476    #[must_use]
7477    pub fn location(&self) -> Location<'pr> {
7478        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7479        Location::new(self.parser, unsafe { &(*pointer) })
7480    }
7481
7482    /// Returns the flags of this node.
7483    #[must_use]
7484    pub fn flags(&self) -> pm_node_flags_t {
7485        unsafe { (*self.pointer).base.flags }
7486    }
7487
7488    /// Returns the `opening_loc` param
7489    #[must_use]
7490    pub fn opening_loc(&self) -> Location<'pr> {
7491        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
7492        Location::new(self.parser, unsafe { &(*pointer) })
7493    }
7494
7495    /// Returns the `statements` param
7496    #[must_use]
7497    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
7498        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
7499        if node.is_null() {
7500            None
7501        } else {
7502            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
7503        }
7504    }
7505
7506    /// Returns the `closing_loc` param
7507    #[must_use]
7508    pub fn closing_loc(&self) -> Location<'pr> {
7509        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
7510        Location::new(self.parser, unsafe { &(*pointer) })
7511    }
7512}
7513
7514impl std::fmt::Debug for EmbeddedStatementsNode<'_> {
7515    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7516        write!(f, "EmbeddedStatementsNode({:?}, {:?}, {:?})", self.opening_loc(), self.statements(), self.closing_loc())
7517    }
7518}
7519
7520/// Represents an interpolated variable.
7521/// 
7522/// ```ruby
7523/// "foo #@bar"
7524///      ^^^^^
7525/// ```
7526pub struct EmbeddedVariableNode<'pr> {
7527    /// The pointer to the parser this node came from.
7528    parser: *const pm_parser_t,
7529
7530    /// The raw pointer to the node allocated by prism.
7531    pointer: *mut pm_embedded_variable_node_t,
7532
7533    /// The marker to indicate the lifetime of the pointer.
7534    marker: PhantomData<&'pr mut pm_embedded_variable_node_t>
7535}
7536
7537impl<'pr> EmbeddedVariableNode<'pr> {
7538    /// Converts this node to a generic node.
7539    #[must_use]
7540    pub const fn as_node(&self) -> Node<'pr> {
7541        Node::EmbeddedVariableNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7542    }
7543
7544    /// Returns the location of this node.
7545    #[must_use]
7546    pub fn location(&self) -> Location<'pr> {
7547        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7548        Location::new(self.parser, unsafe { &(*pointer) })
7549    }
7550
7551    /// Returns the flags of this node.
7552    #[must_use]
7553    pub fn flags(&self) -> pm_node_flags_t {
7554        unsafe { (*self.pointer).base.flags }
7555    }
7556
7557    /// Returns the `operator_loc` param
7558    #[must_use]
7559    pub fn operator_loc(&self) -> Location<'pr> {
7560        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
7561        Location::new(self.parser, unsafe { &(*pointer) })
7562    }
7563
7564    /// Returns the `variable` param
7565    #[must_use]
7566    pub fn variable(&self) -> Node<'pr> {
7567        let node: *mut pm_node_t = unsafe { (*self.pointer).variable };
7568        Node::new(self.parser, node)
7569    }
7570}
7571
7572impl std::fmt::Debug for EmbeddedVariableNode<'_> {
7573    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7574        write!(f, "EmbeddedVariableNode({:?}, {:?})", self.operator_loc(), self.variable())
7575    }
7576}
7577
7578/// Represents an `ensure` clause in a `begin` statement.
7579/// 
7580/// ```ruby
7581/// begin
7582///   foo
7583/// ensure
7584/// ^^^^^^
7585///   bar
7586/// end
7587/// ```
7588pub struct EnsureNode<'pr> {
7589    /// The pointer to the parser this node came from.
7590    parser: *const pm_parser_t,
7591
7592    /// The raw pointer to the node allocated by prism.
7593    pointer: *mut pm_ensure_node_t,
7594
7595    /// The marker to indicate the lifetime of the pointer.
7596    marker: PhantomData<&'pr mut pm_ensure_node_t>
7597}
7598
7599impl<'pr> EnsureNode<'pr> {
7600    /// Converts this node to a generic node.
7601    #[must_use]
7602    pub const fn as_node(&self) -> Node<'pr> {
7603        Node::EnsureNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7604    }
7605
7606    /// Returns the location of this node.
7607    #[must_use]
7608    pub fn location(&self) -> Location<'pr> {
7609        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7610        Location::new(self.parser, unsafe { &(*pointer) })
7611    }
7612
7613    /// Returns the flags of this node.
7614    #[must_use]
7615    pub fn flags(&self) -> pm_node_flags_t {
7616        unsafe { (*self.pointer).base.flags }
7617    }
7618
7619    /// Returns the `ensure_keyword_loc` param
7620    #[must_use]
7621    pub fn ensure_keyword_loc(&self) -> Location<'pr> {
7622        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).ensure_keyword_loc };
7623        Location::new(self.parser, unsafe { &(*pointer) })
7624    }
7625
7626    /// Returns the `statements` param
7627    #[must_use]
7628    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
7629        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
7630        if node.is_null() {
7631            None
7632        } else {
7633            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
7634        }
7635    }
7636
7637    /// Returns the `end_keyword_loc` param
7638    #[must_use]
7639    pub fn end_keyword_loc(&self) -> Location<'pr> {
7640        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
7641        Location::new(self.parser, unsafe { &(*pointer) })
7642    }
7643}
7644
7645impl std::fmt::Debug for EnsureNode<'_> {
7646    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7647        write!(f, "EnsureNode({:?}, {:?}, {:?})", self.ensure_keyword_loc(), self.statements(), self.end_keyword_loc())
7648    }
7649}
7650
7651/// Represents a node that is either missing or unexpected and results in a syntax error.
7652pub struct ErrorRecoveryNode<'pr> {
7653    /// The pointer to the parser this node came from.
7654    parser: *const pm_parser_t,
7655
7656    /// The raw pointer to the node allocated by prism.
7657    pointer: *mut pm_error_recovery_node_t,
7658
7659    /// The marker to indicate the lifetime of the pointer.
7660    marker: PhantomData<&'pr mut pm_error_recovery_node_t>
7661}
7662
7663impl<'pr> ErrorRecoveryNode<'pr> {
7664    /// Converts this node to a generic node.
7665    #[must_use]
7666    pub const fn as_node(&self) -> Node<'pr> {
7667        Node::ErrorRecoveryNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7668    }
7669
7670    /// Returns the location of this node.
7671    #[must_use]
7672    pub fn location(&self) -> Location<'pr> {
7673        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7674        Location::new(self.parser, unsafe { &(*pointer) })
7675    }
7676
7677    /// Returns the flags of this node.
7678    #[must_use]
7679    pub fn flags(&self) -> pm_node_flags_t {
7680        unsafe { (*self.pointer).base.flags }
7681    }
7682
7683    /// Returns the `unexpected` param
7684    #[must_use]
7685    pub fn unexpected(&self) -> Option<Node<'pr>> {
7686        let node: *mut pm_node_t = unsafe { (*self.pointer).unexpected };
7687        if node.is_null() {
7688            None
7689        } else {
7690            Some(Node::new(self.parser, node))
7691        }
7692    }
7693}
7694
7695impl std::fmt::Debug for ErrorRecoveryNode<'_> {
7696    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7697        write!(f, "ErrorRecoveryNode({:?})", self.unexpected())
7698    }
7699}
7700
7701/// Represents the use of the literal `false` keyword.
7702/// 
7703/// ```ruby
7704/// false
7705/// ^^^^^
7706/// ```
7707pub struct FalseNode<'pr> {
7708    /// The pointer to the parser this node came from.
7709    parser: *const pm_parser_t,
7710
7711    /// The raw pointer to the node allocated by prism.
7712    pointer: *mut pm_false_node_t,
7713
7714    /// The marker to indicate the lifetime of the pointer.
7715    marker: PhantomData<&'pr mut pm_false_node_t>
7716}
7717
7718impl<'pr> FalseNode<'pr> {
7719    /// Converts this node to a generic node.
7720    #[must_use]
7721    pub const fn as_node(&self) -> Node<'pr> {
7722        Node::FalseNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7723    }
7724
7725    /// Returns the location of this node.
7726    #[must_use]
7727    pub fn location(&self) -> Location<'pr> {
7728        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7729        Location::new(self.parser, unsafe { &(*pointer) })
7730    }
7731
7732    /// Returns the flags of this node.
7733    #[must_use]
7734    pub fn flags(&self) -> pm_node_flags_t {
7735        unsafe { (*self.pointer).base.flags }
7736    }
7737}
7738
7739impl std::fmt::Debug for FalseNode<'_> {
7740    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7741        write!(f, "FalseNode()")
7742    }
7743}
7744
7745/// Represents a find pattern in pattern matching.
7746/// 
7747/// ```ruby
7748/// foo in *bar, baz, *qux
7749///        ^^^^^^^^^^^^^^^
7750/// ```
7751/// 
7752/// ```ruby
7753/// foo in [*bar, baz, *qux]
7754///        ^^^^^^^^^^^^^^^^^
7755/// ```
7756/// 
7757/// ```ruby
7758/// foo in Foo(*bar, baz, *qux)
7759///        ^^^^^^^^^^^^^^^^^^^^
7760/// ```
7761/// 
7762/// ```ruby
7763/// foo => *bar, baz, *qux
7764///        ^^^^^^^^^^^^^^^
7765/// ```
7766pub struct FindPatternNode<'pr> {
7767    /// The pointer to the parser this node came from.
7768    parser: *const pm_parser_t,
7769
7770    /// The raw pointer to the node allocated by prism.
7771    pointer: *mut pm_find_pattern_node_t,
7772
7773    /// The marker to indicate the lifetime of the pointer.
7774    marker: PhantomData<&'pr mut pm_find_pattern_node_t>
7775}
7776
7777impl<'pr> FindPatternNode<'pr> {
7778    /// Converts this node to a generic node.
7779    #[must_use]
7780    pub const fn as_node(&self) -> Node<'pr> {
7781        Node::FindPatternNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7782    }
7783
7784    /// Returns the location of this node.
7785    #[must_use]
7786    pub fn location(&self) -> Location<'pr> {
7787        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7788        Location::new(self.parser, unsafe { &(*pointer) })
7789    }
7790
7791    /// Returns the flags of this node.
7792    #[must_use]
7793    pub fn flags(&self) -> pm_node_flags_t {
7794        unsafe { (*self.pointer).base.flags }
7795    }
7796
7797    /// Returns the `constant` param
7798    #[must_use]
7799    pub fn constant(&self) -> Option<Node<'pr>> {
7800        let node: *mut pm_node_t = unsafe { (*self.pointer).constant };
7801        if node.is_null() {
7802            None
7803        } else {
7804            Some(Node::new(self.parser, node))
7805        }
7806    }
7807
7808    /// Returns the `left` param
7809    #[must_use]
7810    pub fn left(&self) -> SplatNode<'pr> {
7811        let node: *mut pm_splat_node_t = unsafe { (*self.pointer).left };
7812        SplatNode { parser: self.parser, pointer: node, marker: PhantomData }
7813    }
7814
7815    /// Returns the `requireds` param
7816    #[must_use]
7817    pub fn requireds(&self) -> NodeList<'pr> {
7818        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).requireds };
7819        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
7820    }
7821
7822    /// Returns the `right` param
7823    #[must_use]
7824    pub fn right(&self) -> SplatNode<'pr> {
7825        let node: *mut pm_splat_node_t = unsafe { (*self.pointer).right };
7826        SplatNode { parser: self.parser, pointer: node, marker: PhantomData }
7827    }
7828
7829    /// Returns the `opening_loc` param
7830    #[must_use]
7831    pub fn opening_loc(&self) -> Option<Location<'pr>> {
7832        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
7833        let length = unsafe { (*pointer).length };
7834        if length == 0 {
7835            None
7836        } else {
7837            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7838        }
7839    }
7840
7841    /// Returns the `closing_loc` param
7842    #[must_use]
7843    pub fn closing_loc(&self) -> Option<Location<'pr>> {
7844        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
7845        let length = unsafe { (*pointer).length };
7846        if length == 0 {
7847            None
7848        } else {
7849            Some(Location::new(self.parser, unsafe { &(*pointer) }))
7850        }
7851    }
7852}
7853
7854impl std::fmt::Debug for FindPatternNode<'_> {
7855    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7856        write!(f, "FindPatternNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.constant(), self.left(), self.requireds(), self.right(), self.opening_loc(), self.closing_loc())
7857    }
7858}
7859
7860/// Represents the use of the `..` or `...` operators to create flip flops.
7861/// 
7862/// ```ruby
7863/// baz if foo .. bar
7864///        ^^^^^^^^^^
7865/// ```
7866pub struct FlipFlopNode<'pr> {
7867    /// The pointer to the parser this node came from.
7868    parser: *const pm_parser_t,
7869
7870    /// The raw pointer to the node allocated by prism.
7871    pointer: *mut pm_flip_flop_node_t,
7872
7873    /// The marker to indicate the lifetime of the pointer.
7874    marker: PhantomData<&'pr mut pm_flip_flop_node_t>
7875}
7876
7877impl<'pr> FlipFlopNode<'pr> {
7878    /// Converts this node to a generic node.
7879    #[must_use]
7880    pub const fn as_node(&self) -> Node<'pr> {
7881        Node::FlipFlopNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7882    }
7883
7884    /// Returns the location of this node.
7885    #[must_use]
7886    pub fn location(&self) -> Location<'pr> {
7887        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7888        Location::new(self.parser, unsafe { &(*pointer) })
7889    }
7890
7891    /// Returns the flags of this node.
7892    #[must_use]
7893    pub fn flags(&self) -> pm_node_flags_t {
7894        unsafe { (*self.pointer).base.flags }
7895    }
7896
7897    /// ... operator
7898    #[must_use]
7899    pub fn is_exclude_end(&self) -> bool {
7900        (self.flags() & PM_RANGE_FLAGS_EXCLUDE_END) != 0
7901    }
7902
7903    /// Returns the `left` param
7904    #[must_use]
7905    pub fn left(&self) -> Option<Node<'pr>> {
7906        let node: *mut pm_node_t = unsafe { (*self.pointer).left };
7907        if node.is_null() {
7908            None
7909        } else {
7910            Some(Node::new(self.parser, node))
7911        }
7912    }
7913
7914    /// Returns the `right` param
7915    #[must_use]
7916    pub fn right(&self) -> Option<Node<'pr>> {
7917        let node: *mut pm_node_t = unsafe { (*self.pointer).right };
7918        if node.is_null() {
7919            None
7920        } else {
7921            Some(Node::new(self.parser, node))
7922        }
7923    }
7924
7925    /// Returns the `operator_loc` param
7926    #[must_use]
7927    pub fn operator_loc(&self) -> Location<'pr> {
7928        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
7929        Location::new(self.parser, unsafe { &(*pointer) })
7930    }
7931}
7932
7933impl std::fmt::Debug for FlipFlopNode<'_> {
7934    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7935        write!(f, "FlipFlopNode({:?}, {:?}, {:?})", self.left(), self.right(), self.operator_loc())
7936    }
7937}
7938
7939/// Represents a floating point number literal.
7940/// 
7941/// ```ruby
7942/// 1.0
7943/// ^^^
7944/// ```
7945pub struct FloatNode<'pr> {
7946    /// The pointer to the parser this node came from.
7947    parser: *const pm_parser_t,
7948
7949    /// The raw pointer to the node allocated by prism.
7950    pointer: *mut pm_float_node_t,
7951
7952    /// The marker to indicate the lifetime of the pointer.
7953    marker: PhantomData<&'pr mut pm_float_node_t>
7954}
7955
7956impl<'pr> FloatNode<'pr> {
7957    /// Converts this node to a generic node.
7958    #[must_use]
7959    pub const fn as_node(&self) -> Node<'pr> {
7960        Node::FloatNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
7961    }
7962
7963    /// Returns the location of this node.
7964    #[must_use]
7965    pub fn location(&self) -> Location<'pr> {
7966        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
7967        Location::new(self.parser, unsafe { &(*pointer) })
7968    }
7969
7970    /// Returns the flags of this node.
7971    #[must_use]
7972    pub fn flags(&self) -> pm_node_flags_t {
7973        unsafe { (*self.pointer).base.flags }
7974    }
7975
7976    /// Returns the `value` param
7977    #[must_use]
7978    pub fn value(&self) -> f64 {
7979        unsafe { (*self.pointer).value }
7980    }
7981}
7982
7983impl std::fmt::Debug for FloatNode<'_> {
7984    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7985        write!(f, "FloatNode({:?})", self.value())
7986    }
7987}
7988
7989/// Represents the use of the `for` keyword.
7990/// 
7991/// ```ruby
7992/// for i in a end
7993/// ^^^^^^^^^^^^^^
7994/// ```
7995pub struct ForNode<'pr> {
7996    /// The pointer to the parser this node came from.
7997    parser: *const pm_parser_t,
7998
7999    /// The raw pointer to the node allocated by prism.
8000    pointer: *mut pm_for_node_t,
8001
8002    /// The marker to indicate the lifetime of the pointer.
8003    marker: PhantomData<&'pr mut pm_for_node_t>
8004}
8005
8006impl<'pr> ForNode<'pr> {
8007    /// Converts this node to a generic node.
8008    #[must_use]
8009    pub const fn as_node(&self) -> Node<'pr> {
8010        Node::ForNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8011    }
8012
8013    /// Returns the location of this node.
8014    #[must_use]
8015    pub fn location(&self) -> Location<'pr> {
8016        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8017        Location::new(self.parser, unsafe { &(*pointer) })
8018    }
8019
8020    /// Returns the flags of this node.
8021    #[must_use]
8022    pub fn flags(&self) -> pm_node_flags_t {
8023        unsafe { (*self.pointer).base.flags }
8024    }
8025
8026    /// Returns the `index` param
8027    #[must_use]
8028    pub fn index(&self) -> Node<'pr> {
8029        let node: *mut pm_node_t = unsafe { (*self.pointer).index };
8030        Node::new(self.parser, node)
8031    }
8032
8033    /// Returns the `collection` param
8034    #[must_use]
8035    pub fn collection(&self) -> Node<'pr> {
8036        let node: *mut pm_node_t = unsafe { (*self.pointer).collection };
8037        Node::new(self.parser, node)
8038    }
8039
8040    /// Returns the `statements` param
8041    #[must_use]
8042    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
8043        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
8044        if node.is_null() {
8045            None
8046        } else {
8047            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
8048        }
8049    }
8050
8051    /// Returns the `for_keyword_loc` param
8052    #[must_use]
8053    pub fn for_keyword_loc(&self) -> Location<'pr> {
8054        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).for_keyword_loc };
8055        Location::new(self.parser, unsafe { &(*pointer) })
8056    }
8057
8058    /// Returns the `in_keyword_loc` param
8059    #[must_use]
8060    pub fn in_keyword_loc(&self) -> Location<'pr> {
8061        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).in_keyword_loc };
8062        Location::new(self.parser, unsafe { &(*pointer) })
8063    }
8064
8065    /// Returns the `do_keyword_loc` param
8066    #[must_use]
8067    pub fn do_keyword_loc(&self) -> Option<Location<'pr>> {
8068        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).do_keyword_loc };
8069        let length = unsafe { (*pointer).length };
8070        if length == 0 {
8071            None
8072        } else {
8073            Some(Location::new(self.parser, unsafe { &(*pointer) }))
8074        }
8075    }
8076
8077    /// Returns the `end_keyword_loc` param
8078    #[must_use]
8079    pub fn end_keyword_loc(&self) -> Location<'pr> {
8080        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
8081        Location::new(self.parser, unsafe { &(*pointer) })
8082    }
8083}
8084
8085impl std::fmt::Debug for ForNode<'_> {
8086    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8087        write!(f, "ForNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.index(), self.collection(), self.statements(), self.for_keyword_loc(), self.in_keyword_loc(), self.do_keyword_loc(), self.end_keyword_loc())
8088    }
8089}
8090
8091/// Represents forwarding all arguments to this method to another method.
8092/// 
8093/// ```ruby
8094/// def foo(...)
8095///   bar(...)
8096///       ^^^
8097/// end
8098/// ```
8099pub struct ForwardingArgumentsNode<'pr> {
8100    /// The pointer to the parser this node came from.
8101    parser: *const pm_parser_t,
8102
8103    /// The raw pointer to the node allocated by prism.
8104    pointer: *mut pm_forwarding_arguments_node_t,
8105
8106    /// The marker to indicate the lifetime of the pointer.
8107    marker: PhantomData<&'pr mut pm_forwarding_arguments_node_t>
8108}
8109
8110impl<'pr> ForwardingArgumentsNode<'pr> {
8111    /// Converts this node to a generic node.
8112    #[must_use]
8113    pub const fn as_node(&self) -> Node<'pr> {
8114        Node::ForwardingArgumentsNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8115    }
8116
8117    /// Returns the location of this node.
8118    #[must_use]
8119    pub fn location(&self) -> Location<'pr> {
8120        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8121        Location::new(self.parser, unsafe { &(*pointer) })
8122    }
8123
8124    /// Returns the flags of this node.
8125    #[must_use]
8126    pub fn flags(&self) -> pm_node_flags_t {
8127        unsafe { (*self.pointer).base.flags }
8128    }
8129}
8130
8131impl std::fmt::Debug for ForwardingArgumentsNode<'_> {
8132    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8133        write!(f, "ForwardingArgumentsNode()")
8134    }
8135}
8136
8137/// Represents the use of the forwarding parameter in a method, block, or lambda declaration.
8138/// 
8139/// ```ruby
8140/// def foo(...)
8141///         ^^^
8142/// end
8143/// ```
8144pub struct ForwardingParameterNode<'pr> {
8145    /// The pointer to the parser this node came from.
8146    parser: *const pm_parser_t,
8147
8148    /// The raw pointer to the node allocated by prism.
8149    pointer: *mut pm_forwarding_parameter_node_t,
8150
8151    /// The marker to indicate the lifetime of the pointer.
8152    marker: PhantomData<&'pr mut pm_forwarding_parameter_node_t>
8153}
8154
8155impl<'pr> ForwardingParameterNode<'pr> {
8156    /// Converts this node to a generic node.
8157    #[must_use]
8158    pub const fn as_node(&self) -> Node<'pr> {
8159        Node::ForwardingParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8160    }
8161
8162    /// Returns the location of this node.
8163    #[must_use]
8164    pub fn location(&self) -> Location<'pr> {
8165        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8166        Location::new(self.parser, unsafe { &(*pointer) })
8167    }
8168
8169    /// Returns the flags of this node.
8170    #[must_use]
8171    pub fn flags(&self) -> pm_node_flags_t {
8172        unsafe { (*self.pointer).base.flags }
8173    }
8174}
8175
8176impl std::fmt::Debug for ForwardingParameterNode<'_> {
8177    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8178        write!(f, "ForwardingParameterNode()")
8179    }
8180}
8181
8182/// Represents the use of the `super` keyword without parentheses or arguments, but which might have a block.
8183/// 
8184/// ```ruby
8185/// super
8186/// ^^^^^
8187/// ```
8188/// 
8189/// ```ruby
8190/// super { 123 }
8191/// ^^^^^^^^^^^^^
8192/// ```
8193/// 
8194/// If it has any other arguments, it would be a `SuperNode` instead.
8195pub struct ForwardingSuperNode<'pr> {
8196    /// The pointer to the parser this node came from.
8197    parser: *const pm_parser_t,
8198
8199    /// The raw pointer to the node allocated by prism.
8200    pointer: *mut pm_forwarding_super_node_t,
8201
8202    /// The marker to indicate the lifetime of the pointer.
8203    marker: PhantomData<&'pr mut pm_forwarding_super_node_t>
8204}
8205
8206impl<'pr> ForwardingSuperNode<'pr> {
8207    /// Converts this node to a generic node.
8208    #[must_use]
8209    pub const fn as_node(&self) -> Node<'pr> {
8210        Node::ForwardingSuperNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8211    }
8212
8213    /// Returns the location of this node.
8214    #[must_use]
8215    pub fn location(&self) -> Location<'pr> {
8216        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8217        Location::new(self.parser, unsafe { &(*pointer) })
8218    }
8219
8220    /// Returns the flags of this node.
8221    #[must_use]
8222    pub fn flags(&self) -> pm_node_flags_t {
8223        unsafe { (*self.pointer).base.flags }
8224    }
8225
8226    /// Returns the `keyword_loc` param
8227    #[must_use]
8228    pub fn keyword_loc(&self) -> Location<'pr> {
8229        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
8230        Location::new(self.parser, unsafe { &(*pointer) })
8231    }
8232
8233    /// Returns the `block` param
8234    #[must_use]
8235    pub fn block(&self) -> Option<BlockNode<'pr>> {
8236        let node: *mut pm_block_node_t = unsafe { (*self.pointer).block };
8237        if node.is_null() {
8238            None
8239        } else {
8240            Some(BlockNode { parser: self.parser, pointer: node, marker: PhantomData })
8241        }
8242    }
8243}
8244
8245impl std::fmt::Debug for ForwardingSuperNode<'_> {
8246    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8247        write!(f, "ForwardingSuperNode({:?}, {:?})", self.keyword_loc(), self.block())
8248    }
8249}
8250
8251/// Represents the use of the `&&=` operator for assignment to a global variable.
8252/// 
8253/// ```ruby
8254/// $target &&= value
8255/// ^^^^^^^^^^^^^^^^^
8256/// ```
8257pub struct GlobalVariableAndWriteNode<'pr> {
8258    /// The pointer to the parser this node came from.
8259    parser: *const pm_parser_t,
8260
8261    /// The raw pointer to the node allocated by prism.
8262    pointer: *mut pm_global_variable_and_write_node_t,
8263
8264    /// The marker to indicate the lifetime of the pointer.
8265    marker: PhantomData<&'pr mut pm_global_variable_and_write_node_t>
8266}
8267
8268impl<'pr> GlobalVariableAndWriteNode<'pr> {
8269    /// Converts this node to a generic node.
8270    #[must_use]
8271    pub const fn as_node(&self) -> Node<'pr> {
8272        Node::GlobalVariableAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8273    }
8274
8275    /// Returns the location of this node.
8276    #[must_use]
8277    pub fn location(&self) -> Location<'pr> {
8278        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8279        Location::new(self.parser, unsafe { &(*pointer) })
8280    }
8281
8282    /// Returns the flags of this node.
8283    #[must_use]
8284    pub fn flags(&self) -> pm_node_flags_t {
8285        unsafe { (*self.pointer).base.flags }
8286    }
8287
8288    /// Returns the `name` param
8289    #[must_use]
8290    pub fn name(&self) -> ConstantId<'pr> {
8291        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
8292    }
8293
8294    /// Returns the `name_loc` param
8295    #[must_use]
8296    pub fn name_loc(&self) -> Location<'pr> {
8297        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
8298        Location::new(self.parser, unsafe { &(*pointer) })
8299    }
8300
8301    /// Returns the `operator_loc` param
8302    #[must_use]
8303    pub fn operator_loc(&self) -> Location<'pr> {
8304        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
8305        Location::new(self.parser, unsafe { &(*pointer) })
8306    }
8307
8308    /// Returns the `value` param
8309    #[must_use]
8310    pub fn value(&self) -> Node<'pr> {
8311        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
8312        Node::new(self.parser, node)
8313    }
8314}
8315
8316impl std::fmt::Debug for GlobalVariableAndWriteNode<'_> {
8317    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8318        write!(f, "GlobalVariableAndWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
8319    }
8320}
8321
8322/// Represents assigning to a global variable using an operator that isn't `=`.
8323/// 
8324/// ```ruby
8325/// $target += value
8326/// ^^^^^^^^^^^^^^^^
8327/// ```
8328pub struct GlobalVariableOperatorWriteNode<'pr> {
8329    /// The pointer to the parser this node came from.
8330    parser: *const pm_parser_t,
8331
8332    /// The raw pointer to the node allocated by prism.
8333    pointer: *mut pm_global_variable_operator_write_node_t,
8334
8335    /// The marker to indicate the lifetime of the pointer.
8336    marker: PhantomData<&'pr mut pm_global_variable_operator_write_node_t>
8337}
8338
8339impl<'pr> GlobalVariableOperatorWriteNode<'pr> {
8340    /// Converts this node to a generic node.
8341    #[must_use]
8342    pub const fn as_node(&self) -> Node<'pr> {
8343        Node::GlobalVariableOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8344    }
8345
8346    /// Returns the location of this node.
8347    #[must_use]
8348    pub fn location(&self) -> Location<'pr> {
8349        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8350        Location::new(self.parser, unsafe { &(*pointer) })
8351    }
8352
8353    /// Returns the flags of this node.
8354    #[must_use]
8355    pub fn flags(&self) -> pm_node_flags_t {
8356        unsafe { (*self.pointer).base.flags }
8357    }
8358
8359    /// Returns the `name` param
8360    #[must_use]
8361    pub fn name(&self) -> ConstantId<'pr> {
8362        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
8363    }
8364
8365    /// Returns the `name_loc` param
8366    #[must_use]
8367    pub fn name_loc(&self) -> Location<'pr> {
8368        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
8369        Location::new(self.parser, unsafe { &(*pointer) })
8370    }
8371
8372    /// Returns the `binary_operator_loc` param
8373    #[must_use]
8374    pub fn binary_operator_loc(&self) -> Location<'pr> {
8375        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
8376        Location::new(self.parser, unsafe { &(*pointer) })
8377    }
8378
8379    /// Returns the `value` param
8380    #[must_use]
8381    pub fn value(&self) -> Node<'pr> {
8382        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
8383        Node::new(self.parser, node)
8384    }
8385
8386    /// Returns the `binary_operator` param
8387    #[must_use]
8388    pub fn binary_operator(&self) -> ConstantId<'pr> {
8389        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
8390    }
8391}
8392
8393impl std::fmt::Debug for GlobalVariableOperatorWriteNode<'_> {
8394    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8395        write!(f, "GlobalVariableOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.binary_operator_loc(), self.value(), self.binary_operator())
8396    }
8397}
8398
8399/// Represents the use of the `||=` operator for assignment to a global variable.
8400/// 
8401/// ```ruby
8402/// $target ||= value
8403/// ^^^^^^^^^^^^^^^^^
8404/// ```
8405pub struct GlobalVariableOrWriteNode<'pr> {
8406    /// The pointer to the parser this node came from.
8407    parser: *const pm_parser_t,
8408
8409    /// The raw pointer to the node allocated by prism.
8410    pointer: *mut pm_global_variable_or_write_node_t,
8411
8412    /// The marker to indicate the lifetime of the pointer.
8413    marker: PhantomData<&'pr mut pm_global_variable_or_write_node_t>
8414}
8415
8416impl<'pr> GlobalVariableOrWriteNode<'pr> {
8417    /// Converts this node to a generic node.
8418    #[must_use]
8419    pub const fn as_node(&self) -> Node<'pr> {
8420        Node::GlobalVariableOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8421    }
8422
8423    /// Returns the location of this node.
8424    #[must_use]
8425    pub fn location(&self) -> Location<'pr> {
8426        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8427        Location::new(self.parser, unsafe { &(*pointer) })
8428    }
8429
8430    /// Returns the flags of this node.
8431    #[must_use]
8432    pub fn flags(&self) -> pm_node_flags_t {
8433        unsafe { (*self.pointer).base.flags }
8434    }
8435
8436    /// Returns the `name` param
8437    #[must_use]
8438    pub fn name(&self) -> ConstantId<'pr> {
8439        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
8440    }
8441
8442    /// Returns the `name_loc` param
8443    #[must_use]
8444    pub fn name_loc(&self) -> Location<'pr> {
8445        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
8446        Location::new(self.parser, unsafe { &(*pointer) })
8447    }
8448
8449    /// Returns the `operator_loc` param
8450    #[must_use]
8451    pub fn operator_loc(&self) -> Location<'pr> {
8452        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
8453        Location::new(self.parser, unsafe { &(*pointer) })
8454    }
8455
8456    /// Returns the `value` param
8457    #[must_use]
8458    pub fn value(&self) -> Node<'pr> {
8459        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
8460        Node::new(self.parser, node)
8461    }
8462}
8463
8464impl std::fmt::Debug for GlobalVariableOrWriteNode<'_> {
8465    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8466        write!(f, "GlobalVariableOrWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
8467    }
8468}
8469
8470/// Represents referencing a global variable.
8471/// 
8472/// ```ruby
8473/// $foo
8474/// ^^^^
8475/// ```
8476pub struct GlobalVariableReadNode<'pr> {
8477    /// The pointer to the parser this node came from.
8478    parser: *const pm_parser_t,
8479
8480    /// The raw pointer to the node allocated by prism.
8481    pointer: *mut pm_global_variable_read_node_t,
8482
8483    /// The marker to indicate the lifetime of the pointer.
8484    marker: PhantomData<&'pr mut pm_global_variable_read_node_t>
8485}
8486
8487impl<'pr> GlobalVariableReadNode<'pr> {
8488    /// Converts this node to a generic node.
8489    #[must_use]
8490    pub const fn as_node(&self) -> Node<'pr> {
8491        Node::GlobalVariableReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8492    }
8493
8494    /// Returns the location of this node.
8495    #[must_use]
8496    pub fn location(&self) -> Location<'pr> {
8497        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8498        Location::new(self.parser, unsafe { &(*pointer) })
8499    }
8500
8501    /// Returns the flags of this node.
8502    #[must_use]
8503    pub fn flags(&self) -> pm_node_flags_t {
8504        unsafe { (*self.pointer).base.flags }
8505    }
8506
8507    /// Returns the `name` param
8508    #[must_use]
8509    pub fn name(&self) -> ConstantId<'pr> {
8510        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
8511    }
8512}
8513
8514impl std::fmt::Debug for GlobalVariableReadNode<'_> {
8515    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8516        write!(f, "GlobalVariableReadNode({:?})", self.name())
8517    }
8518}
8519
8520/// Represents writing to a global variable in a context that doesn't have an explicit value.
8521/// 
8522/// ```ruby
8523/// $foo, $bar = baz
8524/// ^^^^  ^^^^
8525/// ```
8526pub struct GlobalVariableTargetNode<'pr> {
8527    /// The pointer to the parser this node came from.
8528    parser: *const pm_parser_t,
8529
8530    /// The raw pointer to the node allocated by prism.
8531    pointer: *mut pm_global_variable_target_node_t,
8532
8533    /// The marker to indicate the lifetime of the pointer.
8534    marker: PhantomData<&'pr mut pm_global_variable_target_node_t>
8535}
8536
8537impl<'pr> GlobalVariableTargetNode<'pr> {
8538    /// Converts this node to a generic node.
8539    #[must_use]
8540    pub const fn as_node(&self) -> Node<'pr> {
8541        Node::GlobalVariableTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8542    }
8543
8544    /// Returns the location of this node.
8545    #[must_use]
8546    pub fn location(&self) -> Location<'pr> {
8547        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8548        Location::new(self.parser, unsafe { &(*pointer) })
8549    }
8550
8551    /// Returns the flags of this node.
8552    #[must_use]
8553    pub fn flags(&self) -> pm_node_flags_t {
8554        unsafe { (*self.pointer).base.flags }
8555    }
8556
8557    /// Returns the `name` param
8558    #[must_use]
8559    pub fn name(&self) -> ConstantId<'pr> {
8560        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
8561    }
8562}
8563
8564impl std::fmt::Debug for GlobalVariableTargetNode<'_> {
8565    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8566        write!(f, "GlobalVariableTargetNode({:?})", self.name())
8567    }
8568}
8569
8570/// Represents writing to a global variable.
8571/// 
8572/// ```ruby
8573/// $foo = 1
8574/// ^^^^^^^^
8575/// ```
8576pub struct GlobalVariableWriteNode<'pr> {
8577    /// The pointer to the parser this node came from.
8578    parser: *const pm_parser_t,
8579
8580    /// The raw pointer to the node allocated by prism.
8581    pointer: *mut pm_global_variable_write_node_t,
8582
8583    /// The marker to indicate the lifetime of the pointer.
8584    marker: PhantomData<&'pr mut pm_global_variable_write_node_t>
8585}
8586
8587impl<'pr> GlobalVariableWriteNode<'pr> {
8588    /// Converts this node to a generic node.
8589    #[must_use]
8590    pub const fn as_node(&self) -> Node<'pr> {
8591        Node::GlobalVariableWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8592    }
8593
8594    /// Returns the location of this node.
8595    #[must_use]
8596    pub fn location(&self) -> Location<'pr> {
8597        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8598        Location::new(self.parser, unsafe { &(*pointer) })
8599    }
8600
8601    /// Returns the flags of this node.
8602    #[must_use]
8603    pub fn flags(&self) -> pm_node_flags_t {
8604        unsafe { (*self.pointer).base.flags }
8605    }
8606
8607    /// Returns the `name` param
8608    #[must_use]
8609    pub fn name(&self) -> ConstantId<'pr> {
8610        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
8611    }
8612
8613    /// Returns the `name_loc` param
8614    #[must_use]
8615    pub fn name_loc(&self) -> Location<'pr> {
8616        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
8617        Location::new(self.parser, unsafe { &(*pointer) })
8618    }
8619
8620    /// Returns the `value` param
8621    #[must_use]
8622    pub fn value(&self) -> Node<'pr> {
8623        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
8624        Node::new(self.parser, node)
8625    }
8626
8627    /// Returns the `operator_loc` param
8628    #[must_use]
8629    pub fn operator_loc(&self) -> Location<'pr> {
8630        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
8631        Location::new(self.parser, unsafe { &(*pointer) })
8632    }
8633}
8634
8635impl std::fmt::Debug for GlobalVariableWriteNode<'_> {
8636    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8637        write!(f, "GlobalVariableWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.value(), self.operator_loc())
8638    }
8639}
8640
8641/// Represents a hash literal.
8642/// 
8643/// ```ruby
8644/// { a => b }
8645/// ^^^^^^^^^^
8646/// ```
8647pub struct HashNode<'pr> {
8648    /// The pointer to the parser this node came from.
8649    parser: *const pm_parser_t,
8650
8651    /// The raw pointer to the node allocated by prism.
8652    pointer: *mut pm_hash_node_t,
8653
8654    /// The marker to indicate the lifetime of the pointer.
8655    marker: PhantomData<&'pr mut pm_hash_node_t>
8656}
8657
8658impl<'pr> HashNode<'pr> {
8659    /// Converts this node to a generic node.
8660    #[must_use]
8661    pub const fn as_node(&self) -> Node<'pr> {
8662        Node::HashNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8663    }
8664
8665    /// Returns the location of this node.
8666    #[must_use]
8667    pub fn location(&self) -> Location<'pr> {
8668        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8669        Location::new(self.parser, unsafe { &(*pointer) })
8670    }
8671
8672    /// Returns the flags of this node.
8673    #[must_use]
8674    pub fn flags(&self) -> pm_node_flags_t {
8675        unsafe { (*self.pointer).base.flags }
8676    }
8677
8678    /// Returns the `opening_loc` param
8679    #[must_use]
8680    pub fn opening_loc(&self) -> Location<'pr> {
8681        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
8682        Location::new(self.parser, unsafe { &(*pointer) })
8683    }
8684
8685    /// Returns the `elements` param
8686    #[must_use]
8687    pub fn elements(&self) -> NodeList<'pr> {
8688        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).elements };
8689        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
8690    }
8691
8692    /// Returns the `closing_loc` param
8693    #[must_use]
8694    pub fn closing_loc(&self) -> Location<'pr> {
8695        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
8696        Location::new(self.parser, unsafe { &(*pointer) })
8697    }
8698}
8699
8700impl std::fmt::Debug for HashNode<'_> {
8701    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8702        write!(f, "HashNode({:?}, {:?}, {:?})", self.opening_loc(), self.elements(), self.closing_loc())
8703    }
8704}
8705
8706/// Represents a hash pattern in pattern matching.
8707/// 
8708/// ```ruby
8709/// foo => { a: 1, b: 2 }
8710///        ^^^^^^^^^^^^^^
8711/// ```
8712/// 
8713/// ```ruby
8714/// foo => { a: 1, b: 2, **c }
8715///        ^^^^^^^^^^^^^^^^^^^
8716/// ```
8717/// 
8718/// ```ruby
8719/// foo => Bar[a: 1, b: 2]
8720///        ^^^^^^^^^^^^^^^
8721/// ```
8722/// 
8723/// ```ruby
8724/// foo in { a: 1, b: 2 }
8725///        ^^^^^^^^^^^^^^
8726/// ```
8727pub struct HashPatternNode<'pr> {
8728    /// The pointer to the parser this node came from.
8729    parser: *const pm_parser_t,
8730
8731    /// The raw pointer to the node allocated by prism.
8732    pointer: *mut pm_hash_pattern_node_t,
8733
8734    /// The marker to indicate the lifetime of the pointer.
8735    marker: PhantomData<&'pr mut pm_hash_pattern_node_t>
8736}
8737
8738impl<'pr> HashPatternNode<'pr> {
8739    /// Converts this node to a generic node.
8740    #[must_use]
8741    pub const fn as_node(&self) -> Node<'pr> {
8742        Node::HashPatternNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8743    }
8744
8745    /// Returns the location of this node.
8746    #[must_use]
8747    pub fn location(&self) -> Location<'pr> {
8748        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8749        Location::new(self.parser, unsafe { &(*pointer) })
8750    }
8751
8752    /// Returns the flags of this node.
8753    #[must_use]
8754    pub fn flags(&self) -> pm_node_flags_t {
8755        unsafe { (*self.pointer).base.flags }
8756    }
8757
8758    /// Returns the `constant` param
8759    #[must_use]
8760    pub fn constant(&self) -> Option<Node<'pr>> {
8761        let node: *mut pm_node_t = unsafe { (*self.pointer).constant };
8762        if node.is_null() {
8763            None
8764        } else {
8765            Some(Node::new(self.parser, node))
8766        }
8767    }
8768
8769    /// Returns the `elements` param
8770    #[must_use]
8771    pub fn elements(&self) -> NodeList<'pr> {
8772        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).elements };
8773        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
8774    }
8775
8776    /// Returns the `rest` param
8777    #[must_use]
8778    pub fn rest(&self) -> Option<Node<'pr>> {
8779        let node: *mut pm_node_t = unsafe { (*self.pointer).rest };
8780        if node.is_null() {
8781            None
8782        } else {
8783            Some(Node::new(self.parser, node))
8784        }
8785    }
8786
8787    /// Returns the `opening_loc` param
8788    #[must_use]
8789    pub fn opening_loc(&self) -> Option<Location<'pr>> {
8790        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
8791        let length = unsafe { (*pointer).length };
8792        if length == 0 {
8793            None
8794        } else {
8795            Some(Location::new(self.parser, unsafe { &(*pointer) }))
8796        }
8797    }
8798
8799    /// Returns the `closing_loc` param
8800    #[must_use]
8801    pub fn closing_loc(&self) -> Option<Location<'pr>> {
8802        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
8803        let length = unsafe { (*pointer).length };
8804        if length == 0 {
8805            None
8806        } else {
8807            Some(Location::new(self.parser, unsafe { &(*pointer) }))
8808        }
8809    }
8810}
8811
8812impl std::fmt::Debug for HashPatternNode<'_> {
8813    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8814        write!(f, "HashPatternNode({:?}, {:?}, {:?}, {:?}, {:?})", self.constant(), self.elements(), self.rest(), self.opening_loc(), self.closing_loc())
8815    }
8816}
8817
8818/// Represents the use of the `if` keyword, either in the block form or the modifier form, or a ternary expression.
8819/// 
8820/// ```ruby
8821/// bar if foo
8822/// ^^^^^^^^^^
8823/// ```
8824/// 
8825/// ```ruby
8826/// if foo then bar end
8827/// ^^^^^^^^^^^^^^^^^^^
8828/// ```
8829/// 
8830/// ```ruby
8831/// foo ? bar : baz
8832/// ^^^^^^^^^^^^^^^
8833/// ```
8834pub struct IfNode<'pr> {
8835    /// The pointer to the parser this node came from.
8836    parser: *const pm_parser_t,
8837
8838    /// The raw pointer to the node allocated by prism.
8839    pointer: *mut pm_if_node_t,
8840
8841    /// The marker to indicate the lifetime of the pointer.
8842    marker: PhantomData<&'pr mut pm_if_node_t>
8843}
8844
8845impl<'pr> IfNode<'pr> {
8846    /// Converts this node to a generic node.
8847    #[must_use]
8848    pub const fn as_node(&self) -> Node<'pr> {
8849        Node::IfNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8850    }
8851
8852    /// Returns the location of this node.
8853    #[must_use]
8854    pub fn location(&self) -> Location<'pr> {
8855        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8856        Location::new(self.parser, unsafe { &(*pointer) })
8857    }
8858
8859    /// Returns the flags of this node.
8860    #[must_use]
8861    pub fn flags(&self) -> pm_node_flags_t {
8862        unsafe { (*self.pointer).base.flags }
8863    }
8864
8865    /// Returns the `if_keyword_loc` param
8866    #[must_use]
8867    pub fn if_keyword_loc(&self) -> Option<Location<'pr>> {
8868        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).if_keyword_loc };
8869        let length = unsafe { (*pointer).length };
8870        if length == 0 {
8871            None
8872        } else {
8873            Some(Location::new(self.parser, unsafe { &(*pointer) }))
8874        }
8875    }
8876
8877    /// Returns the `predicate` param
8878    #[must_use]
8879    pub fn predicate(&self) -> Node<'pr> {
8880        let node: *mut pm_node_t = unsafe { (*self.pointer).predicate };
8881        Node::new(self.parser, node)
8882    }
8883
8884    /// Returns the `then_keyword_loc` param
8885    #[must_use]
8886    pub fn then_keyword_loc(&self) -> Option<Location<'pr>> {
8887        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).then_keyword_loc };
8888        let length = unsafe { (*pointer).length };
8889        if length == 0 {
8890            None
8891        } else {
8892            Some(Location::new(self.parser, unsafe { &(*pointer) }))
8893        }
8894    }
8895
8896    /// Returns the `statements` param
8897    #[must_use]
8898    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
8899        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
8900        if node.is_null() {
8901            None
8902        } else {
8903            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
8904        }
8905    }
8906
8907    /// Returns the `subsequent` param
8908    #[must_use]
8909    pub fn subsequent(&self) -> Option<Node<'pr>> {
8910        let node: *mut pm_node_t = unsafe { (*self.pointer).subsequent };
8911        if node.is_null() {
8912            None
8913        } else {
8914            Some(Node::new(self.parser, node))
8915        }
8916    }
8917
8918    /// Returns the `end_keyword_loc` param
8919    #[must_use]
8920    pub fn end_keyword_loc(&self) -> Option<Location<'pr>> {
8921        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
8922        let length = unsafe { (*pointer).length };
8923        if length == 0 {
8924            None
8925        } else {
8926            Some(Location::new(self.parser, unsafe { &(*pointer) }))
8927        }
8928    }
8929}
8930
8931impl std::fmt::Debug for IfNode<'_> {
8932    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8933        write!(f, "IfNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.if_keyword_loc(), self.predicate(), self.then_keyword_loc(), self.statements(), self.subsequent(), self.end_keyword_loc())
8934    }
8935}
8936
8937/// Represents an imaginary number literal.
8938/// 
8939/// ```ruby
8940/// 1.0i
8941/// ^^^^
8942/// ```
8943pub struct ImaginaryNode<'pr> {
8944    /// The pointer to the parser this node came from.
8945    parser: *const pm_parser_t,
8946
8947    /// The raw pointer to the node allocated by prism.
8948    pointer: *mut pm_imaginary_node_t,
8949
8950    /// The marker to indicate the lifetime of the pointer.
8951    marker: PhantomData<&'pr mut pm_imaginary_node_t>
8952}
8953
8954impl<'pr> ImaginaryNode<'pr> {
8955    /// Converts this node to a generic node.
8956    #[must_use]
8957    pub const fn as_node(&self) -> Node<'pr> {
8958        Node::ImaginaryNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
8959    }
8960
8961    /// Returns the location of this node.
8962    #[must_use]
8963    pub fn location(&self) -> Location<'pr> {
8964        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
8965        Location::new(self.parser, unsafe { &(*pointer) })
8966    }
8967
8968    /// Returns the flags of this node.
8969    #[must_use]
8970    pub fn flags(&self) -> pm_node_flags_t {
8971        unsafe { (*self.pointer).base.flags }
8972    }
8973
8974    /// Returns the `numeric` param
8975    #[must_use]
8976    pub fn numeric(&self) -> Node<'pr> {
8977        let node: *mut pm_node_t = unsafe { (*self.pointer).numeric };
8978        Node::new(self.parser, node)
8979    }
8980}
8981
8982impl std::fmt::Debug for ImaginaryNode<'_> {
8983    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8984        write!(f, "ImaginaryNode({:?})", self.numeric())
8985    }
8986}
8987
8988/// Represents a node that is implicitly being added to the tree but doesn't correspond directly to a node in the source.
8989/// 
8990/// ```ruby
8991/// { foo: }
8992///   ^^^^
8993/// ```
8994/// 
8995/// ```ruby
8996/// { Foo: }
8997///   ^^^^
8998/// ```
8999/// 
9000/// ```ruby
9001/// foo in { bar: }
9002///          ^^^^
9003/// ```
9004pub struct ImplicitNode<'pr> {
9005    /// The pointer to the parser this node came from.
9006    parser: *const pm_parser_t,
9007
9008    /// The raw pointer to the node allocated by prism.
9009    pointer: *mut pm_implicit_node_t,
9010
9011    /// The marker to indicate the lifetime of the pointer.
9012    marker: PhantomData<&'pr mut pm_implicit_node_t>
9013}
9014
9015impl<'pr> ImplicitNode<'pr> {
9016    /// Converts this node to a generic node.
9017    #[must_use]
9018    pub const fn as_node(&self) -> Node<'pr> {
9019        Node::ImplicitNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9020    }
9021
9022    /// Returns the location of this node.
9023    #[must_use]
9024    pub fn location(&self) -> Location<'pr> {
9025        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9026        Location::new(self.parser, unsafe { &(*pointer) })
9027    }
9028
9029    /// Returns the flags of this node.
9030    #[must_use]
9031    pub fn flags(&self) -> pm_node_flags_t {
9032        unsafe { (*self.pointer).base.flags }
9033    }
9034
9035    /// Returns the `value` param
9036    #[must_use]
9037    pub fn value(&self) -> Node<'pr> {
9038        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9039        Node::new(self.parser, node)
9040    }
9041}
9042
9043impl std::fmt::Debug for ImplicitNode<'_> {
9044    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9045        write!(f, "ImplicitNode({:?})", self.value())
9046    }
9047}
9048
9049/// Represents using a trailing comma to indicate an implicit rest parameter.
9050/// 
9051/// ```ruby
9052/// foo { |bar,| }
9053///           ^
9054/// ```
9055/// 
9056/// ```ruby
9057/// foo in [bar,]
9058///            ^
9059/// ```
9060/// 
9061/// ```ruby
9062/// for foo, in bar do end
9063///        ^
9064/// ```
9065/// 
9066/// ```ruby
9067/// foo, = bar
9068///    ^
9069/// ```
9070pub struct ImplicitRestNode<'pr> {
9071    /// The pointer to the parser this node came from.
9072    parser: *const pm_parser_t,
9073
9074    /// The raw pointer to the node allocated by prism.
9075    pointer: *mut pm_implicit_rest_node_t,
9076
9077    /// The marker to indicate the lifetime of the pointer.
9078    marker: PhantomData<&'pr mut pm_implicit_rest_node_t>
9079}
9080
9081impl<'pr> ImplicitRestNode<'pr> {
9082    /// Converts this node to a generic node.
9083    #[must_use]
9084    pub const fn as_node(&self) -> Node<'pr> {
9085        Node::ImplicitRestNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9086    }
9087
9088    /// Returns the location of this node.
9089    #[must_use]
9090    pub fn location(&self) -> Location<'pr> {
9091        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9092        Location::new(self.parser, unsafe { &(*pointer) })
9093    }
9094
9095    /// Returns the flags of this node.
9096    #[must_use]
9097    pub fn flags(&self) -> pm_node_flags_t {
9098        unsafe { (*self.pointer).base.flags }
9099    }
9100}
9101
9102impl std::fmt::Debug for ImplicitRestNode<'_> {
9103    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9104        write!(f, "ImplicitRestNode()")
9105    }
9106}
9107
9108/// Represents the use of the `in` keyword in a case statement.
9109/// 
9110/// ```ruby
9111/// case a; in b then c end
9112///         ^^^^^^^^^^^
9113/// ```
9114pub struct InNode<'pr> {
9115    /// The pointer to the parser this node came from.
9116    parser: *const pm_parser_t,
9117
9118    /// The raw pointer to the node allocated by prism.
9119    pointer: *mut pm_in_node_t,
9120
9121    /// The marker to indicate the lifetime of the pointer.
9122    marker: PhantomData<&'pr mut pm_in_node_t>
9123}
9124
9125impl<'pr> InNode<'pr> {
9126    /// Converts this node to a generic node.
9127    #[must_use]
9128    pub const fn as_node(&self) -> Node<'pr> {
9129        Node::InNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9130    }
9131
9132    /// Returns the location of this node.
9133    #[must_use]
9134    pub fn location(&self) -> Location<'pr> {
9135        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9136        Location::new(self.parser, unsafe { &(*pointer) })
9137    }
9138
9139    /// Returns the flags of this node.
9140    #[must_use]
9141    pub fn flags(&self) -> pm_node_flags_t {
9142        unsafe { (*self.pointer).base.flags }
9143    }
9144
9145    /// Returns the `pattern` param
9146    #[must_use]
9147    pub fn pattern(&self) -> Node<'pr> {
9148        let node: *mut pm_node_t = unsafe { (*self.pointer).pattern };
9149        Node::new(self.parser, node)
9150    }
9151
9152    /// Returns the `statements` param
9153    #[must_use]
9154    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
9155        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
9156        if node.is_null() {
9157            None
9158        } else {
9159            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
9160        }
9161    }
9162
9163    /// Returns the `in_loc` param
9164    #[must_use]
9165    pub fn in_loc(&self) -> Location<'pr> {
9166        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).in_loc };
9167        Location::new(self.parser, unsafe { &(*pointer) })
9168    }
9169
9170    /// Returns the `then_loc` param
9171    #[must_use]
9172    pub fn then_loc(&self) -> Option<Location<'pr>> {
9173        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).then_loc };
9174        let length = unsafe { (*pointer).length };
9175        if length == 0 {
9176            None
9177        } else {
9178            Some(Location::new(self.parser, unsafe { &(*pointer) }))
9179        }
9180    }
9181}
9182
9183impl std::fmt::Debug for InNode<'_> {
9184    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9185        write!(f, "InNode({:?}, {:?}, {:?}, {:?})", self.pattern(), self.statements(), self.in_loc(), self.then_loc())
9186    }
9187}
9188
9189/// Represents the use of the `&&=` operator on a call to the `[]` method.
9190/// 
9191/// ```ruby
9192/// foo.bar[baz] &&= value
9193/// ^^^^^^^^^^^^^^^^^^^^^^
9194/// ```
9195pub struct IndexAndWriteNode<'pr> {
9196    /// The pointer to the parser this node came from.
9197    parser: *const pm_parser_t,
9198
9199    /// The raw pointer to the node allocated by prism.
9200    pointer: *mut pm_index_and_write_node_t,
9201
9202    /// The marker to indicate the lifetime of the pointer.
9203    marker: PhantomData<&'pr mut pm_index_and_write_node_t>
9204}
9205
9206impl<'pr> IndexAndWriteNode<'pr> {
9207    /// Converts this node to a generic node.
9208    #[must_use]
9209    pub const fn as_node(&self) -> Node<'pr> {
9210        Node::IndexAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9211    }
9212
9213    /// Returns the location of this node.
9214    #[must_use]
9215    pub fn location(&self) -> Location<'pr> {
9216        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9217        Location::new(self.parser, unsafe { &(*pointer) })
9218    }
9219
9220    /// Returns the flags of this node.
9221    #[must_use]
9222    pub fn flags(&self) -> pm_node_flags_t {
9223        unsafe { (*self.pointer).base.flags }
9224    }
9225
9226    /// &. operator
9227    #[must_use]
9228    pub fn is_safe_navigation(&self) -> bool {
9229        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
9230    }
9231
9232    /// a call that could have been a local variable
9233    #[must_use]
9234    pub fn is_variable_call(&self) -> bool {
9235        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
9236    }
9237
9238    /// a call that is an attribute write, so the value being written should be returned
9239    #[must_use]
9240    pub fn is_attribute_write(&self) -> bool {
9241        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
9242    }
9243
9244    /// a call that ignores method visibility
9245    #[must_use]
9246    pub fn is_ignore_visibility(&self) -> bool {
9247        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
9248    }
9249
9250    /// Returns the `receiver` param
9251    #[must_use]
9252    pub fn receiver(&self) -> Option<Node<'pr>> {
9253        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
9254        if node.is_null() {
9255            None
9256        } else {
9257            Some(Node::new(self.parser, node))
9258        }
9259    }
9260
9261    /// Returns the `call_operator_loc` param
9262    #[must_use]
9263    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
9264        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
9265        let length = unsafe { (*pointer).length };
9266        if length == 0 {
9267            None
9268        } else {
9269            Some(Location::new(self.parser, unsafe { &(*pointer) }))
9270        }
9271    }
9272
9273    /// Returns the `opening_loc` param
9274    #[must_use]
9275    pub fn opening_loc(&self) -> Location<'pr> {
9276        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
9277        Location::new(self.parser, unsafe { &(*pointer) })
9278    }
9279
9280    /// Returns the `arguments` param
9281    #[must_use]
9282    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
9283        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
9284        if node.is_null() {
9285            None
9286        } else {
9287            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
9288        }
9289    }
9290
9291    /// Returns the `closing_loc` param
9292    #[must_use]
9293    pub fn closing_loc(&self) -> Location<'pr> {
9294        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
9295        Location::new(self.parser, unsafe { &(*pointer) })
9296    }
9297
9298    /// Returns the `block` param
9299    #[must_use]
9300    pub fn block(&self) -> Option<BlockArgumentNode<'pr>> {
9301        let node: *mut pm_block_argument_node_t = unsafe { (*self.pointer).block };
9302        if node.is_null() {
9303            None
9304        } else {
9305            Some(BlockArgumentNode { parser: self.parser, pointer: node, marker: PhantomData })
9306        }
9307    }
9308
9309    /// Returns the `operator_loc` param
9310    #[must_use]
9311    pub fn operator_loc(&self) -> Location<'pr> {
9312        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
9313        Location::new(self.parser, unsafe { &(*pointer) })
9314    }
9315
9316    /// Returns the `value` param
9317    #[must_use]
9318    pub fn value(&self) -> Node<'pr> {
9319        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9320        Node::new(self.parser, node)
9321    }
9322}
9323
9324impl std::fmt::Debug for IndexAndWriteNode<'_> {
9325    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9326        write!(f, "IndexAndWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.opening_loc(), self.arguments(), self.closing_loc(), self.block(), self.operator_loc(), self.value())
9327    }
9328}
9329
9330/// Represents the use of an assignment operator on a call to `[]`.
9331/// 
9332/// ```ruby
9333/// foo.bar[baz] += value
9334/// ^^^^^^^^^^^^^^^^^^^^^
9335/// ```
9336pub struct IndexOperatorWriteNode<'pr> {
9337    /// The pointer to the parser this node came from.
9338    parser: *const pm_parser_t,
9339
9340    /// The raw pointer to the node allocated by prism.
9341    pointer: *mut pm_index_operator_write_node_t,
9342
9343    /// The marker to indicate the lifetime of the pointer.
9344    marker: PhantomData<&'pr mut pm_index_operator_write_node_t>
9345}
9346
9347impl<'pr> IndexOperatorWriteNode<'pr> {
9348    /// Converts this node to a generic node.
9349    #[must_use]
9350    pub const fn as_node(&self) -> Node<'pr> {
9351        Node::IndexOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9352    }
9353
9354    /// Returns the location of this node.
9355    #[must_use]
9356    pub fn location(&self) -> Location<'pr> {
9357        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9358        Location::new(self.parser, unsafe { &(*pointer) })
9359    }
9360
9361    /// Returns the flags of this node.
9362    #[must_use]
9363    pub fn flags(&self) -> pm_node_flags_t {
9364        unsafe { (*self.pointer).base.flags }
9365    }
9366
9367    /// &. operator
9368    #[must_use]
9369    pub fn is_safe_navigation(&self) -> bool {
9370        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
9371    }
9372
9373    /// a call that could have been a local variable
9374    #[must_use]
9375    pub fn is_variable_call(&self) -> bool {
9376        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
9377    }
9378
9379    /// a call that is an attribute write, so the value being written should be returned
9380    #[must_use]
9381    pub fn is_attribute_write(&self) -> bool {
9382        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
9383    }
9384
9385    /// a call that ignores method visibility
9386    #[must_use]
9387    pub fn is_ignore_visibility(&self) -> bool {
9388        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
9389    }
9390
9391    /// Returns the `receiver` param
9392    #[must_use]
9393    pub fn receiver(&self) -> Option<Node<'pr>> {
9394        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
9395        if node.is_null() {
9396            None
9397        } else {
9398            Some(Node::new(self.parser, node))
9399        }
9400    }
9401
9402    /// Returns the `call_operator_loc` param
9403    #[must_use]
9404    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
9405        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
9406        let length = unsafe { (*pointer).length };
9407        if length == 0 {
9408            None
9409        } else {
9410            Some(Location::new(self.parser, unsafe { &(*pointer) }))
9411        }
9412    }
9413
9414    /// Returns the `opening_loc` param
9415    #[must_use]
9416    pub fn opening_loc(&self) -> Location<'pr> {
9417        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
9418        Location::new(self.parser, unsafe { &(*pointer) })
9419    }
9420
9421    /// Returns the `arguments` param
9422    #[must_use]
9423    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
9424        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
9425        if node.is_null() {
9426            None
9427        } else {
9428            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
9429        }
9430    }
9431
9432    /// Returns the `closing_loc` param
9433    #[must_use]
9434    pub fn closing_loc(&self) -> Location<'pr> {
9435        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
9436        Location::new(self.parser, unsafe { &(*pointer) })
9437    }
9438
9439    /// Returns the `block` param
9440    #[must_use]
9441    pub fn block(&self) -> Option<BlockArgumentNode<'pr>> {
9442        let node: *mut pm_block_argument_node_t = unsafe { (*self.pointer).block };
9443        if node.is_null() {
9444            None
9445        } else {
9446            Some(BlockArgumentNode { parser: self.parser, pointer: node, marker: PhantomData })
9447        }
9448    }
9449
9450    /// Returns the `binary_operator` param
9451    #[must_use]
9452    pub fn binary_operator(&self) -> ConstantId<'pr> {
9453        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
9454    }
9455
9456    /// Returns the `binary_operator_loc` param
9457    #[must_use]
9458    pub fn binary_operator_loc(&self) -> Location<'pr> {
9459        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
9460        Location::new(self.parser, unsafe { &(*pointer) })
9461    }
9462
9463    /// Returns the `value` param
9464    #[must_use]
9465    pub fn value(&self) -> Node<'pr> {
9466        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9467        Node::new(self.parser, node)
9468    }
9469}
9470
9471impl std::fmt::Debug for IndexOperatorWriteNode<'_> {
9472    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9473        write!(f, "IndexOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.opening_loc(), self.arguments(), self.closing_loc(), self.block(), self.binary_operator(), self.binary_operator_loc(), self.value())
9474    }
9475}
9476
9477/// Represents the use of the `||=` operator on a call to `[]`.
9478/// 
9479/// ```ruby
9480/// foo.bar[baz] ||= value
9481/// ^^^^^^^^^^^^^^^^^^^^^^
9482/// ```
9483pub struct IndexOrWriteNode<'pr> {
9484    /// The pointer to the parser this node came from.
9485    parser: *const pm_parser_t,
9486
9487    /// The raw pointer to the node allocated by prism.
9488    pointer: *mut pm_index_or_write_node_t,
9489
9490    /// The marker to indicate the lifetime of the pointer.
9491    marker: PhantomData<&'pr mut pm_index_or_write_node_t>
9492}
9493
9494impl<'pr> IndexOrWriteNode<'pr> {
9495    /// Converts this node to a generic node.
9496    #[must_use]
9497    pub const fn as_node(&self) -> Node<'pr> {
9498        Node::IndexOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9499    }
9500
9501    /// Returns the location of this node.
9502    #[must_use]
9503    pub fn location(&self) -> Location<'pr> {
9504        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9505        Location::new(self.parser, unsafe { &(*pointer) })
9506    }
9507
9508    /// Returns the flags of this node.
9509    #[must_use]
9510    pub fn flags(&self) -> pm_node_flags_t {
9511        unsafe { (*self.pointer).base.flags }
9512    }
9513
9514    /// &. operator
9515    #[must_use]
9516    pub fn is_safe_navigation(&self) -> bool {
9517        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
9518    }
9519
9520    /// a call that could have been a local variable
9521    #[must_use]
9522    pub fn is_variable_call(&self) -> bool {
9523        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
9524    }
9525
9526    /// a call that is an attribute write, so the value being written should be returned
9527    #[must_use]
9528    pub fn is_attribute_write(&self) -> bool {
9529        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
9530    }
9531
9532    /// a call that ignores method visibility
9533    #[must_use]
9534    pub fn is_ignore_visibility(&self) -> bool {
9535        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
9536    }
9537
9538    /// Returns the `receiver` param
9539    #[must_use]
9540    pub fn receiver(&self) -> Option<Node<'pr>> {
9541        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
9542        if node.is_null() {
9543            None
9544        } else {
9545            Some(Node::new(self.parser, node))
9546        }
9547    }
9548
9549    /// Returns the `call_operator_loc` param
9550    #[must_use]
9551    pub fn call_operator_loc(&self) -> Option<Location<'pr>> {
9552        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).call_operator_loc };
9553        let length = unsafe { (*pointer).length };
9554        if length == 0 {
9555            None
9556        } else {
9557            Some(Location::new(self.parser, unsafe { &(*pointer) }))
9558        }
9559    }
9560
9561    /// Returns the `opening_loc` param
9562    #[must_use]
9563    pub fn opening_loc(&self) -> Location<'pr> {
9564        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
9565        Location::new(self.parser, unsafe { &(*pointer) })
9566    }
9567
9568    /// Returns the `arguments` param
9569    #[must_use]
9570    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
9571        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
9572        if node.is_null() {
9573            None
9574        } else {
9575            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
9576        }
9577    }
9578
9579    /// Returns the `closing_loc` param
9580    #[must_use]
9581    pub fn closing_loc(&self) -> Location<'pr> {
9582        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
9583        Location::new(self.parser, unsafe { &(*pointer) })
9584    }
9585
9586    /// Returns the `block` param
9587    #[must_use]
9588    pub fn block(&self) -> Option<BlockArgumentNode<'pr>> {
9589        let node: *mut pm_block_argument_node_t = unsafe { (*self.pointer).block };
9590        if node.is_null() {
9591            None
9592        } else {
9593            Some(BlockArgumentNode { parser: self.parser, pointer: node, marker: PhantomData })
9594        }
9595    }
9596
9597    /// Returns the `operator_loc` param
9598    #[must_use]
9599    pub fn operator_loc(&self) -> Location<'pr> {
9600        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
9601        Location::new(self.parser, unsafe { &(*pointer) })
9602    }
9603
9604    /// Returns the `value` param
9605    #[must_use]
9606    pub fn value(&self) -> Node<'pr> {
9607        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9608        Node::new(self.parser, node)
9609    }
9610}
9611
9612impl std::fmt::Debug for IndexOrWriteNode<'_> {
9613    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9614        write!(f, "IndexOrWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.call_operator_loc(), self.opening_loc(), self.arguments(), self.closing_loc(), self.block(), self.operator_loc(), self.value())
9615    }
9616}
9617
9618/// Represents assigning to an index.
9619/// 
9620/// ```ruby
9621/// foo[bar], = 1
9622/// ^^^^^^^^
9623/// ```
9624/// 
9625/// ```ruby
9626/// begin
9627/// rescue => foo[bar]
9628///           ^^^^^^^^
9629/// end
9630/// ```
9631/// 
9632/// ```ruby
9633/// for foo[bar] in baz do end
9634///     ^^^^^^^^
9635/// ```
9636pub struct IndexTargetNode<'pr> {
9637    /// The pointer to the parser this node came from.
9638    parser: *const pm_parser_t,
9639
9640    /// The raw pointer to the node allocated by prism.
9641    pointer: *mut pm_index_target_node_t,
9642
9643    /// The marker to indicate the lifetime of the pointer.
9644    marker: PhantomData<&'pr mut pm_index_target_node_t>
9645}
9646
9647impl<'pr> IndexTargetNode<'pr> {
9648    /// Converts this node to a generic node.
9649    #[must_use]
9650    pub const fn as_node(&self) -> Node<'pr> {
9651        Node::IndexTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9652    }
9653
9654    /// Returns the location of this node.
9655    #[must_use]
9656    pub fn location(&self) -> Location<'pr> {
9657        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9658        Location::new(self.parser, unsafe { &(*pointer) })
9659    }
9660
9661    /// Returns the flags of this node.
9662    #[must_use]
9663    pub fn flags(&self) -> pm_node_flags_t {
9664        unsafe { (*self.pointer).base.flags }
9665    }
9666
9667    /// &. operator
9668    #[must_use]
9669    pub fn is_safe_navigation(&self) -> bool {
9670        (self.flags() & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) != 0
9671    }
9672
9673    /// a call that could have been a local variable
9674    #[must_use]
9675    pub fn is_variable_call(&self) -> bool {
9676        (self.flags() & PM_CALL_NODE_FLAGS_VARIABLE_CALL) != 0
9677    }
9678
9679    /// a call that is an attribute write, so the value being written should be returned
9680    #[must_use]
9681    pub fn is_attribute_write(&self) -> bool {
9682        (self.flags() & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) != 0
9683    }
9684
9685    /// a call that ignores method visibility
9686    #[must_use]
9687    pub fn is_ignore_visibility(&self) -> bool {
9688        (self.flags() & PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY) != 0
9689    }
9690
9691    /// Returns the `receiver` param
9692    #[must_use]
9693    pub fn receiver(&self) -> Node<'pr> {
9694        let node: *mut pm_node_t = unsafe { (*self.pointer).receiver };
9695        Node::new(self.parser, node)
9696    }
9697
9698    /// Returns the `opening_loc` param
9699    #[must_use]
9700    pub fn opening_loc(&self) -> Location<'pr> {
9701        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
9702        Location::new(self.parser, unsafe { &(*pointer) })
9703    }
9704
9705    /// Returns the `arguments` param
9706    #[must_use]
9707    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
9708        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
9709        if node.is_null() {
9710            None
9711        } else {
9712            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
9713        }
9714    }
9715
9716    /// Returns the `closing_loc` param
9717    #[must_use]
9718    pub fn closing_loc(&self) -> Location<'pr> {
9719        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
9720        Location::new(self.parser, unsafe { &(*pointer) })
9721    }
9722
9723    /// Returns the `block` param
9724    #[must_use]
9725    pub fn block(&self) -> Option<BlockArgumentNode<'pr>> {
9726        let node: *mut pm_block_argument_node_t = unsafe { (*self.pointer).block };
9727        if node.is_null() {
9728            None
9729        } else {
9730            Some(BlockArgumentNode { parser: self.parser, pointer: node, marker: PhantomData })
9731        }
9732    }
9733}
9734
9735impl std::fmt::Debug for IndexTargetNode<'_> {
9736    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9737        write!(f, "IndexTargetNode({:?}, {:?}, {:?}, {:?}, {:?})", self.receiver(), self.opening_loc(), self.arguments(), self.closing_loc(), self.block())
9738    }
9739}
9740
9741/// Represents the use of the `&&=` operator for assignment to an instance variable.
9742/// 
9743/// ```ruby
9744/// @target &&= value
9745/// ^^^^^^^^^^^^^^^^^
9746/// ```
9747pub struct InstanceVariableAndWriteNode<'pr> {
9748    /// The pointer to the parser this node came from.
9749    parser: *const pm_parser_t,
9750
9751    /// The raw pointer to the node allocated by prism.
9752    pointer: *mut pm_instance_variable_and_write_node_t,
9753
9754    /// The marker to indicate the lifetime of the pointer.
9755    marker: PhantomData<&'pr mut pm_instance_variable_and_write_node_t>
9756}
9757
9758impl<'pr> InstanceVariableAndWriteNode<'pr> {
9759    /// Converts this node to a generic node.
9760    #[must_use]
9761    pub const fn as_node(&self) -> Node<'pr> {
9762        Node::InstanceVariableAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9763    }
9764
9765    /// Returns the location of this node.
9766    #[must_use]
9767    pub fn location(&self) -> Location<'pr> {
9768        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9769        Location::new(self.parser, unsafe { &(*pointer) })
9770    }
9771
9772    /// Returns the flags of this node.
9773    #[must_use]
9774    pub fn flags(&self) -> pm_node_flags_t {
9775        unsafe { (*self.pointer).base.flags }
9776    }
9777
9778    /// Returns the `name` param
9779    #[must_use]
9780    pub fn name(&self) -> ConstantId<'pr> {
9781        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
9782    }
9783
9784    /// Returns the `name_loc` param
9785    #[must_use]
9786    pub fn name_loc(&self) -> Location<'pr> {
9787        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
9788        Location::new(self.parser, unsafe { &(*pointer) })
9789    }
9790
9791    /// Returns the `operator_loc` param
9792    #[must_use]
9793    pub fn operator_loc(&self) -> Location<'pr> {
9794        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
9795        Location::new(self.parser, unsafe { &(*pointer) })
9796    }
9797
9798    /// Returns the `value` param
9799    #[must_use]
9800    pub fn value(&self) -> Node<'pr> {
9801        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9802        Node::new(self.parser, node)
9803    }
9804}
9805
9806impl std::fmt::Debug for InstanceVariableAndWriteNode<'_> {
9807    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9808        write!(f, "InstanceVariableAndWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
9809    }
9810}
9811
9812/// Represents assigning to an instance variable using an operator that isn't `=`.
9813/// 
9814/// ```ruby
9815/// @target += value
9816/// ^^^^^^^^^^^^^^^^
9817/// ```
9818pub struct InstanceVariableOperatorWriteNode<'pr> {
9819    /// The pointer to the parser this node came from.
9820    parser: *const pm_parser_t,
9821
9822    /// The raw pointer to the node allocated by prism.
9823    pointer: *mut pm_instance_variable_operator_write_node_t,
9824
9825    /// The marker to indicate the lifetime of the pointer.
9826    marker: PhantomData<&'pr mut pm_instance_variable_operator_write_node_t>
9827}
9828
9829impl<'pr> InstanceVariableOperatorWriteNode<'pr> {
9830    /// Converts this node to a generic node.
9831    #[must_use]
9832    pub const fn as_node(&self) -> Node<'pr> {
9833        Node::InstanceVariableOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9834    }
9835
9836    /// Returns the location of this node.
9837    #[must_use]
9838    pub fn location(&self) -> Location<'pr> {
9839        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9840        Location::new(self.parser, unsafe { &(*pointer) })
9841    }
9842
9843    /// Returns the flags of this node.
9844    #[must_use]
9845    pub fn flags(&self) -> pm_node_flags_t {
9846        unsafe { (*self.pointer).base.flags }
9847    }
9848
9849    /// Returns the `name` param
9850    #[must_use]
9851    pub fn name(&self) -> ConstantId<'pr> {
9852        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
9853    }
9854
9855    /// Returns the `name_loc` param
9856    #[must_use]
9857    pub fn name_loc(&self) -> Location<'pr> {
9858        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
9859        Location::new(self.parser, unsafe { &(*pointer) })
9860    }
9861
9862    /// Returns the `binary_operator_loc` param
9863    #[must_use]
9864    pub fn binary_operator_loc(&self) -> Location<'pr> {
9865        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
9866        Location::new(self.parser, unsafe { &(*pointer) })
9867    }
9868
9869    /// Returns the `value` param
9870    #[must_use]
9871    pub fn value(&self) -> Node<'pr> {
9872        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9873        Node::new(self.parser, node)
9874    }
9875
9876    /// Returns the `binary_operator` param
9877    #[must_use]
9878    pub fn binary_operator(&self) -> ConstantId<'pr> {
9879        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
9880    }
9881}
9882
9883impl std::fmt::Debug for InstanceVariableOperatorWriteNode<'_> {
9884    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9885        write!(f, "InstanceVariableOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.binary_operator_loc(), self.value(), self.binary_operator())
9886    }
9887}
9888
9889/// Represents the use of the `||=` operator for assignment to an instance variable.
9890/// 
9891/// ```ruby
9892/// @target ||= value
9893/// ^^^^^^^^^^^^^^^^^
9894/// ```
9895pub struct InstanceVariableOrWriteNode<'pr> {
9896    /// The pointer to the parser this node came from.
9897    parser: *const pm_parser_t,
9898
9899    /// The raw pointer to the node allocated by prism.
9900    pointer: *mut pm_instance_variable_or_write_node_t,
9901
9902    /// The marker to indicate the lifetime of the pointer.
9903    marker: PhantomData<&'pr mut pm_instance_variable_or_write_node_t>
9904}
9905
9906impl<'pr> InstanceVariableOrWriteNode<'pr> {
9907    /// Converts this node to a generic node.
9908    #[must_use]
9909    pub const fn as_node(&self) -> Node<'pr> {
9910        Node::InstanceVariableOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9911    }
9912
9913    /// Returns the location of this node.
9914    #[must_use]
9915    pub fn location(&self) -> Location<'pr> {
9916        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9917        Location::new(self.parser, unsafe { &(*pointer) })
9918    }
9919
9920    /// Returns the flags of this node.
9921    #[must_use]
9922    pub fn flags(&self) -> pm_node_flags_t {
9923        unsafe { (*self.pointer).base.flags }
9924    }
9925
9926    /// Returns the `name` param
9927    #[must_use]
9928    pub fn name(&self) -> ConstantId<'pr> {
9929        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
9930    }
9931
9932    /// Returns the `name_loc` param
9933    #[must_use]
9934    pub fn name_loc(&self) -> Location<'pr> {
9935        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
9936        Location::new(self.parser, unsafe { &(*pointer) })
9937    }
9938
9939    /// Returns the `operator_loc` param
9940    #[must_use]
9941    pub fn operator_loc(&self) -> Location<'pr> {
9942        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
9943        Location::new(self.parser, unsafe { &(*pointer) })
9944    }
9945
9946    /// Returns the `value` param
9947    #[must_use]
9948    pub fn value(&self) -> Node<'pr> {
9949        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
9950        Node::new(self.parser, node)
9951    }
9952}
9953
9954impl std::fmt::Debug for InstanceVariableOrWriteNode<'_> {
9955    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9956        write!(f, "InstanceVariableOrWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
9957    }
9958}
9959
9960/// Represents referencing an instance variable.
9961/// 
9962/// ```ruby
9963/// @foo
9964/// ^^^^
9965/// ```
9966pub struct InstanceVariableReadNode<'pr> {
9967    /// The pointer to the parser this node came from.
9968    parser: *const pm_parser_t,
9969
9970    /// The raw pointer to the node allocated by prism.
9971    pointer: *mut pm_instance_variable_read_node_t,
9972
9973    /// The marker to indicate the lifetime of the pointer.
9974    marker: PhantomData<&'pr mut pm_instance_variable_read_node_t>
9975}
9976
9977impl<'pr> InstanceVariableReadNode<'pr> {
9978    /// Converts this node to a generic node.
9979    #[must_use]
9980    pub const fn as_node(&self) -> Node<'pr> {
9981        Node::InstanceVariableReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
9982    }
9983
9984    /// Returns the location of this node.
9985    #[must_use]
9986    pub fn location(&self) -> Location<'pr> {
9987        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
9988        Location::new(self.parser, unsafe { &(*pointer) })
9989    }
9990
9991    /// Returns the flags of this node.
9992    #[must_use]
9993    pub fn flags(&self) -> pm_node_flags_t {
9994        unsafe { (*self.pointer).base.flags }
9995    }
9996
9997    /// Returns the `name` param
9998    #[must_use]
9999    pub fn name(&self) -> ConstantId<'pr> {
10000        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
10001    }
10002}
10003
10004impl std::fmt::Debug for InstanceVariableReadNode<'_> {
10005    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10006        write!(f, "InstanceVariableReadNode({:?})", self.name())
10007    }
10008}
10009
10010/// Represents writing to an instance variable in a context that doesn't have an explicit value.
10011/// 
10012/// ```ruby
10013/// @foo, @bar = baz
10014/// ^^^^  ^^^^
10015/// ```
10016pub struct InstanceVariableTargetNode<'pr> {
10017    /// The pointer to the parser this node came from.
10018    parser: *const pm_parser_t,
10019
10020    /// The raw pointer to the node allocated by prism.
10021    pointer: *mut pm_instance_variable_target_node_t,
10022
10023    /// The marker to indicate the lifetime of the pointer.
10024    marker: PhantomData<&'pr mut pm_instance_variable_target_node_t>
10025}
10026
10027impl<'pr> InstanceVariableTargetNode<'pr> {
10028    /// Converts this node to a generic node.
10029    #[must_use]
10030    pub const fn as_node(&self) -> Node<'pr> {
10031        Node::InstanceVariableTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10032    }
10033
10034    /// Returns the location of this node.
10035    #[must_use]
10036    pub fn location(&self) -> Location<'pr> {
10037        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10038        Location::new(self.parser, unsafe { &(*pointer) })
10039    }
10040
10041    /// Returns the flags of this node.
10042    #[must_use]
10043    pub fn flags(&self) -> pm_node_flags_t {
10044        unsafe { (*self.pointer).base.flags }
10045    }
10046
10047    /// Returns the `name` param
10048    #[must_use]
10049    pub fn name(&self) -> ConstantId<'pr> {
10050        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
10051    }
10052}
10053
10054impl std::fmt::Debug for InstanceVariableTargetNode<'_> {
10055    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10056        write!(f, "InstanceVariableTargetNode({:?})", self.name())
10057    }
10058}
10059
10060/// Represents writing to an instance variable.
10061/// 
10062/// ```ruby
10063/// @foo = 1
10064/// ^^^^^^^^
10065/// ```
10066pub struct InstanceVariableWriteNode<'pr> {
10067    /// The pointer to the parser this node came from.
10068    parser: *const pm_parser_t,
10069
10070    /// The raw pointer to the node allocated by prism.
10071    pointer: *mut pm_instance_variable_write_node_t,
10072
10073    /// The marker to indicate the lifetime of the pointer.
10074    marker: PhantomData<&'pr mut pm_instance_variable_write_node_t>
10075}
10076
10077impl<'pr> InstanceVariableWriteNode<'pr> {
10078    /// Converts this node to a generic node.
10079    #[must_use]
10080    pub const fn as_node(&self) -> Node<'pr> {
10081        Node::InstanceVariableWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10082    }
10083
10084    /// Returns the location of this node.
10085    #[must_use]
10086    pub fn location(&self) -> Location<'pr> {
10087        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10088        Location::new(self.parser, unsafe { &(*pointer) })
10089    }
10090
10091    /// Returns the flags of this node.
10092    #[must_use]
10093    pub fn flags(&self) -> pm_node_flags_t {
10094        unsafe { (*self.pointer).base.flags }
10095    }
10096
10097    /// Returns the `name` param
10098    #[must_use]
10099    pub fn name(&self) -> ConstantId<'pr> {
10100        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
10101    }
10102
10103    /// Returns the `name_loc` param
10104    #[must_use]
10105    pub fn name_loc(&self) -> Location<'pr> {
10106        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
10107        Location::new(self.parser, unsafe { &(*pointer) })
10108    }
10109
10110    /// Returns the `value` param
10111    #[must_use]
10112    pub fn value(&self) -> Node<'pr> {
10113        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
10114        Node::new(self.parser, node)
10115    }
10116
10117    /// Returns the `operator_loc` param
10118    #[must_use]
10119    pub fn operator_loc(&self) -> Location<'pr> {
10120        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
10121        Location::new(self.parser, unsafe { &(*pointer) })
10122    }
10123}
10124
10125impl std::fmt::Debug for InstanceVariableWriteNode<'_> {
10126    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10127        write!(f, "InstanceVariableWriteNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.value(), self.operator_loc())
10128    }
10129}
10130
10131/// Represents an integer number literal.
10132/// 
10133/// ```ruby
10134/// 1
10135/// ^
10136/// ```
10137pub struct IntegerNode<'pr> {
10138    /// The pointer to the parser this node came from.
10139    parser: *const pm_parser_t,
10140
10141    /// The raw pointer to the node allocated by prism.
10142    pointer: *mut pm_integer_node_t,
10143
10144    /// The marker to indicate the lifetime of the pointer.
10145    marker: PhantomData<&'pr mut pm_integer_node_t>
10146}
10147
10148impl<'pr> IntegerNode<'pr> {
10149    /// Converts this node to a generic node.
10150    #[must_use]
10151    pub const fn as_node(&self) -> Node<'pr> {
10152        Node::IntegerNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10153    }
10154
10155    /// Returns the location of this node.
10156    #[must_use]
10157    pub fn location(&self) -> Location<'pr> {
10158        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10159        Location::new(self.parser, unsafe { &(*pointer) })
10160    }
10161
10162    /// Returns the flags of this node.
10163    #[must_use]
10164    pub fn flags(&self) -> pm_node_flags_t {
10165        unsafe { (*self.pointer).base.flags }
10166    }
10167
10168    /// 0b prefix
10169    #[must_use]
10170    pub fn is_binary(&self) -> bool {
10171        (self.flags() & PM_INTEGER_BASE_FLAGS_BINARY) != 0
10172    }
10173
10174    /// 0d or no prefix
10175    #[must_use]
10176    pub fn is_decimal(&self) -> bool {
10177        (self.flags() & PM_INTEGER_BASE_FLAGS_DECIMAL) != 0
10178    }
10179
10180    /// 0o or 0 prefix
10181    #[must_use]
10182    pub fn is_octal(&self) -> bool {
10183        (self.flags() & PM_INTEGER_BASE_FLAGS_OCTAL) != 0
10184    }
10185
10186    /// 0x prefix
10187    #[must_use]
10188    pub fn is_hexadecimal(&self) -> bool {
10189        (self.flags() & PM_INTEGER_BASE_FLAGS_HEXADECIMAL) != 0
10190    }
10191
10192    /// Returns the `value` param
10193    #[must_use]
10194    pub fn value(&self) -> Integer<'pr> {
10195        Integer::new(unsafe { &raw const(*self.pointer).value })
10196    }
10197}
10198
10199impl std::fmt::Debug for IntegerNode<'_> {
10200    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10201        write!(f, "IntegerNode({:?})", self.value())
10202    }
10203}
10204
10205/// Represents a regular expression literal that contains interpolation that is being used in the predicate of a conditional to implicitly match against the last line read by an IO object.
10206/// 
10207/// ```ruby
10208/// if /foo #{bar} baz/ then end
10209///    ^^^^^^^^^^^^^^^^
10210/// ```
10211pub struct InterpolatedMatchLastLineNode<'pr> {
10212    /// The pointer to the parser this node came from.
10213    parser: *const pm_parser_t,
10214
10215    /// The raw pointer to the node allocated by prism.
10216    pointer: *mut pm_interpolated_match_last_line_node_t,
10217
10218    /// The marker to indicate the lifetime of the pointer.
10219    marker: PhantomData<&'pr mut pm_interpolated_match_last_line_node_t>
10220}
10221
10222impl<'pr> InterpolatedMatchLastLineNode<'pr> {
10223    /// Converts this node to a generic node.
10224    #[must_use]
10225    pub const fn as_node(&self) -> Node<'pr> {
10226        Node::InterpolatedMatchLastLineNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10227    }
10228
10229    /// Returns the location of this node.
10230    #[must_use]
10231    pub fn location(&self) -> Location<'pr> {
10232        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10233        Location::new(self.parser, unsafe { &(*pointer) })
10234    }
10235
10236    /// Returns the flags of this node.
10237    #[must_use]
10238    pub fn flags(&self) -> pm_node_flags_t {
10239        unsafe { (*self.pointer).base.flags }
10240    }
10241
10242    /// i - ignores the case of characters when matching
10243    #[must_use]
10244    pub fn is_ignore_case(&self) -> bool {
10245        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE) != 0
10246    }
10247
10248    /// x - ignores whitespace and allows comments in regular expressions
10249    #[must_use]
10250    pub fn is_extended(&self) -> bool {
10251        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EXTENDED) != 0
10252    }
10253
10254    /// m - allows $ to match the end of lines within strings
10255    #[must_use]
10256    pub fn is_multi_line(&self) -> bool {
10257        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE) != 0
10258    }
10259
10260    /// o - only interpolates values into the regular expression once
10261    #[must_use]
10262    pub fn is_once(&self) -> bool {
10263        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ONCE) != 0
10264    }
10265
10266    /// e - forces the EUC-JP encoding
10267    #[must_use]
10268    pub fn is_euc_jp(&self) -> bool {
10269        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EUC_JP) != 0
10270    }
10271
10272    /// n - forces the ASCII-8BIT encoding
10273    #[must_use]
10274    pub fn is_ascii_8bit(&self) -> bool {
10275        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT) != 0
10276    }
10277
10278    /// s - forces the Windows-31J encoding
10279    #[must_use]
10280    pub fn is_windows_31j(&self) -> bool {
10281        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J) != 0
10282    }
10283
10284    /// u - forces the UTF-8 encoding
10285    #[must_use]
10286    pub fn is_utf_8(&self) -> bool {
10287        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_UTF_8) != 0
10288    }
10289
10290    /// internal bytes forced the encoding to UTF-8
10291    #[must_use]
10292    pub fn is_forced_utf8_encoding(&self) -> bool {
10293        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING) != 0
10294    }
10295
10296    /// internal bytes forced the encoding to binary
10297    #[must_use]
10298    pub fn is_forced_binary_encoding(&self) -> bool {
10299        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING) != 0
10300    }
10301
10302    /// internal bytes forced the encoding to US-ASCII
10303    #[must_use]
10304    pub fn is_forced_us_ascii_encoding(&self) -> bool {
10305        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING) != 0
10306    }
10307
10308    /// Returns the `opening_loc` param
10309    #[must_use]
10310    pub fn opening_loc(&self) -> Location<'pr> {
10311        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
10312        Location::new(self.parser, unsafe { &(*pointer) })
10313    }
10314
10315    /// Returns the `parts` param
10316    #[must_use]
10317    pub fn parts(&self) -> NodeList<'pr> {
10318        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).parts };
10319        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10320    }
10321
10322    /// Returns the `closing_loc` param
10323    #[must_use]
10324    pub fn closing_loc(&self) -> Location<'pr> {
10325        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
10326        Location::new(self.parser, unsafe { &(*pointer) })
10327    }
10328}
10329
10330impl std::fmt::Debug for InterpolatedMatchLastLineNode<'_> {
10331    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10332        write!(f, "InterpolatedMatchLastLineNode({:?}, {:?}, {:?})", self.opening_loc(), self.parts(), self.closing_loc())
10333    }
10334}
10335
10336/// Represents a regular expression literal that contains interpolation.
10337/// 
10338/// ```ruby
10339/// /foo #{bar} baz/
10340/// ^^^^^^^^^^^^^^^^
10341/// ```
10342pub struct InterpolatedRegularExpressionNode<'pr> {
10343    /// The pointer to the parser this node came from.
10344    parser: *const pm_parser_t,
10345
10346    /// The raw pointer to the node allocated by prism.
10347    pointer: *mut pm_interpolated_regular_expression_node_t,
10348
10349    /// The marker to indicate the lifetime of the pointer.
10350    marker: PhantomData<&'pr mut pm_interpolated_regular_expression_node_t>
10351}
10352
10353impl<'pr> InterpolatedRegularExpressionNode<'pr> {
10354    /// Converts this node to a generic node.
10355    #[must_use]
10356    pub const fn as_node(&self) -> Node<'pr> {
10357        Node::InterpolatedRegularExpressionNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10358    }
10359
10360    /// Returns the location of this node.
10361    #[must_use]
10362    pub fn location(&self) -> Location<'pr> {
10363        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10364        Location::new(self.parser, unsafe { &(*pointer) })
10365    }
10366
10367    /// Returns the flags of this node.
10368    #[must_use]
10369    pub fn flags(&self) -> pm_node_flags_t {
10370        unsafe { (*self.pointer).base.flags }
10371    }
10372
10373    /// i - ignores the case of characters when matching
10374    #[must_use]
10375    pub fn is_ignore_case(&self) -> bool {
10376        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE) != 0
10377    }
10378
10379    /// x - ignores whitespace and allows comments in regular expressions
10380    #[must_use]
10381    pub fn is_extended(&self) -> bool {
10382        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EXTENDED) != 0
10383    }
10384
10385    /// m - allows $ to match the end of lines within strings
10386    #[must_use]
10387    pub fn is_multi_line(&self) -> bool {
10388        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE) != 0
10389    }
10390
10391    /// o - only interpolates values into the regular expression once
10392    #[must_use]
10393    pub fn is_once(&self) -> bool {
10394        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ONCE) != 0
10395    }
10396
10397    /// e - forces the EUC-JP encoding
10398    #[must_use]
10399    pub fn is_euc_jp(&self) -> bool {
10400        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EUC_JP) != 0
10401    }
10402
10403    /// n - forces the ASCII-8BIT encoding
10404    #[must_use]
10405    pub fn is_ascii_8bit(&self) -> bool {
10406        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT) != 0
10407    }
10408
10409    /// s - forces the Windows-31J encoding
10410    #[must_use]
10411    pub fn is_windows_31j(&self) -> bool {
10412        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J) != 0
10413    }
10414
10415    /// u - forces the UTF-8 encoding
10416    #[must_use]
10417    pub fn is_utf_8(&self) -> bool {
10418        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_UTF_8) != 0
10419    }
10420
10421    /// internal bytes forced the encoding to UTF-8
10422    #[must_use]
10423    pub fn is_forced_utf8_encoding(&self) -> bool {
10424        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING) != 0
10425    }
10426
10427    /// internal bytes forced the encoding to binary
10428    #[must_use]
10429    pub fn is_forced_binary_encoding(&self) -> bool {
10430        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING) != 0
10431    }
10432
10433    /// internal bytes forced the encoding to US-ASCII
10434    #[must_use]
10435    pub fn is_forced_us_ascii_encoding(&self) -> bool {
10436        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING) != 0
10437    }
10438
10439    /// Returns the `opening_loc` param
10440    #[must_use]
10441    pub fn opening_loc(&self) -> Location<'pr> {
10442        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
10443        Location::new(self.parser, unsafe { &(*pointer) })
10444    }
10445
10446    /// Returns the `parts` param
10447    #[must_use]
10448    pub fn parts(&self) -> NodeList<'pr> {
10449        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).parts };
10450        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10451    }
10452
10453    /// Returns the `closing_loc` param
10454    #[must_use]
10455    pub fn closing_loc(&self) -> Location<'pr> {
10456        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
10457        Location::new(self.parser, unsafe { &(*pointer) })
10458    }
10459}
10460
10461impl std::fmt::Debug for InterpolatedRegularExpressionNode<'_> {
10462    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10463        write!(f, "InterpolatedRegularExpressionNode({:?}, {:?}, {:?})", self.opening_loc(), self.parts(), self.closing_loc())
10464    }
10465}
10466
10467/// Represents a string literal that contains interpolation.
10468/// 
10469/// ```ruby
10470/// "foo #{bar} baz"
10471/// ^^^^^^^^^^^^^^^^
10472/// ```
10473pub struct InterpolatedStringNode<'pr> {
10474    /// The pointer to the parser this node came from.
10475    parser: *const pm_parser_t,
10476
10477    /// The raw pointer to the node allocated by prism.
10478    pointer: *mut pm_interpolated_string_node_t,
10479
10480    /// The marker to indicate the lifetime of the pointer.
10481    marker: PhantomData<&'pr mut pm_interpolated_string_node_t>
10482}
10483
10484impl<'pr> InterpolatedStringNode<'pr> {
10485    /// Converts this node to a generic node.
10486    #[must_use]
10487    pub const fn as_node(&self) -> Node<'pr> {
10488        Node::InterpolatedStringNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10489    }
10490
10491    /// Returns the location of this node.
10492    #[must_use]
10493    pub fn location(&self) -> Location<'pr> {
10494        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10495        Location::new(self.parser, unsafe { &(*pointer) })
10496    }
10497
10498    /// Returns the flags of this node.
10499    #[must_use]
10500    pub fn flags(&self) -> pm_node_flags_t {
10501        unsafe { (*self.pointer).base.flags }
10502    }
10503
10504    /// frozen by virtue of a `frozen_string_literal: true` comment or `--enable-frozen-string-literal`; only for adjacent string literals like `'a' 'b'`
10505    #[must_use]
10506    pub fn is_frozen(&self) -> bool {
10507        (self.flags() & PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN) != 0
10508    }
10509
10510    /// mutable by virtue of a `frozen_string_literal: false` comment or `--disable-frozen-string-literal`; only for adjacent string literals like `'a' 'b'`
10511    #[must_use]
10512    pub fn is_mutable(&self) -> bool {
10513        (self.flags() & PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE) != 0
10514    }
10515
10516    /// Returns the `opening_loc` param
10517    #[must_use]
10518    pub fn opening_loc(&self) -> Option<Location<'pr>> {
10519        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
10520        let length = unsafe { (*pointer).length };
10521        if length == 0 {
10522            None
10523        } else {
10524            Some(Location::new(self.parser, unsafe { &(*pointer) }))
10525        }
10526    }
10527
10528    /// Returns the `parts` param
10529    #[must_use]
10530    pub fn parts(&self) -> NodeList<'pr> {
10531        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).parts };
10532        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10533    }
10534
10535    /// Returns the `closing_loc` param
10536    #[must_use]
10537    pub fn closing_loc(&self) -> Option<Location<'pr>> {
10538        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
10539        let length = unsafe { (*pointer).length };
10540        if length == 0 {
10541            None
10542        } else {
10543            Some(Location::new(self.parser, unsafe { &(*pointer) }))
10544        }
10545    }
10546}
10547
10548impl std::fmt::Debug for InterpolatedStringNode<'_> {
10549    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10550        write!(f, "InterpolatedStringNode({:?}, {:?}, {:?})", self.opening_loc(), self.parts(), self.closing_loc())
10551    }
10552}
10553
10554/// Represents a symbol literal that contains interpolation.
10555/// 
10556/// ```ruby
10557/// :"foo #{bar} baz"
10558/// ^^^^^^^^^^^^^^^^^
10559/// ```
10560pub struct InterpolatedSymbolNode<'pr> {
10561    /// The pointer to the parser this node came from.
10562    parser: *const pm_parser_t,
10563
10564    /// The raw pointer to the node allocated by prism.
10565    pointer: *mut pm_interpolated_symbol_node_t,
10566
10567    /// The marker to indicate the lifetime of the pointer.
10568    marker: PhantomData<&'pr mut pm_interpolated_symbol_node_t>
10569}
10570
10571impl<'pr> InterpolatedSymbolNode<'pr> {
10572    /// Converts this node to a generic node.
10573    #[must_use]
10574    pub const fn as_node(&self) -> Node<'pr> {
10575        Node::InterpolatedSymbolNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10576    }
10577
10578    /// Returns the location of this node.
10579    #[must_use]
10580    pub fn location(&self) -> Location<'pr> {
10581        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10582        Location::new(self.parser, unsafe { &(*pointer) })
10583    }
10584
10585    /// Returns the flags of this node.
10586    #[must_use]
10587    pub fn flags(&self) -> pm_node_flags_t {
10588        unsafe { (*self.pointer).base.flags }
10589    }
10590
10591    /// Returns the `opening_loc` param
10592    #[must_use]
10593    pub fn opening_loc(&self) -> Option<Location<'pr>> {
10594        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
10595        let length = unsafe { (*pointer).length };
10596        if length == 0 {
10597            None
10598        } else {
10599            Some(Location::new(self.parser, unsafe { &(*pointer) }))
10600        }
10601    }
10602
10603    /// Returns the `parts` param
10604    #[must_use]
10605    pub fn parts(&self) -> NodeList<'pr> {
10606        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).parts };
10607        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10608    }
10609
10610    /// Returns the `closing_loc` param
10611    #[must_use]
10612    pub fn closing_loc(&self) -> Option<Location<'pr>> {
10613        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
10614        let length = unsafe { (*pointer).length };
10615        if length == 0 {
10616            None
10617        } else {
10618            Some(Location::new(self.parser, unsafe { &(*pointer) }))
10619        }
10620    }
10621}
10622
10623impl std::fmt::Debug for InterpolatedSymbolNode<'_> {
10624    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10625        write!(f, "InterpolatedSymbolNode({:?}, {:?}, {:?})", self.opening_loc(), self.parts(), self.closing_loc())
10626    }
10627}
10628
10629/// Represents an xstring literal that contains interpolation.
10630/// 
10631/// ```ruby
10632/// `foo #{bar} baz`
10633/// ^^^^^^^^^^^^^^^^
10634/// ```
10635pub struct InterpolatedXStringNode<'pr> {
10636    /// The pointer to the parser this node came from.
10637    parser: *const pm_parser_t,
10638
10639    /// The raw pointer to the node allocated by prism.
10640    pointer: *mut pm_interpolated_x_string_node_t,
10641
10642    /// The marker to indicate the lifetime of the pointer.
10643    marker: PhantomData<&'pr mut pm_interpolated_x_string_node_t>
10644}
10645
10646impl<'pr> InterpolatedXStringNode<'pr> {
10647    /// Converts this node to a generic node.
10648    #[must_use]
10649    pub const fn as_node(&self) -> Node<'pr> {
10650        Node::InterpolatedXStringNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10651    }
10652
10653    /// Returns the location of this node.
10654    #[must_use]
10655    pub fn location(&self) -> Location<'pr> {
10656        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10657        Location::new(self.parser, unsafe { &(*pointer) })
10658    }
10659
10660    /// Returns the flags of this node.
10661    #[must_use]
10662    pub fn flags(&self) -> pm_node_flags_t {
10663        unsafe { (*self.pointer).base.flags }
10664    }
10665
10666    /// Returns the `opening_loc` param
10667    #[must_use]
10668    pub fn opening_loc(&self) -> Location<'pr> {
10669        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
10670        Location::new(self.parser, unsafe { &(*pointer) })
10671    }
10672
10673    /// Returns the `parts` param
10674    #[must_use]
10675    pub fn parts(&self) -> NodeList<'pr> {
10676        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).parts };
10677        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10678    }
10679
10680    /// Returns the `closing_loc` param
10681    #[must_use]
10682    pub fn closing_loc(&self) -> Location<'pr> {
10683        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
10684        Location::new(self.parser, unsafe { &(*pointer) })
10685    }
10686}
10687
10688impl std::fmt::Debug for InterpolatedXStringNode<'_> {
10689    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10690        write!(f, "InterpolatedXStringNode({:?}, {:?}, {:?})", self.opening_loc(), self.parts(), self.closing_loc())
10691    }
10692}
10693
10694/// Represents reading from the implicit `it` local variable.
10695/// 
10696/// ```ruby
10697/// -> { it }
10698///      ^^
10699/// ```
10700pub struct ItLocalVariableReadNode<'pr> {
10701    /// The pointer to the parser this node came from.
10702    parser: *const pm_parser_t,
10703
10704    /// The raw pointer to the node allocated by prism.
10705    pointer: *mut pm_it_local_variable_read_node_t,
10706
10707    /// The marker to indicate the lifetime of the pointer.
10708    marker: PhantomData<&'pr mut pm_it_local_variable_read_node_t>
10709}
10710
10711impl<'pr> ItLocalVariableReadNode<'pr> {
10712    /// Converts this node to a generic node.
10713    #[must_use]
10714    pub const fn as_node(&self) -> Node<'pr> {
10715        Node::ItLocalVariableReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10716    }
10717
10718    /// Returns the location of this node.
10719    #[must_use]
10720    pub fn location(&self) -> Location<'pr> {
10721        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10722        Location::new(self.parser, unsafe { &(*pointer) })
10723    }
10724
10725    /// Returns the flags of this node.
10726    #[must_use]
10727    pub fn flags(&self) -> pm_node_flags_t {
10728        unsafe { (*self.pointer).base.flags }
10729    }
10730}
10731
10732impl std::fmt::Debug for ItLocalVariableReadNode<'_> {
10733    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10734        write!(f, "ItLocalVariableReadNode()")
10735    }
10736}
10737
10738/// Represents an implicit set of parameters through the use of the `it` keyword within a block or lambda.
10739/// 
10740/// ```ruby
10741/// -> { it + it }
10742/// ^^^^^^^^^^^^^^
10743/// ```
10744pub struct ItParametersNode<'pr> {
10745    /// The pointer to the parser this node came from.
10746    parser: *const pm_parser_t,
10747
10748    /// The raw pointer to the node allocated by prism.
10749    pointer: *mut pm_it_parameters_node_t,
10750
10751    /// The marker to indicate the lifetime of the pointer.
10752    marker: PhantomData<&'pr mut pm_it_parameters_node_t>
10753}
10754
10755impl<'pr> ItParametersNode<'pr> {
10756    /// Converts this node to a generic node.
10757    #[must_use]
10758    pub const fn as_node(&self) -> Node<'pr> {
10759        Node::ItParametersNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10760    }
10761
10762    /// Returns the location of this node.
10763    #[must_use]
10764    pub fn location(&self) -> Location<'pr> {
10765        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10766        Location::new(self.parser, unsafe { &(*pointer) })
10767    }
10768
10769    /// Returns the flags of this node.
10770    #[must_use]
10771    pub fn flags(&self) -> pm_node_flags_t {
10772        unsafe { (*self.pointer).base.flags }
10773    }
10774}
10775
10776impl std::fmt::Debug for ItParametersNode<'_> {
10777    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10778        write!(f, "ItParametersNode()")
10779    }
10780}
10781
10782/// Represents a hash literal without opening and closing braces.
10783/// 
10784/// ```ruby
10785/// foo(a: b)
10786///     ^^^^
10787/// ```
10788pub struct KeywordHashNode<'pr> {
10789    /// The pointer to the parser this node came from.
10790    parser: *const pm_parser_t,
10791
10792    /// The raw pointer to the node allocated by prism.
10793    pointer: *mut pm_keyword_hash_node_t,
10794
10795    /// The marker to indicate the lifetime of the pointer.
10796    marker: PhantomData<&'pr mut pm_keyword_hash_node_t>
10797}
10798
10799impl<'pr> KeywordHashNode<'pr> {
10800    /// Converts this node to a generic node.
10801    #[must_use]
10802    pub const fn as_node(&self) -> Node<'pr> {
10803        Node::KeywordHashNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10804    }
10805
10806    /// Returns the location of this node.
10807    #[must_use]
10808    pub fn location(&self) -> Location<'pr> {
10809        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10810        Location::new(self.parser, unsafe { &(*pointer) })
10811    }
10812
10813    /// Returns the flags of this node.
10814    #[must_use]
10815    pub fn flags(&self) -> pm_node_flags_t {
10816        unsafe { (*self.pointer).base.flags }
10817    }
10818
10819    /// a keyword hash which only has `AssocNode` elements all with symbol keys, which means the elements can be treated as keyword arguments
10820    #[must_use]
10821    pub fn is_symbol_keys(&self) -> bool {
10822        (self.flags() & PM_KEYWORD_HASH_NODE_FLAGS_SYMBOL_KEYS) != 0
10823    }
10824
10825    /// Returns the `elements` param
10826    #[must_use]
10827    pub fn elements(&self) -> NodeList<'pr> {
10828        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).elements };
10829        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10830    }
10831}
10832
10833impl std::fmt::Debug for KeywordHashNode<'_> {
10834    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10835        write!(f, "KeywordHashNode({:?})", self.elements())
10836    }
10837}
10838
10839/// Represents a keyword rest parameter to a method, block, or lambda definition.
10840/// 
10841/// ```ruby
10842/// def a(**b)
10843///       ^^^
10844/// end
10845/// ```
10846pub struct KeywordRestParameterNode<'pr> {
10847    /// The pointer to the parser this node came from.
10848    parser: *const pm_parser_t,
10849
10850    /// The raw pointer to the node allocated by prism.
10851    pointer: *mut pm_keyword_rest_parameter_node_t,
10852
10853    /// The marker to indicate the lifetime of the pointer.
10854    marker: PhantomData<&'pr mut pm_keyword_rest_parameter_node_t>
10855}
10856
10857impl<'pr> KeywordRestParameterNode<'pr> {
10858    /// Converts this node to a generic node.
10859    #[must_use]
10860    pub const fn as_node(&self) -> Node<'pr> {
10861        Node::KeywordRestParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10862    }
10863
10864    /// Returns the location of this node.
10865    #[must_use]
10866    pub fn location(&self) -> Location<'pr> {
10867        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10868        Location::new(self.parser, unsafe { &(*pointer) })
10869    }
10870
10871    /// Returns the flags of this node.
10872    #[must_use]
10873    pub fn flags(&self) -> pm_node_flags_t {
10874        unsafe { (*self.pointer).base.flags }
10875    }
10876
10877    /// a parameter name that has been repeated in the method signature
10878    #[must_use]
10879    pub fn is_repeated_parameter(&self) -> bool {
10880        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
10881    }
10882
10883    /// Returns the `name` param
10884    #[must_use]
10885    pub fn name(&self) -> Option<ConstantId<'pr>> {
10886        let id = unsafe { (*self.pointer).name };
10887        if id == 0 {
10888            None
10889        } else {
10890            Some(ConstantId::new(self.parser, id))
10891        }
10892    }
10893
10894    /// Returns the `name_loc` param
10895    #[must_use]
10896    pub fn name_loc(&self) -> Option<Location<'pr>> {
10897        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
10898        let length = unsafe { (*pointer).length };
10899        if length == 0 {
10900            None
10901        } else {
10902            Some(Location::new(self.parser, unsafe { &(*pointer) }))
10903        }
10904    }
10905
10906    /// Returns the `operator_loc` param
10907    #[must_use]
10908    pub fn operator_loc(&self) -> Location<'pr> {
10909        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
10910        Location::new(self.parser, unsafe { &(*pointer) })
10911    }
10912}
10913
10914impl std::fmt::Debug for KeywordRestParameterNode<'_> {
10915    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10916        write!(f, "KeywordRestParameterNode({:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc())
10917    }
10918}
10919
10920/// Represents using a lambda literal (not the lambda method call).
10921/// 
10922/// ```ruby
10923/// ->(value) { value * 2 }
10924/// ^^^^^^^^^^^^^^^^^^^^^^^
10925/// ```
10926pub struct LambdaNode<'pr> {
10927    /// The pointer to the parser this node came from.
10928    parser: *const pm_parser_t,
10929
10930    /// The raw pointer to the node allocated by prism.
10931    pointer: *mut pm_lambda_node_t,
10932
10933    /// The marker to indicate the lifetime of the pointer.
10934    marker: PhantomData<&'pr mut pm_lambda_node_t>
10935}
10936
10937impl<'pr> LambdaNode<'pr> {
10938    /// Converts this node to a generic node.
10939    #[must_use]
10940    pub const fn as_node(&self) -> Node<'pr> {
10941        Node::LambdaNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
10942    }
10943
10944    /// Returns the location of this node.
10945    #[must_use]
10946    pub fn location(&self) -> Location<'pr> {
10947        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
10948        Location::new(self.parser, unsafe { &(*pointer) })
10949    }
10950
10951    /// Returns the flags of this node.
10952    #[must_use]
10953    pub fn flags(&self) -> pm_node_flags_t {
10954        unsafe { (*self.pointer).base.flags }
10955    }
10956
10957    /// Returns the `locals` param
10958    #[must_use]
10959    pub fn locals(&self) -> ConstantList<'pr> {
10960        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
10961        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
10962    }
10963
10964    /// Returns the `operator_loc` param
10965    #[must_use]
10966    pub fn operator_loc(&self) -> Location<'pr> {
10967        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
10968        Location::new(self.parser, unsafe { &(*pointer) })
10969    }
10970
10971    /// Returns the `opening_loc` param
10972    #[must_use]
10973    pub fn opening_loc(&self) -> Location<'pr> {
10974        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
10975        Location::new(self.parser, unsafe { &(*pointer) })
10976    }
10977
10978    /// Returns the `closing_loc` param
10979    #[must_use]
10980    pub fn closing_loc(&self) -> Location<'pr> {
10981        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
10982        Location::new(self.parser, unsafe { &(*pointer) })
10983    }
10984
10985    /// Returns the `parameters` param
10986    #[must_use]
10987    pub fn parameters(&self) -> Option<Node<'pr>> {
10988        let node: *mut pm_node_t = unsafe { (*self.pointer).parameters };
10989        if node.is_null() {
10990            None
10991        } else {
10992            Some(Node::new(self.parser, node))
10993        }
10994    }
10995
10996    /// Returns the `body` param
10997    #[must_use]
10998    pub fn body(&self) -> Option<Node<'pr>> {
10999        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
11000        if node.is_null() {
11001            None
11002        } else {
11003            Some(Node::new(self.parser, node))
11004        }
11005    }
11006}
11007
11008impl std::fmt::Debug for LambdaNode<'_> {
11009    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11010        write!(f, "LambdaNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.locals(), self.operator_loc(), self.opening_loc(), self.closing_loc(), self.parameters(), self.body())
11011    }
11012}
11013
11014/// Represents the use of the `&&=` operator for assignment to a local variable.
11015/// 
11016/// ```ruby
11017/// target &&= value
11018/// ^^^^^^^^^^^^^^^^
11019/// ```
11020pub struct LocalVariableAndWriteNode<'pr> {
11021    /// The pointer to the parser this node came from.
11022    parser: *const pm_parser_t,
11023
11024    /// The raw pointer to the node allocated by prism.
11025    pointer: *mut pm_local_variable_and_write_node_t,
11026
11027    /// The marker to indicate the lifetime of the pointer.
11028    marker: PhantomData<&'pr mut pm_local_variable_and_write_node_t>
11029}
11030
11031impl<'pr> LocalVariableAndWriteNode<'pr> {
11032    /// Converts this node to a generic node.
11033    #[must_use]
11034    pub const fn as_node(&self) -> Node<'pr> {
11035        Node::LocalVariableAndWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11036    }
11037
11038    /// Returns the location of this node.
11039    #[must_use]
11040    pub fn location(&self) -> Location<'pr> {
11041        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11042        Location::new(self.parser, unsafe { &(*pointer) })
11043    }
11044
11045    /// Returns the flags of this node.
11046    #[must_use]
11047    pub fn flags(&self) -> pm_node_flags_t {
11048        unsafe { (*self.pointer).base.flags }
11049    }
11050
11051    /// Returns the `name_loc` param
11052    #[must_use]
11053    pub fn name_loc(&self) -> Location<'pr> {
11054        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
11055        Location::new(self.parser, unsafe { &(*pointer) })
11056    }
11057
11058    /// Returns the `operator_loc` param
11059    #[must_use]
11060    pub fn operator_loc(&self) -> Location<'pr> {
11061        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
11062        Location::new(self.parser, unsafe { &(*pointer) })
11063    }
11064
11065    /// Returns the `value` param
11066    #[must_use]
11067    pub fn value(&self) -> Node<'pr> {
11068        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
11069        Node::new(self.parser, node)
11070    }
11071
11072    /// Returns the `name` param
11073    #[must_use]
11074    pub fn name(&self) -> ConstantId<'pr> {
11075        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11076    }
11077
11078    /// Returns the `depth` param
11079    #[must_use]
11080    pub fn depth(&self) -> u32 {
11081        unsafe { (*self.pointer).depth }
11082    }
11083}
11084
11085impl std::fmt::Debug for LocalVariableAndWriteNode<'_> {
11086    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11087        write!(f, "LocalVariableAndWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name_loc(), self.operator_loc(), self.value(), self.name(), self.depth())
11088    }
11089}
11090
11091/// Represents assigning to a local variable using an operator that isn't `=`.
11092/// 
11093/// ```ruby
11094/// target += value
11095/// ^^^^^^^^^^^^^^^
11096/// ```
11097pub struct LocalVariableOperatorWriteNode<'pr> {
11098    /// The pointer to the parser this node came from.
11099    parser: *const pm_parser_t,
11100
11101    /// The raw pointer to the node allocated by prism.
11102    pointer: *mut pm_local_variable_operator_write_node_t,
11103
11104    /// The marker to indicate the lifetime of the pointer.
11105    marker: PhantomData<&'pr mut pm_local_variable_operator_write_node_t>
11106}
11107
11108impl<'pr> LocalVariableOperatorWriteNode<'pr> {
11109    /// Converts this node to a generic node.
11110    #[must_use]
11111    pub const fn as_node(&self) -> Node<'pr> {
11112        Node::LocalVariableOperatorWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11113    }
11114
11115    /// Returns the location of this node.
11116    #[must_use]
11117    pub fn location(&self) -> Location<'pr> {
11118        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11119        Location::new(self.parser, unsafe { &(*pointer) })
11120    }
11121
11122    /// Returns the flags of this node.
11123    #[must_use]
11124    pub fn flags(&self) -> pm_node_flags_t {
11125        unsafe { (*self.pointer).base.flags }
11126    }
11127
11128    /// Returns the `name_loc` param
11129    #[must_use]
11130    pub fn name_loc(&self) -> Location<'pr> {
11131        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
11132        Location::new(self.parser, unsafe { &(*pointer) })
11133    }
11134
11135    /// Returns the `binary_operator_loc` param
11136    #[must_use]
11137    pub fn binary_operator_loc(&self) -> Location<'pr> {
11138        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).binary_operator_loc };
11139        Location::new(self.parser, unsafe { &(*pointer) })
11140    }
11141
11142    /// Returns the `value` param
11143    #[must_use]
11144    pub fn value(&self) -> Node<'pr> {
11145        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
11146        Node::new(self.parser, node)
11147    }
11148
11149    /// Returns the `name` param
11150    #[must_use]
11151    pub fn name(&self) -> ConstantId<'pr> {
11152        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11153    }
11154
11155    /// Returns the `binary_operator` param
11156    #[must_use]
11157    pub fn binary_operator(&self) -> ConstantId<'pr> {
11158        ConstantId::new(self.parser, unsafe { (*self.pointer).binary_operator })
11159    }
11160
11161    /// Returns the `depth` param
11162    #[must_use]
11163    pub fn depth(&self) -> u32 {
11164        unsafe { (*self.pointer).depth }
11165    }
11166}
11167
11168impl std::fmt::Debug for LocalVariableOperatorWriteNode<'_> {
11169    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11170        write!(f, "LocalVariableOperatorWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.name_loc(), self.binary_operator_loc(), self.value(), self.name(), self.binary_operator(), self.depth())
11171    }
11172}
11173
11174/// Represents the use of the `||=` operator for assignment to a local variable.
11175/// 
11176/// ```ruby
11177/// target ||= value
11178/// ^^^^^^^^^^^^^^^^
11179/// ```
11180pub struct LocalVariableOrWriteNode<'pr> {
11181    /// The pointer to the parser this node came from.
11182    parser: *const pm_parser_t,
11183
11184    /// The raw pointer to the node allocated by prism.
11185    pointer: *mut pm_local_variable_or_write_node_t,
11186
11187    /// The marker to indicate the lifetime of the pointer.
11188    marker: PhantomData<&'pr mut pm_local_variable_or_write_node_t>
11189}
11190
11191impl<'pr> LocalVariableOrWriteNode<'pr> {
11192    /// Converts this node to a generic node.
11193    #[must_use]
11194    pub const fn as_node(&self) -> Node<'pr> {
11195        Node::LocalVariableOrWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11196    }
11197
11198    /// Returns the location of this node.
11199    #[must_use]
11200    pub fn location(&self) -> Location<'pr> {
11201        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11202        Location::new(self.parser, unsafe { &(*pointer) })
11203    }
11204
11205    /// Returns the flags of this node.
11206    #[must_use]
11207    pub fn flags(&self) -> pm_node_flags_t {
11208        unsafe { (*self.pointer).base.flags }
11209    }
11210
11211    /// Returns the `name_loc` param
11212    #[must_use]
11213    pub fn name_loc(&self) -> Location<'pr> {
11214        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
11215        Location::new(self.parser, unsafe { &(*pointer) })
11216    }
11217
11218    /// Returns the `operator_loc` param
11219    #[must_use]
11220    pub fn operator_loc(&self) -> Location<'pr> {
11221        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
11222        Location::new(self.parser, unsafe { &(*pointer) })
11223    }
11224
11225    /// Returns the `value` param
11226    #[must_use]
11227    pub fn value(&self) -> Node<'pr> {
11228        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
11229        Node::new(self.parser, node)
11230    }
11231
11232    /// Returns the `name` param
11233    #[must_use]
11234    pub fn name(&self) -> ConstantId<'pr> {
11235        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11236    }
11237
11238    /// Returns the `depth` param
11239    #[must_use]
11240    pub fn depth(&self) -> u32 {
11241        unsafe { (*self.pointer).depth }
11242    }
11243}
11244
11245impl std::fmt::Debug for LocalVariableOrWriteNode<'_> {
11246    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11247        write!(f, "LocalVariableOrWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name_loc(), self.operator_loc(), self.value(), self.name(), self.depth())
11248    }
11249}
11250
11251/// Represents reading a local variable. Note that this requires that a local variable of the same name has already been written to in the same scope, otherwise it is parsed as a method call.
11252/// 
11253/// ```ruby
11254/// foo
11255/// ^^^
11256/// ```
11257pub struct LocalVariableReadNode<'pr> {
11258    /// The pointer to the parser this node came from.
11259    parser: *const pm_parser_t,
11260
11261    /// The raw pointer to the node allocated by prism.
11262    pointer: *mut pm_local_variable_read_node_t,
11263
11264    /// The marker to indicate the lifetime of the pointer.
11265    marker: PhantomData<&'pr mut pm_local_variable_read_node_t>
11266}
11267
11268impl<'pr> LocalVariableReadNode<'pr> {
11269    /// Converts this node to a generic node.
11270    #[must_use]
11271    pub const fn as_node(&self) -> Node<'pr> {
11272        Node::LocalVariableReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11273    }
11274
11275    /// Returns the location of this node.
11276    #[must_use]
11277    pub fn location(&self) -> Location<'pr> {
11278        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11279        Location::new(self.parser, unsafe { &(*pointer) })
11280    }
11281
11282    /// Returns the flags of this node.
11283    #[must_use]
11284    pub fn flags(&self) -> pm_node_flags_t {
11285        unsafe { (*self.pointer).base.flags }
11286    }
11287
11288    /// Returns the `name` param
11289    #[must_use]
11290    pub fn name(&self) -> ConstantId<'pr> {
11291        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11292    }
11293
11294    /// Returns the `depth` param
11295    #[must_use]
11296    pub fn depth(&self) -> u32 {
11297        unsafe { (*self.pointer).depth }
11298    }
11299}
11300
11301impl std::fmt::Debug for LocalVariableReadNode<'_> {
11302    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11303        write!(f, "LocalVariableReadNode({:?}, {:?})", self.name(), self.depth())
11304    }
11305}
11306
11307/// Represents writing to a local variable in a context that doesn't have an explicit value.
11308/// 
11309/// ```ruby
11310/// foo, bar = baz
11311/// ^^^  ^^^
11312/// ```
11313/// 
11314/// ```ruby
11315/// foo => baz
11316///        ^^^
11317/// ```
11318pub struct LocalVariableTargetNode<'pr> {
11319    /// The pointer to the parser this node came from.
11320    parser: *const pm_parser_t,
11321
11322    /// The raw pointer to the node allocated by prism.
11323    pointer: *mut pm_local_variable_target_node_t,
11324
11325    /// The marker to indicate the lifetime of the pointer.
11326    marker: PhantomData<&'pr mut pm_local_variable_target_node_t>
11327}
11328
11329impl<'pr> LocalVariableTargetNode<'pr> {
11330    /// Converts this node to a generic node.
11331    #[must_use]
11332    pub const fn as_node(&self) -> Node<'pr> {
11333        Node::LocalVariableTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11334    }
11335
11336    /// Returns the location of this node.
11337    #[must_use]
11338    pub fn location(&self) -> Location<'pr> {
11339        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11340        Location::new(self.parser, unsafe { &(*pointer) })
11341    }
11342
11343    /// Returns the flags of this node.
11344    #[must_use]
11345    pub fn flags(&self) -> pm_node_flags_t {
11346        unsafe { (*self.pointer).base.flags }
11347    }
11348
11349    /// Returns the `name` param
11350    #[must_use]
11351    pub fn name(&self) -> ConstantId<'pr> {
11352        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11353    }
11354
11355    /// Returns the `depth` param
11356    #[must_use]
11357    pub fn depth(&self) -> u32 {
11358        unsafe { (*self.pointer).depth }
11359    }
11360}
11361
11362impl std::fmt::Debug for LocalVariableTargetNode<'_> {
11363    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11364        write!(f, "LocalVariableTargetNode({:?}, {:?})", self.name(), self.depth())
11365    }
11366}
11367
11368/// Represents writing to a local variable.
11369/// 
11370/// ```ruby
11371/// foo = 1
11372/// ^^^^^^^
11373/// ```
11374pub struct LocalVariableWriteNode<'pr> {
11375    /// The pointer to the parser this node came from.
11376    parser: *const pm_parser_t,
11377
11378    /// The raw pointer to the node allocated by prism.
11379    pointer: *mut pm_local_variable_write_node_t,
11380
11381    /// The marker to indicate the lifetime of the pointer.
11382    marker: PhantomData<&'pr mut pm_local_variable_write_node_t>
11383}
11384
11385impl<'pr> LocalVariableWriteNode<'pr> {
11386    /// Converts this node to a generic node.
11387    #[must_use]
11388    pub const fn as_node(&self) -> Node<'pr> {
11389        Node::LocalVariableWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11390    }
11391
11392    /// Returns the location of this node.
11393    #[must_use]
11394    pub fn location(&self) -> Location<'pr> {
11395        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11396        Location::new(self.parser, unsafe { &(*pointer) })
11397    }
11398
11399    /// Returns the flags of this node.
11400    #[must_use]
11401    pub fn flags(&self) -> pm_node_flags_t {
11402        unsafe { (*self.pointer).base.flags }
11403    }
11404
11405    /// Returns the `name` param
11406    #[must_use]
11407    pub fn name(&self) -> ConstantId<'pr> {
11408        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11409    }
11410
11411    /// Returns the `depth` param
11412    #[must_use]
11413    pub fn depth(&self) -> u32 {
11414        unsafe { (*self.pointer).depth }
11415    }
11416
11417    /// Returns the `name_loc` param
11418    #[must_use]
11419    pub fn name_loc(&self) -> Location<'pr> {
11420        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
11421        Location::new(self.parser, unsafe { &(*pointer) })
11422    }
11423
11424    /// Returns the `value` param
11425    #[must_use]
11426    pub fn value(&self) -> Node<'pr> {
11427        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
11428        Node::new(self.parser, node)
11429    }
11430
11431    /// Returns the `operator_loc` param
11432    #[must_use]
11433    pub fn operator_loc(&self) -> Location<'pr> {
11434        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
11435        Location::new(self.parser, unsafe { &(*pointer) })
11436    }
11437}
11438
11439impl std::fmt::Debug for LocalVariableWriteNode<'_> {
11440    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11441        write!(f, "LocalVariableWriteNode({:?}, {:?}, {:?}, {:?}, {:?})", self.name(), self.depth(), self.name_loc(), self.value(), self.operator_loc())
11442    }
11443}
11444
11445/// Represents a regular expression literal used in the predicate of a conditional to implicitly match against the last line read by an IO object.
11446/// 
11447/// ```ruby
11448/// if /foo/i then end
11449///    ^^^^^^
11450/// ```
11451pub struct MatchLastLineNode<'pr> {
11452    /// The pointer to the parser this node came from.
11453    parser: *const pm_parser_t,
11454
11455    /// The raw pointer to the node allocated by prism.
11456    pointer: *mut pm_match_last_line_node_t,
11457
11458    /// The marker to indicate the lifetime of the pointer.
11459    marker: PhantomData<&'pr mut pm_match_last_line_node_t>
11460}
11461
11462impl<'pr> MatchLastLineNode<'pr> {
11463    /// Converts this node to a generic node.
11464    #[must_use]
11465    pub const fn as_node(&self) -> Node<'pr> {
11466        Node::MatchLastLineNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11467    }
11468
11469    /// Returns the location of this node.
11470    #[must_use]
11471    pub fn location(&self) -> Location<'pr> {
11472        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11473        Location::new(self.parser, unsafe { &(*pointer) })
11474    }
11475
11476    /// Returns the flags of this node.
11477    #[must_use]
11478    pub fn flags(&self) -> pm_node_flags_t {
11479        unsafe { (*self.pointer).base.flags }
11480    }
11481
11482    /// i - ignores the case of characters when matching
11483    #[must_use]
11484    pub fn is_ignore_case(&self) -> bool {
11485        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE) != 0
11486    }
11487
11488    /// x - ignores whitespace and allows comments in regular expressions
11489    #[must_use]
11490    pub fn is_extended(&self) -> bool {
11491        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EXTENDED) != 0
11492    }
11493
11494    /// m - allows $ to match the end of lines within strings
11495    #[must_use]
11496    pub fn is_multi_line(&self) -> bool {
11497        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE) != 0
11498    }
11499
11500    /// o - only interpolates values into the regular expression once
11501    #[must_use]
11502    pub fn is_once(&self) -> bool {
11503        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ONCE) != 0
11504    }
11505
11506    /// e - forces the EUC-JP encoding
11507    #[must_use]
11508    pub fn is_euc_jp(&self) -> bool {
11509        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EUC_JP) != 0
11510    }
11511
11512    /// n - forces the ASCII-8BIT encoding
11513    #[must_use]
11514    pub fn is_ascii_8bit(&self) -> bool {
11515        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT) != 0
11516    }
11517
11518    /// s - forces the Windows-31J encoding
11519    #[must_use]
11520    pub fn is_windows_31j(&self) -> bool {
11521        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J) != 0
11522    }
11523
11524    /// u - forces the UTF-8 encoding
11525    #[must_use]
11526    pub fn is_utf_8(&self) -> bool {
11527        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_UTF_8) != 0
11528    }
11529
11530    /// internal bytes forced the encoding to UTF-8
11531    #[must_use]
11532    pub fn is_forced_utf8_encoding(&self) -> bool {
11533        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING) != 0
11534    }
11535
11536    /// internal bytes forced the encoding to binary
11537    #[must_use]
11538    pub fn is_forced_binary_encoding(&self) -> bool {
11539        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING) != 0
11540    }
11541
11542    /// internal bytes forced the encoding to US-ASCII
11543    #[must_use]
11544    pub fn is_forced_us_ascii_encoding(&self) -> bool {
11545        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING) != 0
11546    }
11547
11548    /// Returns the `opening_loc` param
11549    #[must_use]
11550    pub fn opening_loc(&self) -> Location<'pr> {
11551        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
11552        Location::new(self.parser, unsafe { &(*pointer) })
11553    }
11554
11555    /// Returns the `content_loc` param
11556    #[must_use]
11557    pub fn content_loc(&self) -> Location<'pr> {
11558        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).content_loc };
11559        Location::new(self.parser, unsafe { &(*pointer) })
11560    }
11561
11562    /// Returns the `closing_loc` param
11563    #[must_use]
11564    pub fn closing_loc(&self) -> Location<'pr> {
11565        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
11566        Location::new(self.parser, unsafe { &(*pointer) })
11567    }
11568
11569    /// Returns the `unescaped` param
11570    #[must_use]
11571    pub fn unescaped(&self) -> &[u8] {
11572        unsafe {
11573            let source = (*self.pointer).unescaped.source;
11574            if source.is_null() {
11575                return &[];
11576            }
11577            let length = (*self.pointer).unescaped.length;
11578            std::slice::from_raw_parts(source, length)
11579        }
11580    }
11581}
11582
11583impl std::fmt::Debug for MatchLastLineNode<'_> {
11584    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11585        write!(f, "MatchLastLineNode({:?}, {:?}, {:?}, {:?})", self.opening_loc(), self.content_loc(), self.closing_loc(), self.unescaped())
11586    }
11587}
11588
11589/// Represents the use of the modifier `in` operator.
11590/// 
11591/// ```ruby
11592/// foo in bar
11593/// ^^^^^^^^^^
11594/// ```
11595pub struct MatchPredicateNode<'pr> {
11596    /// The pointer to the parser this node came from.
11597    parser: *const pm_parser_t,
11598
11599    /// The raw pointer to the node allocated by prism.
11600    pointer: *mut pm_match_predicate_node_t,
11601
11602    /// The marker to indicate the lifetime of the pointer.
11603    marker: PhantomData<&'pr mut pm_match_predicate_node_t>
11604}
11605
11606impl<'pr> MatchPredicateNode<'pr> {
11607    /// Converts this node to a generic node.
11608    #[must_use]
11609    pub const fn as_node(&self) -> Node<'pr> {
11610        Node::MatchPredicateNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11611    }
11612
11613    /// Returns the location of this node.
11614    #[must_use]
11615    pub fn location(&self) -> Location<'pr> {
11616        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11617        Location::new(self.parser, unsafe { &(*pointer) })
11618    }
11619
11620    /// Returns the flags of this node.
11621    #[must_use]
11622    pub fn flags(&self) -> pm_node_flags_t {
11623        unsafe { (*self.pointer).base.flags }
11624    }
11625
11626    /// Returns the `value` param
11627    #[must_use]
11628    pub fn value(&self) -> Node<'pr> {
11629        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
11630        Node::new(self.parser, node)
11631    }
11632
11633    /// Returns the `pattern` param
11634    #[must_use]
11635    pub fn pattern(&self) -> Node<'pr> {
11636        let node: *mut pm_node_t = unsafe { (*self.pointer).pattern };
11637        Node::new(self.parser, node)
11638    }
11639
11640    /// Returns the `operator_loc` param
11641    #[must_use]
11642    pub fn operator_loc(&self) -> Location<'pr> {
11643        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
11644        Location::new(self.parser, unsafe { &(*pointer) })
11645    }
11646}
11647
11648impl std::fmt::Debug for MatchPredicateNode<'_> {
11649    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11650        write!(f, "MatchPredicateNode({:?}, {:?}, {:?})", self.value(), self.pattern(), self.operator_loc())
11651    }
11652}
11653
11654/// Represents the use of the `=>` operator.
11655/// 
11656/// ```ruby
11657/// foo => bar
11658/// ^^^^^^^^^^
11659/// ```
11660pub struct MatchRequiredNode<'pr> {
11661    /// The pointer to the parser this node came from.
11662    parser: *const pm_parser_t,
11663
11664    /// The raw pointer to the node allocated by prism.
11665    pointer: *mut pm_match_required_node_t,
11666
11667    /// The marker to indicate the lifetime of the pointer.
11668    marker: PhantomData<&'pr mut pm_match_required_node_t>
11669}
11670
11671impl<'pr> MatchRequiredNode<'pr> {
11672    /// Converts this node to a generic node.
11673    #[must_use]
11674    pub const fn as_node(&self) -> Node<'pr> {
11675        Node::MatchRequiredNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11676    }
11677
11678    /// Returns the location of this node.
11679    #[must_use]
11680    pub fn location(&self) -> Location<'pr> {
11681        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11682        Location::new(self.parser, unsafe { &(*pointer) })
11683    }
11684
11685    /// Returns the flags of this node.
11686    #[must_use]
11687    pub fn flags(&self) -> pm_node_flags_t {
11688        unsafe { (*self.pointer).base.flags }
11689    }
11690
11691    /// Returns the `value` param
11692    #[must_use]
11693    pub fn value(&self) -> Node<'pr> {
11694        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
11695        Node::new(self.parser, node)
11696    }
11697
11698    /// Returns the `pattern` param
11699    #[must_use]
11700    pub fn pattern(&self) -> Node<'pr> {
11701        let node: *mut pm_node_t = unsafe { (*self.pointer).pattern };
11702        Node::new(self.parser, node)
11703    }
11704
11705    /// Returns the `operator_loc` param
11706    #[must_use]
11707    pub fn operator_loc(&self) -> Location<'pr> {
11708        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
11709        Location::new(self.parser, unsafe { &(*pointer) })
11710    }
11711}
11712
11713impl std::fmt::Debug for MatchRequiredNode<'_> {
11714    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11715        write!(f, "MatchRequiredNode({:?}, {:?}, {:?})", self.value(), self.pattern(), self.operator_loc())
11716    }
11717}
11718
11719/// Represents writing local variables using a regular expression match with named capture groups.
11720/// 
11721/// ```ruby
11722/// /(?<foo>bar)/ =~ baz
11723/// ^^^^^^^^^^^^^^^^^^^^
11724/// ```
11725pub struct MatchWriteNode<'pr> {
11726    /// The pointer to the parser this node came from.
11727    parser: *const pm_parser_t,
11728
11729    /// The raw pointer to the node allocated by prism.
11730    pointer: *mut pm_match_write_node_t,
11731
11732    /// The marker to indicate the lifetime of the pointer.
11733    marker: PhantomData<&'pr mut pm_match_write_node_t>
11734}
11735
11736impl<'pr> MatchWriteNode<'pr> {
11737    /// Converts this node to a generic node.
11738    #[must_use]
11739    pub const fn as_node(&self) -> Node<'pr> {
11740        Node::MatchWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11741    }
11742
11743    /// Returns the location of this node.
11744    #[must_use]
11745    pub fn location(&self) -> Location<'pr> {
11746        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11747        Location::new(self.parser, unsafe { &(*pointer) })
11748    }
11749
11750    /// Returns the flags of this node.
11751    #[must_use]
11752    pub fn flags(&self) -> pm_node_flags_t {
11753        unsafe { (*self.pointer).base.flags }
11754    }
11755
11756    /// Returns the `call` param
11757    #[must_use]
11758    pub fn call(&self) -> CallNode<'pr> {
11759        let node: *mut pm_call_node_t = unsafe { (*self.pointer).call };
11760        CallNode { parser: self.parser, pointer: node, marker: PhantomData }
11761    }
11762
11763    /// Returns the `targets` param
11764    #[must_use]
11765    pub fn targets(&self) -> NodeList<'pr> {
11766        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).targets };
11767        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
11768    }
11769}
11770
11771impl std::fmt::Debug for MatchWriteNode<'_> {
11772    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11773        write!(f, "MatchWriteNode({:?}, {:?})", self.call(), self.targets())
11774    }
11775}
11776
11777/// Represents a module declaration involving the `module` keyword.
11778/// 
11779/// ```ruby
11780/// module Foo end
11781/// ^^^^^^^^^^^^^^
11782/// ```
11783pub struct ModuleNode<'pr> {
11784    /// The pointer to the parser this node came from.
11785    parser: *const pm_parser_t,
11786
11787    /// The raw pointer to the node allocated by prism.
11788    pointer: *mut pm_module_node_t,
11789
11790    /// The marker to indicate the lifetime of the pointer.
11791    marker: PhantomData<&'pr mut pm_module_node_t>
11792}
11793
11794impl<'pr> ModuleNode<'pr> {
11795    /// Converts this node to a generic node.
11796    #[must_use]
11797    pub const fn as_node(&self) -> Node<'pr> {
11798        Node::ModuleNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11799    }
11800
11801    /// Returns the location of this node.
11802    #[must_use]
11803    pub fn location(&self) -> Location<'pr> {
11804        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11805        Location::new(self.parser, unsafe { &(*pointer) })
11806    }
11807
11808    /// Returns the flags of this node.
11809    #[must_use]
11810    pub fn flags(&self) -> pm_node_flags_t {
11811        unsafe { (*self.pointer).base.flags }
11812    }
11813
11814    /// Returns the `locals` param
11815    #[must_use]
11816    pub fn locals(&self) -> ConstantList<'pr> {
11817        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
11818        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
11819    }
11820
11821    /// Returns the `module_keyword_loc` param
11822    #[must_use]
11823    pub fn module_keyword_loc(&self) -> Location<'pr> {
11824        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).module_keyword_loc };
11825        Location::new(self.parser, unsafe { &(*pointer) })
11826    }
11827
11828    /// Returns the `constant_path` param
11829    #[must_use]
11830    pub fn constant_path(&self) -> Node<'pr> {
11831        let node: *mut pm_node_t = unsafe { (*self.pointer).constant_path };
11832        Node::new(self.parser, node)
11833    }
11834
11835    /// Returns the `body` param
11836    #[must_use]
11837    pub fn body(&self) -> Option<Node<'pr>> {
11838        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
11839        if node.is_null() {
11840            None
11841        } else {
11842            Some(Node::new(self.parser, node))
11843        }
11844    }
11845
11846    /// Returns the `end_keyword_loc` param
11847    #[must_use]
11848    pub fn end_keyword_loc(&self) -> Location<'pr> {
11849        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
11850        Location::new(self.parser, unsafe { &(*pointer) })
11851    }
11852
11853    /// Returns the `name` param
11854    #[must_use]
11855    pub fn name(&self) -> ConstantId<'pr> {
11856        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
11857    }
11858}
11859
11860impl std::fmt::Debug for ModuleNode<'_> {
11861    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11862        write!(f, "ModuleNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.locals(), self.module_keyword_loc(), self.constant_path(), self.body(), self.end_keyword_loc(), self.name())
11863    }
11864}
11865
11866/// Represents a multi-target expression.
11867/// 
11868/// ```ruby
11869/// a, (b, c) = 1, 2, 3
11870///    ^^^^^^
11871/// ```
11872/// 
11873/// This can be a part of `MultiWriteNode` as above, or the target of a `for` loop
11874/// 
11875/// ```ruby
11876/// for a, b in [[1, 2], [3, 4]]
11877///     ^^^^
11878/// ```
11879pub struct MultiTargetNode<'pr> {
11880    /// The pointer to the parser this node came from.
11881    parser: *const pm_parser_t,
11882
11883    /// The raw pointer to the node allocated by prism.
11884    pointer: *mut pm_multi_target_node_t,
11885
11886    /// The marker to indicate the lifetime of the pointer.
11887    marker: PhantomData<&'pr mut pm_multi_target_node_t>
11888}
11889
11890impl<'pr> MultiTargetNode<'pr> {
11891    /// Converts this node to a generic node.
11892    #[must_use]
11893    pub const fn as_node(&self) -> Node<'pr> {
11894        Node::MultiTargetNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11895    }
11896
11897    /// Returns the location of this node.
11898    #[must_use]
11899    pub fn location(&self) -> Location<'pr> {
11900        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11901        Location::new(self.parser, unsafe { &(*pointer) })
11902    }
11903
11904    /// Returns the flags of this node.
11905    #[must_use]
11906    pub fn flags(&self) -> pm_node_flags_t {
11907        unsafe { (*self.pointer).base.flags }
11908    }
11909
11910    /// Returns the `lefts` param
11911    #[must_use]
11912    pub fn lefts(&self) -> NodeList<'pr> {
11913        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).lefts };
11914        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
11915    }
11916
11917    /// Returns the `rest` param
11918    #[must_use]
11919    pub fn rest(&self) -> Option<Node<'pr>> {
11920        let node: *mut pm_node_t = unsafe { (*self.pointer).rest };
11921        if node.is_null() {
11922            None
11923        } else {
11924            Some(Node::new(self.parser, node))
11925        }
11926    }
11927
11928    /// Returns the `rights` param
11929    #[must_use]
11930    pub fn rights(&self) -> NodeList<'pr> {
11931        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).rights };
11932        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
11933    }
11934
11935    /// Returns the `lparen_loc` param
11936    #[must_use]
11937    pub fn lparen_loc(&self) -> Option<Location<'pr>> {
11938        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
11939        let length = unsafe { (*pointer).length };
11940        if length == 0 {
11941            None
11942        } else {
11943            Some(Location::new(self.parser, unsafe { &(*pointer) }))
11944        }
11945    }
11946
11947    /// Returns the `rparen_loc` param
11948    #[must_use]
11949    pub fn rparen_loc(&self) -> Option<Location<'pr>> {
11950        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
11951        let length = unsafe { (*pointer).length };
11952        if length == 0 {
11953            None
11954        } else {
11955            Some(Location::new(self.parser, unsafe { &(*pointer) }))
11956        }
11957    }
11958}
11959
11960impl std::fmt::Debug for MultiTargetNode<'_> {
11961    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11962        write!(f, "MultiTargetNode({:?}, {:?}, {:?}, {:?}, {:?})", self.lefts(), self.rest(), self.rights(), self.lparen_loc(), self.rparen_loc())
11963    }
11964}
11965
11966/// Represents a write to a multi-target expression.
11967/// 
11968/// ```ruby
11969/// a, b, c = 1, 2, 3
11970/// ^^^^^^^^^^^^^^^^^
11971/// ```
11972pub struct MultiWriteNode<'pr> {
11973    /// The pointer to the parser this node came from.
11974    parser: *const pm_parser_t,
11975
11976    /// The raw pointer to the node allocated by prism.
11977    pointer: *mut pm_multi_write_node_t,
11978
11979    /// The marker to indicate the lifetime of the pointer.
11980    marker: PhantomData<&'pr mut pm_multi_write_node_t>
11981}
11982
11983impl<'pr> MultiWriteNode<'pr> {
11984    /// Converts this node to a generic node.
11985    #[must_use]
11986    pub const fn as_node(&self) -> Node<'pr> {
11987        Node::MultiWriteNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
11988    }
11989
11990    /// Returns the location of this node.
11991    #[must_use]
11992    pub fn location(&self) -> Location<'pr> {
11993        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
11994        Location::new(self.parser, unsafe { &(*pointer) })
11995    }
11996
11997    /// Returns the flags of this node.
11998    #[must_use]
11999    pub fn flags(&self) -> pm_node_flags_t {
12000        unsafe { (*self.pointer).base.flags }
12001    }
12002
12003    /// Returns the `lefts` param
12004    #[must_use]
12005    pub fn lefts(&self) -> NodeList<'pr> {
12006        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).lefts };
12007        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
12008    }
12009
12010    /// Returns the `rest` param
12011    #[must_use]
12012    pub fn rest(&self) -> Option<Node<'pr>> {
12013        let node: *mut pm_node_t = unsafe { (*self.pointer).rest };
12014        if node.is_null() {
12015            None
12016        } else {
12017            Some(Node::new(self.parser, node))
12018        }
12019    }
12020
12021    /// Returns the `rights` param
12022    #[must_use]
12023    pub fn rights(&self) -> NodeList<'pr> {
12024        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).rights };
12025        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
12026    }
12027
12028    /// Returns the `lparen_loc` param
12029    #[must_use]
12030    pub fn lparen_loc(&self) -> Option<Location<'pr>> {
12031        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
12032        let length = unsafe { (*pointer).length };
12033        if length == 0 {
12034            None
12035        } else {
12036            Some(Location::new(self.parser, unsafe { &(*pointer) }))
12037        }
12038    }
12039
12040    /// Returns the `rparen_loc` param
12041    #[must_use]
12042    pub fn rparen_loc(&self) -> Option<Location<'pr>> {
12043        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
12044        let length = unsafe { (*pointer).length };
12045        if length == 0 {
12046            None
12047        } else {
12048            Some(Location::new(self.parser, unsafe { &(*pointer) }))
12049        }
12050    }
12051
12052    /// Returns the `operator_loc` param
12053    #[must_use]
12054    pub fn operator_loc(&self) -> Location<'pr> {
12055        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12056        Location::new(self.parser, unsafe { &(*pointer) })
12057    }
12058
12059    /// Returns the `value` param
12060    #[must_use]
12061    pub fn value(&self) -> Node<'pr> {
12062        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
12063        Node::new(self.parser, node)
12064    }
12065}
12066
12067impl std::fmt::Debug for MultiWriteNode<'_> {
12068    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12069        write!(f, "MultiWriteNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.lefts(), self.rest(), self.rights(), self.lparen_loc(), self.rparen_loc(), self.operator_loc(), self.value())
12070    }
12071}
12072
12073/// Represents the use of the `next` keyword.
12074/// 
12075/// ```ruby
12076/// next 1
12077/// ^^^^^^
12078/// ```
12079pub struct NextNode<'pr> {
12080    /// The pointer to the parser this node came from.
12081    parser: *const pm_parser_t,
12082
12083    /// The raw pointer to the node allocated by prism.
12084    pointer: *mut pm_next_node_t,
12085
12086    /// The marker to indicate the lifetime of the pointer.
12087    marker: PhantomData<&'pr mut pm_next_node_t>
12088}
12089
12090impl<'pr> NextNode<'pr> {
12091    /// Converts this node to a generic node.
12092    #[must_use]
12093    pub const fn as_node(&self) -> Node<'pr> {
12094        Node::NextNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12095    }
12096
12097    /// Returns the location of this node.
12098    #[must_use]
12099    pub fn location(&self) -> Location<'pr> {
12100        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12101        Location::new(self.parser, unsafe { &(*pointer) })
12102    }
12103
12104    /// Returns the flags of this node.
12105    #[must_use]
12106    pub fn flags(&self) -> pm_node_flags_t {
12107        unsafe { (*self.pointer).base.flags }
12108    }
12109
12110    /// Returns the `arguments` param
12111    #[must_use]
12112    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
12113        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
12114        if node.is_null() {
12115            None
12116        } else {
12117            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
12118        }
12119    }
12120
12121    /// Returns the `keyword_loc` param
12122    #[must_use]
12123    pub fn keyword_loc(&self) -> Location<'pr> {
12124        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
12125        Location::new(self.parser, unsafe { &(*pointer) })
12126    }
12127}
12128
12129impl std::fmt::Debug for NextNode<'_> {
12130    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12131        write!(f, "NextNode({:?}, {:?})", self.arguments(), self.keyword_loc())
12132    }
12133}
12134
12135/// Represents the use of the `nil` keyword.
12136/// 
12137/// ```ruby
12138/// nil
12139/// ^^^
12140/// ```
12141pub struct NilNode<'pr> {
12142    /// The pointer to the parser this node came from.
12143    parser: *const pm_parser_t,
12144
12145    /// The raw pointer to the node allocated by prism.
12146    pointer: *mut pm_nil_node_t,
12147
12148    /// The marker to indicate the lifetime of the pointer.
12149    marker: PhantomData<&'pr mut pm_nil_node_t>
12150}
12151
12152impl<'pr> NilNode<'pr> {
12153    /// Converts this node to a generic node.
12154    #[must_use]
12155    pub const fn as_node(&self) -> Node<'pr> {
12156        Node::NilNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12157    }
12158
12159    /// Returns the location of this node.
12160    #[must_use]
12161    pub fn location(&self) -> Location<'pr> {
12162        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12163        Location::new(self.parser, unsafe { &(*pointer) })
12164    }
12165
12166    /// Returns the flags of this node.
12167    #[must_use]
12168    pub fn flags(&self) -> pm_node_flags_t {
12169        unsafe { (*self.pointer).base.flags }
12170    }
12171}
12172
12173impl std::fmt::Debug for NilNode<'_> {
12174    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12175        write!(f, "NilNode()")
12176    }
12177}
12178
12179/// Represents the use of `&nil` inside method arguments.
12180/// 
12181/// ```ruby
12182/// def a(&nil)
12183///       ^^^^
12184/// end
12185/// ```
12186pub struct NoBlockParameterNode<'pr> {
12187    /// The pointer to the parser this node came from.
12188    parser: *const pm_parser_t,
12189
12190    /// The raw pointer to the node allocated by prism.
12191    pointer: *mut pm_no_block_parameter_node_t,
12192
12193    /// The marker to indicate the lifetime of the pointer.
12194    marker: PhantomData<&'pr mut pm_no_block_parameter_node_t>
12195}
12196
12197impl<'pr> NoBlockParameterNode<'pr> {
12198    /// Converts this node to a generic node.
12199    #[must_use]
12200    pub const fn as_node(&self) -> Node<'pr> {
12201        Node::NoBlockParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12202    }
12203
12204    /// Returns the location of this node.
12205    #[must_use]
12206    pub fn location(&self) -> Location<'pr> {
12207        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12208        Location::new(self.parser, unsafe { &(*pointer) })
12209    }
12210
12211    /// Returns the flags of this node.
12212    #[must_use]
12213    pub fn flags(&self) -> pm_node_flags_t {
12214        unsafe { (*self.pointer).base.flags }
12215    }
12216
12217    /// Returns the `operator_loc` param
12218    #[must_use]
12219    pub fn operator_loc(&self) -> Location<'pr> {
12220        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12221        Location::new(self.parser, unsafe { &(*pointer) })
12222    }
12223
12224    /// Returns the `keyword_loc` param
12225    #[must_use]
12226    pub fn keyword_loc(&self) -> Location<'pr> {
12227        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
12228        Location::new(self.parser, unsafe { &(*pointer) })
12229    }
12230}
12231
12232impl std::fmt::Debug for NoBlockParameterNode<'_> {
12233    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12234        write!(f, "NoBlockParameterNode({:?}, {:?})", self.operator_loc(), self.keyword_loc())
12235    }
12236}
12237
12238/// Represents the use of `**nil` inside method arguments.
12239/// 
12240/// ```ruby
12241/// def a(**nil)
12242///       ^^^^^
12243/// end
12244/// ```
12245pub struct NoKeywordsParameterNode<'pr> {
12246    /// The pointer to the parser this node came from.
12247    parser: *const pm_parser_t,
12248
12249    /// The raw pointer to the node allocated by prism.
12250    pointer: *mut pm_no_keywords_parameter_node_t,
12251
12252    /// The marker to indicate the lifetime of the pointer.
12253    marker: PhantomData<&'pr mut pm_no_keywords_parameter_node_t>
12254}
12255
12256impl<'pr> NoKeywordsParameterNode<'pr> {
12257    /// Converts this node to a generic node.
12258    #[must_use]
12259    pub const fn as_node(&self) -> Node<'pr> {
12260        Node::NoKeywordsParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12261    }
12262
12263    /// Returns the location of this node.
12264    #[must_use]
12265    pub fn location(&self) -> Location<'pr> {
12266        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12267        Location::new(self.parser, unsafe { &(*pointer) })
12268    }
12269
12270    /// Returns the flags of this node.
12271    #[must_use]
12272    pub fn flags(&self) -> pm_node_flags_t {
12273        unsafe { (*self.pointer).base.flags }
12274    }
12275
12276    /// Returns the `operator_loc` param
12277    #[must_use]
12278    pub fn operator_loc(&self) -> Location<'pr> {
12279        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12280        Location::new(self.parser, unsafe { &(*pointer) })
12281    }
12282
12283    /// Returns the `keyword_loc` param
12284    #[must_use]
12285    pub fn keyword_loc(&self) -> Location<'pr> {
12286        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
12287        Location::new(self.parser, unsafe { &(*pointer) })
12288    }
12289}
12290
12291impl std::fmt::Debug for NoKeywordsParameterNode<'_> {
12292    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12293        write!(f, "NoKeywordsParameterNode({:?}, {:?})", self.operator_loc(), self.keyword_loc())
12294    }
12295}
12296
12297/// Represents an implicit set of parameters through the use of numbered parameters within a block or lambda.
12298/// 
12299/// ```ruby
12300/// -> { _1 + _2 }
12301/// ^^^^^^^^^^^^^^
12302/// ```
12303pub struct NumberedParametersNode<'pr> {
12304    /// The pointer to the parser this node came from.
12305    parser: *const pm_parser_t,
12306
12307    /// The raw pointer to the node allocated by prism.
12308    pointer: *mut pm_numbered_parameters_node_t,
12309
12310    /// The marker to indicate the lifetime of the pointer.
12311    marker: PhantomData<&'pr mut pm_numbered_parameters_node_t>
12312}
12313
12314impl<'pr> NumberedParametersNode<'pr> {
12315    /// Converts this node to a generic node.
12316    #[must_use]
12317    pub const fn as_node(&self) -> Node<'pr> {
12318        Node::NumberedParametersNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12319    }
12320
12321    /// Returns the location of this node.
12322    #[must_use]
12323    pub fn location(&self) -> Location<'pr> {
12324        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12325        Location::new(self.parser, unsafe { &(*pointer) })
12326    }
12327
12328    /// Returns the flags of this node.
12329    #[must_use]
12330    pub fn flags(&self) -> pm_node_flags_t {
12331        unsafe { (*self.pointer).base.flags }
12332    }
12333
12334    /// Returns the `maximum` param
12335    #[must_use]
12336    pub fn maximum(&self) -> u8 {
12337        unsafe { (*self.pointer).maximum }
12338    }
12339}
12340
12341impl std::fmt::Debug for NumberedParametersNode<'_> {
12342    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12343        write!(f, "NumberedParametersNode({:?})", self.maximum())
12344    }
12345}
12346
12347/// Represents reading a numbered reference to a capture in the previous match.
12348/// 
12349/// ```ruby
12350/// $1
12351/// ^^
12352/// ```
12353pub struct NumberedReferenceReadNode<'pr> {
12354    /// The pointer to the parser this node came from.
12355    parser: *const pm_parser_t,
12356
12357    /// The raw pointer to the node allocated by prism.
12358    pointer: *mut pm_numbered_reference_read_node_t,
12359
12360    /// The marker to indicate the lifetime of the pointer.
12361    marker: PhantomData<&'pr mut pm_numbered_reference_read_node_t>
12362}
12363
12364impl<'pr> NumberedReferenceReadNode<'pr> {
12365    /// Converts this node to a generic node.
12366    #[must_use]
12367    pub const fn as_node(&self) -> Node<'pr> {
12368        Node::NumberedReferenceReadNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12369    }
12370
12371    /// Returns the location of this node.
12372    #[must_use]
12373    pub fn location(&self) -> Location<'pr> {
12374        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12375        Location::new(self.parser, unsafe { &(*pointer) })
12376    }
12377
12378    /// Returns the flags of this node.
12379    #[must_use]
12380    pub fn flags(&self) -> pm_node_flags_t {
12381        unsafe { (*self.pointer).base.flags }
12382    }
12383
12384    /// Returns the `number` param
12385    #[must_use]
12386    pub fn number(&self) -> u32 {
12387        unsafe { (*self.pointer).number }
12388    }
12389}
12390
12391impl std::fmt::Debug for NumberedReferenceReadNode<'_> {
12392    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12393        write!(f, "NumberedReferenceReadNode({:?})", self.number())
12394    }
12395}
12396
12397/// Represents an optional keyword parameter to a method, block, or lambda definition.
12398/// 
12399/// ```ruby
12400/// def a(b: 1)
12401///       ^^^^
12402/// end
12403/// ```
12404pub struct OptionalKeywordParameterNode<'pr> {
12405    /// The pointer to the parser this node came from.
12406    parser: *const pm_parser_t,
12407
12408    /// The raw pointer to the node allocated by prism.
12409    pointer: *mut pm_optional_keyword_parameter_node_t,
12410
12411    /// The marker to indicate the lifetime of the pointer.
12412    marker: PhantomData<&'pr mut pm_optional_keyword_parameter_node_t>
12413}
12414
12415impl<'pr> OptionalKeywordParameterNode<'pr> {
12416    /// Converts this node to a generic node.
12417    #[must_use]
12418    pub const fn as_node(&self) -> Node<'pr> {
12419        Node::OptionalKeywordParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12420    }
12421
12422    /// Returns the location of this node.
12423    #[must_use]
12424    pub fn location(&self) -> Location<'pr> {
12425        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12426        Location::new(self.parser, unsafe { &(*pointer) })
12427    }
12428
12429    /// Returns the flags of this node.
12430    #[must_use]
12431    pub fn flags(&self) -> pm_node_flags_t {
12432        unsafe { (*self.pointer).base.flags }
12433    }
12434
12435    /// a parameter name that has been repeated in the method signature
12436    #[must_use]
12437    pub fn is_repeated_parameter(&self) -> bool {
12438        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
12439    }
12440
12441    /// Returns the `name` param
12442    #[must_use]
12443    pub fn name(&self) -> ConstantId<'pr> {
12444        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
12445    }
12446
12447    /// Returns the `name_loc` param
12448    #[must_use]
12449    pub fn name_loc(&self) -> Location<'pr> {
12450        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
12451        Location::new(self.parser, unsafe { &(*pointer) })
12452    }
12453
12454    /// Returns the `value` param
12455    #[must_use]
12456    pub fn value(&self) -> Node<'pr> {
12457        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
12458        Node::new(self.parser, node)
12459    }
12460}
12461
12462impl std::fmt::Debug for OptionalKeywordParameterNode<'_> {
12463    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12464        write!(f, "OptionalKeywordParameterNode({:?}, {:?}, {:?})", self.name(), self.name_loc(), self.value())
12465    }
12466}
12467
12468/// Represents an optional parameter to a method, block, or lambda definition.
12469/// 
12470/// ```ruby
12471/// def a(b = 1)
12472///       ^^^^^
12473/// end
12474/// ```
12475pub struct OptionalParameterNode<'pr> {
12476    /// The pointer to the parser this node came from.
12477    parser: *const pm_parser_t,
12478
12479    /// The raw pointer to the node allocated by prism.
12480    pointer: *mut pm_optional_parameter_node_t,
12481
12482    /// The marker to indicate the lifetime of the pointer.
12483    marker: PhantomData<&'pr mut pm_optional_parameter_node_t>
12484}
12485
12486impl<'pr> OptionalParameterNode<'pr> {
12487    /// Converts this node to a generic node.
12488    #[must_use]
12489    pub const fn as_node(&self) -> Node<'pr> {
12490        Node::OptionalParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12491    }
12492
12493    /// Returns the location of this node.
12494    #[must_use]
12495    pub fn location(&self) -> Location<'pr> {
12496        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12497        Location::new(self.parser, unsafe { &(*pointer) })
12498    }
12499
12500    /// Returns the flags of this node.
12501    #[must_use]
12502    pub fn flags(&self) -> pm_node_flags_t {
12503        unsafe { (*self.pointer).base.flags }
12504    }
12505
12506    /// a parameter name that has been repeated in the method signature
12507    #[must_use]
12508    pub fn is_repeated_parameter(&self) -> bool {
12509        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
12510    }
12511
12512    /// Returns the `name` param
12513    #[must_use]
12514    pub fn name(&self) -> ConstantId<'pr> {
12515        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
12516    }
12517
12518    /// Returns the `name_loc` param
12519    #[must_use]
12520    pub fn name_loc(&self) -> Location<'pr> {
12521        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
12522        Location::new(self.parser, unsafe { &(*pointer) })
12523    }
12524
12525    /// Returns the `operator_loc` param
12526    #[must_use]
12527    pub fn operator_loc(&self) -> Location<'pr> {
12528        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12529        Location::new(self.parser, unsafe { &(*pointer) })
12530    }
12531
12532    /// Returns the `value` param
12533    #[must_use]
12534    pub fn value(&self) -> Node<'pr> {
12535        let node: *mut pm_node_t = unsafe { (*self.pointer).value };
12536        Node::new(self.parser, node)
12537    }
12538}
12539
12540impl std::fmt::Debug for OptionalParameterNode<'_> {
12541    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12542        write!(f, "OptionalParameterNode({:?}, {:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc(), self.value())
12543    }
12544}
12545
12546/// Represents the use of the `||` operator or the `or` keyword.
12547/// 
12548/// ```ruby
12549/// left or right
12550/// ^^^^^^^^^^^^^
12551/// ```
12552pub struct OrNode<'pr> {
12553    /// The pointer to the parser this node came from.
12554    parser: *const pm_parser_t,
12555
12556    /// The raw pointer to the node allocated by prism.
12557    pointer: *mut pm_or_node_t,
12558
12559    /// The marker to indicate the lifetime of the pointer.
12560    marker: PhantomData<&'pr mut pm_or_node_t>
12561}
12562
12563impl<'pr> OrNode<'pr> {
12564    /// Converts this node to a generic node.
12565    #[must_use]
12566    pub const fn as_node(&self) -> Node<'pr> {
12567        Node::OrNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12568    }
12569
12570    /// Returns the location of this node.
12571    #[must_use]
12572    pub fn location(&self) -> Location<'pr> {
12573        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12574        Location::new(self.parser, unsafe { &(*pointer) })
12575    }
12576
12577    /// Returns the flags of this node.
12578    #[must_use]
12579    pub fn flags(&self) -> pm_node_flags_t {
12580        unsafe { (*self.pointer).base.flags }
12581    }
12582
12583    /// Returns the `left` param
12584    #[must_use]
12585    pub fn left(&self) -> Node<'pr> {
12586        let node: *mut pm_node_t = unsafe { (*self.pointer).left };
12587        Node::new(self.parser, node)
12588    }
12589
12590    /// Returns the `right` param
12591    #[must_use]
12592    pub fn right(&self) -> Node<'pr> {
12593        let node: *mut pm_node_t = unsafe { (*self.pointer).right };
12594        Node::new(self.parser, node)
12595    }
12596
12597    /// Returns the `operator_loc` param
12598    #[must_use]
12599    pub fn operator_loc(&self) -> Location<'pr> {
12600        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12601        Location::new(self.parser, unsafe { &(*pointer) })
12602    }
12603}
12604
12605impl std::fmt::Debug for OrNode<'_> {
12606    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12607        write!(f, "OrNode({:?}, {:?}, {:?})", self.left(), self.right(), self.operator_loc())
12608    }
12609}
12610
12611/// Represents the list of parameters on a method, block, or lambda definition.
12612/// 
12613/// ```ruby
12614/// def a(b, c, d)
12615///       ^^^^^^^
12616/// end
12617/// ```
12618pub struct ParametersNode<'pr> {
12619    /// The pointer to the parser this node came from.
12620    parser: *const pm_parser_t,
12621
12622    /// The raw pointer to the node allocated by prism.
12623    pointer: *mut pm_parameters_node_t,
12624
12625    /// The marker to indicate the lifetime of the pointer.
12626    marker: PhantomData<&'pr mut pm_parameters_node_t>
12627}
12628
12629impl<'pr> ParametersNode<'pr> {
12630    /// Converts this node to a generic node.
12631    #[must_use]
12632    pub const fn as_node(&self) -> Node<'pr> {
12633        Node::ParametersNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12634    }
12635
12636    /// Returns the location of this node.
12637    #[must_use]
12638    pub fn location(&self) -> Location<'pr> {
12639        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12640        Location::new(self.parser, unsafe { &(*pointer) })
12641    }
12642
12643    /// Returns the flags of this node.
12644    #[must_use]
12645    pub fn flags(&self) -> pm_node_flags_t {
12646        unsafe { (*self.pointer).base.flags }
12647    }
12648
12649    /// Returns the `requireds` param
12650    #[must_use]
12651    pub fn requireds(&self) -> NodeList<'pr> {
12652        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).requireds };
12653        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
12654    }
12655
12656    /// Returns the `optionals` param
12657    #[must_use]
12658    pub fn optionals(&self) -> NodeList<'pr> {
12659        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).optionals };
12660        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
12661    }
12662
12663    /// Returns the `rest` param
12664    #[must_use]
12665    pub fn rest(&self) -> Option<Node<'pr>> {
12666        let node: *mut pm_node_t = unsafe { (*self.pointer).rest };
12667        if node.is_null() {
12668            None
12669        } else {
12670            Some(Node::new(self.parser, node))
12671        }
12672    }
12673
12674    /// Returns the `posts` param
12675    #[must_use]
12676    pub fn posts(&self) -> NodeList<'pr> {
12677        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).posts };
12678        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
12679    }
12680
12681    /// Returns the `keywords` param
12682    #[must_use]
12683    pub fn keywords(&self) -> NodeList<'pr> {
12684        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).keywords };
12685        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
12686    }
12687
12688    /// Returns the `keyword_rest` param
12689    #[must_use]
12690    pub fn keyword_rest(&self) -> Option<Node<'pr>> {
12691        let node: *mut pm_node_t = unsafe { (*self.pointer).keyword_rest };
12692        if node.is_null() {
12693            None
12694        } else {
12695            Some(Node::new(self.parser, node))
12696        }
12697    }
12698
12699    /// Returns the `block` param
12700    #[must_use]
12701    pub fn block(&self) -> Option<Node<'pr>> {
12702        let node: *mut pm_node_t = unsafe { (*self.pointer).block };
12703        if node.is_null() {
12704            None
12705        } else {
12706            Some(Node::new(self.parser, node))
12707        }
12708    }
12709}
12710
12711impl std::fmt::Debug for ParametersNode<'_> {
12712    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12713        write!(f, "ParametersNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.requireds(), self.optionals(), self.rest(), self.posts(), self.keywords(), self.keyword_rest(), self.block())
12714    }
12715}
12716
12717/// Represents a parenthesized expression
12718/// 
12719/// ```ruby
12720/// (10 + 34)
12721/// ^^^^^^^^^
12722/// ```
12723pub struct ParenthesesNode<'pr> {
12724    /// The pointer to the parser this node came from.
12725    parser: *const pm_parser_t,
12726
12727    /// The raw pointer to the node allocated by prism.
12728    pointer: *mut pm_parentheses_node_t,
12729
12730    /// The marker to indicate the lifetime of the pointer.
12731    marker: PhantomData<&'pr mut pm_parentheses_node_t>
12732}
12733
12734impl<'pr> ParenthesesNode<'pr> {
12735    /// Converts this node to a generic node.
12736    #[must_use]
12737    pub const fn as_node(&self) -> Node<'pr> {
12738        Node::ParenthesesNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12739    }
12740
12741    /// Returns the location of this node.
12742    #[must_use]
12743    pub fn location(&self) -> Location<'pr> {
12744        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12745        Location::new(self.parser, unsafe { &(*pointer) })
12746    }
12747
12748    /// Returns the flags of this node.
12749    #[must_use]
12750    pub fn flags(&self) -> pm_node_flags_t {
12751        unsafe { (*self.pointer).base.flags }
12752    }
12753
12754    /// parentheses that contain multiple potentially void statements
12755    #[must_use]
12756    pub fn is_multiple_statements(&self) -> bool {
12757        (self.flags() & PM_PARENTHESES_NODE_FLAGS_MULTIPLE_STATEMENTS) != 0
12758    }
12759
12760    /// Returns the `body` param
12761    #[must_use]
12762    pub fn body(&self) -> Option<Node<'pr>> {
12763        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
12764        if node.is_null() {
12765            None
12766        } else {
12767            Some(Node::new(self.parser, node))
12768        }
12769    }
12770
12771    /// Returns the `opening_loc` param
12772    #[must_use]
12773    pub fn opening_loc(&self) -> Location<'pr> {
12774        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
12775        Location::new(self.parser, unsafe { &(*pointer) })
12776    }
12777
12778    /// Returns the `closing_loc` param
12779    #[must_use]
12780    pub fn closing_loc(&self) -> Location<'pr> {
12781        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
12782        Location::new(self.parser, unsafe { &(*pointer) })
12783    }
12784}
12785
12786impl std::fmt::Debug for ParenthesesNode<'_> {
12787    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12788        write!(f, "ParenthesesNode({:?}, {:?}, {:?})", self.body(), self.opening_loc(), self.closing_loc())
12789    }
12790}
12791
12792/// Represents the use of the `^` operator for pinning an expression in a pattern matching expression.
12793/// 
12794/// ```ruby
12795/// foo in ^(bar)
12796///        ^^^^^^
12797/// ```
12798pub struct PinnedExpressionNode<'pr> {
12799    /// The pointer to the parser this node came from.
12800    parser: *const pm_parser_t,
12801
12802    /// The raw pointer to the node allocated by prism.
12803    pointer: *mut pm_pinned_expression_node_t,
12804
12805    /// The marker to indicate the lifetime of the pointer.
12806    marker: PhantomData<&'pr mut pm_pinned_expression_node_t>
12807}
12808
12809impl<'pr> PinnedExpressionNode<'pr> {
12810    /// Converts this node to a generic node.
12811    #[must_use]
12812    pub const fn as_node(&self) -> Node<'pr> {
12813        Node::PinnedExpressionNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12814    }
12815
12816    /// Returns the location of this node.
12817    #[must_use]
12818    pub fn location(&self) -> Location<'pr> {
12819        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12820        Location::new(self.parser, unsafe { &(*pointer) })
12821    }
12822
12823    /// Returns the flags of this node.
12824    #[must_use]
12825    pub fn flags(&self) -> pm_node_flags_t {
12826        unsafe { (*self.pointer).base.flags }
12827    }
12828
12829    /// Returns the `expression` param
12830    #[must_use]
12831    pub fn expression(&self) -> Node<'pr> {
12832        let node: *mut pm_node_t = unsafe { (*self.pointer).expression };
12833        Node::new(self.parser, node)
12834    }
12835
12836    /// Returns the `operator_loc` param
12837    #[must_use]
12838    pub fn operator_loc(&self) -> Location<'pr> {
12839        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12840        Location::new(self.parser, unsafe { &(*pointer) })
12841    }
12842
12843    /// Returns the `lparen_loc` param
12844    #[must_use]
12845    pub fn lparen_loc(&self) -> Location<'pr> {
12846        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
12847        Location::new(self.parser, unsafe { &(*pointer) })
12848    }
12849
12850    /// Returns the `rparen_loc` param
12851    #[must_use]
12852    pub fn rparen_loc(&self) -> Location<'pr> {
12853        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
12854        Location::new(self.parser, unsafe { &(*pointer) })
12855    }
12856}
12857
12858impl std::fmt::Debug for PinnedExpressionNode<'_> {
12859    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12860        write!(f, "PinnedExpressionNode({:?}, {:?}, {:?}, {:?})", self.expression(), self.operator_loc(), self.lparen_loc(), self.rparen_loc())
12861    }
12862}
12863
12864/// Represents the use of the `^` operator for pinning a variable in a pattern matching expression.
12865/// 
12866/// ```ruby
12867/// foo in ^bar
12868///        ^^^^
12869/// ```
12870pub struct PinnedVariableNode<'pr> {
12871    /// The pointer to the parser this node came from.
12872    parser: *const pm_parser_t,
12873
12874    /// The raw pointer to the node allocated by prism.
12875    pointer: *mut pm_pinned_variable_node_t,
12876
12877    /// The marker to indicate the lifetime of the pointer.
12878    marker: PhantomData<&'pr mut pm_pinned_variable_node_t>
12879}
12880
12881impl<'pr> PinnedVariableNode<'pr> {
12882    /// Converts this node to a generic node.
12883    #[must_use]
12884    pub const fn as_node(&self) -> Node<'pr> {
12885        Node::PinnedVariableNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12886    }
12887
12888    /// Returns the location of this node.
12889    #[must_use]
12890    pub fn location(&self) -> Location<'pr> {
12891        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12892        Location::new(self.parser, unsafe { &(*pointer) })
12893    }
12894
12895    /// Returns the flags of this node.
12896    #[must_use]
12897    pub fn flags(&self) -> pm_node_flags_t {
12898        unsafe { (*self.pointer).base.flags }
12899    }
12900
12901    /// Returns the `variable` param
12902    #[must_use]
12903    pub fn variable(&self) -> Node<'pr> {
12904        let node: *mut pm_node_t = unsafe { (*self.pointer).variable };
12905        Node::new(self.parser, node)
12906    }
12907
12908    /// Returns the `operator_loc` param
12909    #[must_use]
12910    pub fn operator_loc(&self) -> Location<'pr> {
12911        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
12912        Location::new(self.parser, unsafe { &(*pointer) })
12913    }
12914}
12915
12916impl std::fmt::Debug for PinnedVariableNode<'_> {
12917    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12918        write!(f, "PinnedVariableNode({:?}, {:?})", self.variable(), self.operator_loc())
12919    }
12920}
12921
12922/// Represents the use of the `END` keyword.
12923/// 
12924/// ```ruby
12925/// END { foo }
12926/// ^^^^^^^^^^^
12927/// ```
12928pub struct PostExecutionNode<'pr> {
12929    /// The pointer to the parser this node came from.
12930    parser: *const pm_parser_t,
12931
12932    /// The raw pointer to the node allocated by prism.
12933    pointer: *mut pm_post_execution_node_t,
12934
12935    /// The marker to indicate the lifetime of the pointer.
12936    marker: PhantomData<&'pr mut pm_post_execution_node_t>
12937}
12938
12939impl<'pr> PostExecutionNode<'pr> {
12940    /// Converts this node to a generic node.
12941    #[must_use]
12942    pub const fn as_node(&self) -> Node<'pr> {
12943        Node::PostExecutionNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
12944    }
12945
12946    /// Returns the location of this node.
12947    #[must_use]
12948    pub fn location(&self) -> Location<'pr> {
12949        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
12950        Location::new(self.parser, unsafe { &(*pointer) })
12951    }
12952
12953    /// Returns the flags of this node.
12954    #[must_use]
12955    pub fn flags(&self) -> pm_node_flags_t {
12956        unsafe { (*self.pointer).base.flags }
12957    }
12958
12959    /// Returns the `statements` param
12960    #[must_use]
12961    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
12962        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
12963        if node.is_null() {
12964            None
12965        } else {
12966            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
12967        }
12968    }
12969
12970    /// Returns the `keyword_loc` param
12971    #[must_use]
12972    pub fn keyword_loc(&self) -> Location<'pr> {
12973        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
12974        Location::new(self.parser, unsafe { &(*pointer) })
12975    }
12976
12977    /// Returns the `opening_loc` param
12978    #[must_use]
12979    pub fn opening_loc(&self) -> Location<'pr> {
12980        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
12981        Location::new(self.parser, unsafe { &(*pointer) })
12982    }
12983
12984    /// Returns the `closing_loc` param
12985    #[must_use]
12986    pub fn closing_loc(&self) -> Location<'pr> {
12987        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
12988        Location::new(self.parser, unsafe { &(*pointer) })
12989    }
12990}
12991
12992impl std::fmt::Debug for PostExecutionNode<'_> {
12993    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12994        write!(f, "PostExecutionNode({:?}, {:?}, {:?}, {:?})", self.statements(), self.keyword_loc(), self.opening_loc(), self.closing_loc())
12995    }
12996}
12997
12998/// Represents the use of the `BEGIN` keyword.
12999/// 
13000/// ```ruby
13001/// BEGIN { foo }
13002/// ^^^^^^^^^^^^^
13003/// ```
13004pub struct PreExecutionNode<'pr> {
13005    /// The pointer to the parser this node came from.
13006    parser: *const pm_parser_t,
13007
13008    /// The raw pointer to the node allocated by prism.
13009    pointer: *mut pm_pre_execution_node_t,
13010
13011    /// The marker to indicate the lifetime of the pointer.
13012    marker: PhantomData<&'pr mut pm_pre_execution_node_t>
13013}
13014
13015impl<'pr> PreExecutionNode<'pr> {
13016    /// Converts this node to a generic node.
13017    #[must_use]
13018    pub const fn as_node(&self) -> Node<'pr> {
13019        Node::PreExecutionNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13020    }
13021
13022    /// Returns the location of this node.
13023    #[must_use]
13024    pub fn location(&self) -> Location<'pr> {
13025        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13026        Location::new(self.parser, unsafe { &(*pointer) })
13027    }
13028
13029    /// Returns the flags of this node.
13030    #[must_use]
13031    pub fn flags(&self) -> pm_node_flags_t {
13032        unsafe { (*self.pointer).base.flags }
13033    }
13034
13035    /// Returns the `statements` param
13036    #[must_use]
13037    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
13038        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
13039        if node.is_null() {
13040            None
13041        } else {
13042            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
13043        }
13044    }
13045
13046    /// Returns the `keyword_loc` param
13047    #[must_use]
13048    pub fn keyword_loc(&self) -> Location<'pr> {
13049        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
13050        Location::new(self.parser, unsafe { &(*pointer) })
13051    }
13052
13053    /// Returns the `opening_loc` param
13054    #[must_use]
13055    pub fn opening_loc(&self) -> Location<'pr> {
13056        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
13057        Location::new(self.parser, unsafe { &(*pointer) })
13058    }
13059
13060    /// Returns the `closing_loc` param
13061    #[must_use]
13062    pub fn closing_loc(&self) -> Location<'pr> {
13063        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
13064        Location::new(self.parser, unsafe { &(*pointer) })
13065    }
13066}
13067
13068impl std::fmt::Debug for PreExecutionNode<'_> {
13069    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13070        write!(f, "PreExecutionNode({:?}, {:?}, {:?}, {:?})", self.statements(), self.keyword_loc(), self.opening_loc(), self.closing_loc())
13071    }
13072}
13073
13074/// The top level node of any parse tree.
13075pub struct ProgramNode<'pr> {
13076    /// The pointer to the parser this node came from.
13077    parser: *const pm_parser_t,
13078
13079    /// The raw pointer to the node allocated by prism.
13080    pointer: *mut pm_program_node_t,
13081
13082    /// The marker to indicate the lifetime of the pointer.
13083    marker: PhantomData<&'pr mut pm_program_node_t>
13084}
13085
13086impl<'pr> ProgramNode<'pr> {
13087    /// Converts this node to a generic node.
13088    #[must_use]
13089    pub const fn as_node(&self) -> Node<'pr> {
13090        Node::ProgramNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13091    }
13092
13093    /// Returns the location of this node.
13094    #[must_use]
13095    pub fn location(&self) -> Location<'pr> {
13096        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13097        Location::new(self.parser, unsafe { &(*pointer) })
13098    }
13099
13100    /// Returns the flags of this node.
13101    #[must_use]
13102    pub fn flags(&self) -> pm_node_flags_t {
13103        unsafe { (*self.pointer).base.flags }
13104    }
13105
13106    /// Returns the `locals` param
13107    #[must_use]
13108    pub fn locals(&self) -> ConstantList<'pr> {
13109        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
13110        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
13111    }
13112
13113    /// Returns the `statements` param
13114    #[must_use]
13115    pub fn statements(&self) -> StatementsNode<'pr> {
13116        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
13117        StatementsNode { parser: self.parser, pointer: node, marker: PhantomData }
13118    }
13119}
13120
13121impl std::fmt::Debug for ProgramNode<'_> {
13122    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13123        write!(f, "ProgramNode({:?}, {:?})", self.locals(), self.statements())
13124    }
13125}
13126
13127/// Represents the use of the `..` or `...` operators.
13128/// 
13129/// ```ruby
13130/// 1..2
13131/// ^^^^
13132/// ```
13133/// 
13134/// ```ruby
13135/// c if a =~ /left/ ... b =~ /right/
13136///      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
13137/// ```
13138pub struct RangeNode<'pr> {
13139    /// The pointer to the parser this node came from.
13140    parser: *const pm_parser_t,
13141
13142    /// The raw pointer to the node allocated by prism.
13143    pointer: *mut pm_range_node_t,
13144
13145    /// The marker to indicate the lifetime of the pointer.
13146    marker: PhantomData<&'pr mut pm_range_node_t>
13147}
13148
13149impl<'pr> RangeNode<'pr> {
13150    /// Converts this node to a generic node.
13151    #[must_use]
13152    pub const fn as_node(&self) -> Node<'pr> {
13153        Node::RangeNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13154    }
13155
13156    /// Returns the location of this node.
13157    #[must_use]
13158    pub fn location(&self) -> Location<'pr> {
13159        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13160        Location::new(self.parser, unsafe { &(*pointer) })
13161    }
13162
13163    /// Returns the flags of this node.
13164    #[must_use]
13165    pub fn flags(&self) -> pm_node_flags_t {
13166        unsafe { (*self.pointer).base.flags }
13167    }
13168
13169    /// ... operator
13170    #[must_use]
13171    pub fn is_exclude_end(&self) -> bool {
13172        (self.flags() & PM_RANGE_FLAGS_EXCLUDE_END) != 0
13173    }
13174
13175    /// Returns the `left` param
13176    #[must_use]
13177    pub fn left(&self) -> Option<Node<'pr>> {
13178        let node: *mut pm_node_t = unsafe { (*self.pointer).left };
13179        if node.is_null() {
13180            None
13181        } else {
13182            Some(Node::new(self.parser, node))
13183        }
13184    }
13185
13186    /// Returns the `right` param
13187    #[must_use]
13188    pub fn right(&self) -> Option<Node<'pr>> {
13189        let node: *mut pm_node_t = unsafe { (*self.pointer).right };
13190        if node.is_null() {
13191            None
13192        } else {
13193            Some(Node::new(self.parser, node))
13194        }
13195    }
13196
13197    /// Returns the `operator_loc` param
13198    #[must_use]
13199    pub fn operator_loc(&self) -> Location<'pr> {
13200        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
13201        Location::new(self.parser, unsafe { &(*pointer) })
13202    }
13203}
13204
13205impl std::fmt::Debug for RangeNode<'_> {
13206    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13207        write!(f, "RangeNode({:?}, {:?}, {:?})", self.left(), self.right(), self.operator_loc())
13208    }
13209}
13210
13211/// Represents a rational number literal.
13212/// 
13213/// ```ruby
13214/// 1.0r
13215/// ^^^^
13216/// ```
13217pub struct RationalNode<'pr> {
13218    /// The pointer to the parser this node came from.
13219    parser: *const pm_parser_t,
13220
13221    /// The raw pointer to the node allocated by prism.
13222    pointer: *mut pm_rational_node_t,
13223
13224    /// The marker to indicate the lifetime of the pointer.
13225    marker: PhantomData<&'pr mut pm_rational_node_t>
13226}
13227
13228impl<'pr> RationalNode<'pr> {
13229    /// Converts this node to a generic node.
13230    #[must_use]
13231    pub const fn as_node(&self) -> Node<'pr> {
13232        Node::RationalNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13233    }
13234
13235    /// Returns the location of this node.
13236    #[must_use]
13237    pub fn location(&self) -> Location<'pr> {
13238        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13239        Location::new(self.parser, unsafe { &(*pointer) })
13240    }
13241
13242    /// Returns the flags of this node.
13243    #[must_use]
13244    pub fn flags(&self) -> pm_node_flags_t {
13245        unsafe { (*self.pointer).base.flags }
13246    }
13247
13248    /// 0b prefix
13249    #[must_use]
13250    pub fn is_binary(&self) -> bool {
13251        (self.flags() & PM_INTEGER_BASE_FLAGS_BINARY) != 0
13252    }
13253
13254    /// 0d or no prefix
13255    #[must_use]
13256    pub fn is_decimal(&self) -> bool {
13257        (self.flags() & PM_INTEGER_BASE_FLAGS_DECIMAL) != 0
13258    }
13259
13260    /// 0o or 0 prefix
13261    #[must_use]
13262    pub fn is_octal(&self) -> bool {
13263        (self.flags() & PM_INTEGER_BASE_FLAGS_OCTAL) != 0
13264    }
13265
13266    /// 0x prefix
13267    #[must_use]
13268    pub fn is_hexadecimal(&self) -> bool {
13269        (self.flags() & PM_INTEGER_BASE_FLAGS_HEXADECIMAL) != 0
13270    }
13271
13272    /// Returns the `numerator` param
13273    #[must_use]
13274    pub fn numerator(&self) -> Integer<'pr> {
13275        Integer::new(unsafe { &raw const(*self.pointer).numerator })
13276    }
13277
13278    /// Returns the `denominator` param
13279    #[must_use]
13280    pub fn denominator(&self) -> Integer<'pr> {
13281        Integer::new(unsafe { &raw const(*self.pointer).denominator })
13282    }
13283}
13284
13285impl std::fmt::Debug for RationalNode<'_> {
13286    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13287        write!(f, "RationalNode({:?}, {:?})", self.numerator(), self.denominator())
13288    }
13289}
13290
13291/// Represents the use of the `redo` keyword.
13292/// 
13293/// ```ruby
13294/// redo
13295/// ^^^^
13296/// ```
13297pub struct RedoNode<'pr> {
13298    /// The pointer to the parser this node came from.
13299    parser: *const pm_parser_t,
13300
13301    /// The raw pointer to the node allocated by prism.
13302    pointer: *mut pm_redo_node_t,
13303
13304    /// The marker to indicate the lifetime of the pointer.
13305    marker: PhantomData<&'pr mut pm_redo_node_t>
13306}
13307
13308impl<'pr> RedoNode<'pr> {
13309    /// Converts this node to a generic node.
13310    #[must_use]
13311    pub const fn as_node(&self) -> Node<'pr> {
13312        Node::RedoNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13313    }
13314
13315    /// Returns the location of this node.
13316    #[must_use]
13317    pub fn location(&self) -> Location<'pr> {
13318        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13319        Location::new(self.parser, unsafe { &(*pointer) })
13320    }
13321
13322    /// Returns the flags of this node.
13323    #[must_use]
13324    pub fn flags(&self) -> pm_node_flags_t {
13325        unsafe { (*self.pointer).base.flags }
13326    }
13327}
13328
13329impl std::fmt::Debug for RedoNode<'_> {
13330    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13331        write!(f, "RedoNode()")
13332    }
13333}
13334
13335/// Represents a regular expression literal with no interpolation.
13336/// 
13337/// ```ruby
13338/// /foo/i
13339/// ^^^^^^
13340/// ```
13341pub struct RegularExpressionNode<'pr> {
13342    /// The pointer to the parser this node came from.
13343    parser: *const pm_parser_t,
13344
13345    /// The raw pointer to the node allocated by prism.
13346    pointer: *mut pm_regular_expression_node_t,
13347
13348    /// The marker to indicate the lifetime of the pointer.
13349    marker: PhantomData<&'pr mut pm_regular_expression_node_t>
13350}
13351
13352impl<'pr> RegularExpressionNode<'pr> {
13353    /// Converts this node to a generic node.
13354    #[must_use]
13355    pub const fn as_node(&self) -> Node<'pr> {
13356        Node::RegularExpressionNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13357    }
13358
13359    /// Returns the location of this node.
13360    #[must_use]
13361    pub fn location(&self) -> Location<'pr> {
13362        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13363        Location::new(self.parser, unsafe { &(*pointer) })
13364    }
13365
13366    /// Returns the flags of this node.
13367    #[must_use]
13368    pub fn flags(&self) -> pm_node_flags_t {
13369        unsafe { (*self.pointer).base.flags }
13370    }
13371
13372    /// i - ignores the case of characters when matching
13373    #[must_use]
13374    pub fn is_ignore_case(&self) -> bool {
13375        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE) != 0
13376    }
13377
13378    /// x - ignores whitespace and allows comments in regular expressions
13379    #[must_use]
13380    pub fn is_extended(&self) -> bool {
13381        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EXTENDED) != 0
13382    }
13383
13384    /// m - allows $ to match the end of lines within strings
13385    #[must_use]
13386    pub fn is_multi_line(&self) -> bool {
13387        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE) != 0
13388    }
13389
13390    /// o - only interpolates values into the regular expression once
13391    #[must_use]
13392    pub fn is_once(&self) -> bool {
13393        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ONCE) != 0
13394    }
13395
13396    /// e - forces the EUC-JP encoding
13397    #[must_use]
13398    pub fn is_euc_jp(&self) -> bool {
13399        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_EUC_JP) != 0
13400    }
13401
13402    /// n - forces the ASCII-8BIT encoding
13403    #[must_use]
13404    pub fn is_ascii_8bit(&self) -> bool {
13405        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT) != 0
13406    }
13407
13408    /// s - forces the Windows-31J encoding
13409    #[must_use]
13410    pub fn is_windows_31j(&self) -> bool {
13411        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J) != 0
13412    }
13413
13414    /// u - forces the UTF-8 encoding
13415    #[must_use]
13416    pub fn is_utf_8(&self) -> bool {
13417        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_UTF_8) != 0
13418    }
13419
13420    /// internal bytes forced the encoding to UTF-8
13421    #[must_use]
13422    pub fn is_forced_utf8_encoding(&self) -> bool {
13423        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_UTF8_ENCODING) != 0
13424    }
13425
13426    /// internal bytes forced the encoding to binary
13427    #[must_use]
13428    pub fn is_forced_binary_encoding(&self) -> bool {
13429        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_BINARY_ENCODING) != 0
13430    }
13431
13432    /// internal bytes forced the encoding to US-ASCII
13433    #[must_use]
13434    pub fn is_forced_us_ascii_encoding(&self) -> bool {
13435        (self.flags() & PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING) != 0
13436    }
13437
13438    /// Returns the `opening_loc` param
13439    #[must_use]
13440    pub fn opening_loc(&self) -> Location<'pr> {
13441        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
13442        Location::new(self.parser, unsafe { &(*pointer) })
13443    }
13444
13445    /// Returns the `content_loc` param
13446    #[must_use]
13447    pub fn content_loc(&self) -> Location<'pr> {
13448        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).content_loc };
13449        Location::new(self.parser, unsafe { &(*pointer) })
13450    }
13451
13452    /// Returns the `closing_loc` param
13453    #[must_use]
13454    pub fn closing_loc(&self) -> Location<'pr> {
13455        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
13456        Location::new(self.parser, unsafe { &(*pointer) })
13457    }
13458
13459    /// Returns the `unescaped` param
13460    #[must_use]
13461    pub fn unescaped(&self) -> &[u8] {
13462        unsafe {
13463            let source = (*self.pointer).unescaped.source;
13464            if source.is_null() {
13465                return &[];
13466            }
13467            let length = (*self.pointer).unescaped.length;
13468            std::slice::from_raw_parts(source, length)
13469        }
13470    }
13471}
13472
13473impl std::fmt::Debug for RegularExpressionNode<'_> {
13474    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13475        write!(f, "RegularExpressionNode({:?}, {:?}, {:?}, {:?})", self.opening_loc(), self.content_loc(), self.closing_loc(), self.unescaped())
13476    }
13477}
13478
13479/// Represents a required keyword parameter to a method, block, or lambda definition.
13480/// 
13481/// ```ruby
13482/// def a(b: )
13483///       ^^
13484/// end
13485/// ```
13486pub struct RequiredKeywordParameterNode<'pr> {
13487    /// The pointer to the parser this node came from.
13488    parser: *const pm_parser_t,
13489
13490    /// The raw pointer to the node allocated by prism.
13491    pointer: *mut pm_required_keyword_parameter_node_t,
13492
13493    /// The marker to indicate the lifetime of the pointer.
13494    marker: PhantomData<&'pr mut pm_required_keyword_parameter_node_t>
13495}
13496
13497impl<'pr> RequiredKeywordParameterNode<'pr> {
13498    /// Converts this node to a generic node.
13499    #[must_use]
13500    pub const fn as_node(&self) -> Node<'pr> {
13501        Node::RequiredKeywordParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13502    }
13503
13504    /// Returns the location of this node.
13505    #[must_use]
13506    pub fn location(&self) -> Location<'pr> {
13507        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13508        Location::new(self.parser, unsafe { &(*pointer) })
13509    }
13510
13511    /// Returns the flags of this node.
13512    #[must_use]
13513    pub fn flags(&self) -> pm_node_flags_t {
13514        unsafe { (*self.pointer).base.flags }
13515    }
13516
13517    /// a parameter name that has been repeated in the method signature
13518    #[must_use]
13519    pub fn is_repeated_parameter(&self) -> bool {
13520        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
13521    }
13522
13523    /// Returns the `name` param
13524    #[must_use]
13525    pub fn name(&self) -> ConstantId<'pr> {
13526        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
13527    }
13528
13529    /// Returns the `name_loc` param
13530    #[must_use]
13531    pub fn name_loc(&self) -> Location<'pr> {
13532        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
13533        Location::new(self.parser, unsafe { &(*pointer) })
13534    }
13535}
13536
13537impl std::fmt::Debug for RequiredKeywordParameterNode<'_> {
13538    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13539        write!(f, "RequiredKeywordParameterNode({:?}, {:?})", self.name(), self.name_loc())
13540    }
13541}
13542
13543/// Represents a required parameter to a method, block, or lambda definition.
13544/// 
13545/// ```ruby
13546/// def a(b)
13547///       ^
13548/// end
13549/// ```
13550pub struct RequiredParameterNode<'pr> {
13551    /// The pointer to the parser this node came from.
13552    parser: *const pm_parser_t,
13553
13554    /// The raw pointer to the node allocated by prism.
13555    pointer: *mut pm_required_parameter_node_t,
13556
13557    /// The marker to indicate the lifetime of the pointer.
13558    marker: PhantomData<&'pr mut pm_required_parameter_node_t>
13559}
13560
13561impl<'pr> RequiredParameterNode<'pr> {
13562    /// Converts this node to a generic node.
13563    #[must_use]
13564    pub const fn as_node(&self) -> Node<'pr> {
13565        Node::RequiredParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13566    }
13567
13568    /// Returns the location of this node.
13569    #[must_use]
13570    pub fn location(&self) -> Location<'pr> {
13571        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13572        Location::new(self.parser, unsafe { &(*pointer) })
13573    }
13574
13575    /// Returns the flags of this node.
13576    #[must_use]
13577    pub fn flags(&self) -> pm_node_flags_t {
13578        unsafe { (*self.pointer).base.flags }
13579    }
13580
13581    /// a parameter name that has been repeated in the method signature
13582    #[must_use]
13583    pub fn is_repeated_parameter(&self) -> bool {
13584        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
13585    }
13586
13587    /// Returns the `name` param
13588    #[must_use]
13589    pub fn name(&self) -> ConstantId<'pr> {
13590        ConstantId::new(self.parser, unsafe { (*self.pointer).name })
13591    }
13592}
13593
13594impl std::fmt::Debug for RequiredParameterNode<'_> {
13595    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13596        write!(f, "RequiredParameterNode({:?})", self.name())
13597    }
13598}
13599
13600/// Represents an expression modified with a rescue.
13601/// 
13602/// ```ruby
13603/// foo rescue nil
13604/// ^^^^^^^^^^^^^^
13605/// ```
13606pub struct RescueModifierNode<'pr> {
13607    /// The pointer to the parser this node came from.
13608    parser: *const pm_parser_t,
13609
13610    /// The raw pointer to the node allocated by prism.
13611    pointer: *mut pm_rescue_modifier_node_t,
13612
13613    /// The marker to indicate the lifetime of the pointer.
13614    marker: PhantomData<&'pr mut pm_rescue_modifier_node_t>
13615}
13616
13617impl<'pr> RescueModifierNode<'pr> {
13618    /// Converts this node to a generic node.
13619    #[must_use]
13620    pub const fn as_node(&self) -> Node<'pr> {
13621        Node::RescueModifierNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13622    }
13623
13624    /// Returns the location of this node.
13625    #[must_use]
13626    pub fn location(&self) -> Location<'pr> {
13627        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13628        Location::new(self.parser, unsafe { &(*pointer) })
13629    }
13630
13631    /// Returns the flags of this node.
13632    #[must_use]
13633    pub fn flags(&self) -> pm_node_flags_t {
13634        unsafe { (*self.pointer).base.flags }
13635    }
13636
13637    /// Returns the `expression` param
13638    #[must_use]
13639    pub fn expression(&self) -> Node<'pr> {
13640        let node: *mut pm_node_t = unsafe { (*self.pointer).expression };
13641        Node::new(self.parser, node)
13642    }
13643
13644    /// Returns the `keyword_loc` param
13645    #[must_use]
13646    pub fn keyword_loc(&self) -> Location<'pr> {
13647        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
13648        Location::new(self.parser, unsafe { &(*pointer) })
13649    }
13650
13651    /// Returns the `rescue_expression` param
13652    #[must_use]
13653    pub fn rescue_expression(&self) -> Node<'pr> {
13654        let node: *mut pm_node_t = unsafe { (*self.pointer).rescue_expression };
13655        Node::new(self.parser, node)
13656    }
13657}
13658
13659impl std::fmt::Debug for RescueModifierNode<'_> {
13660    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13661        write!(f, "RescueModifierNode({:?}, {:?}, {:?})", self.expression(), self.keyword_loc(), self.rescue_expression())
13662    }
13663}
13664
13665/// Represents a rescue statement.
13666/// 
13667/// ```ruby
13668/// begin
13669/// rescue Foo, *splat, Bar => ex
13670///   foo
13671/// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
13672/// end
13673/// ```
13674/// 
13675/// `Foo, *splat, Bar` are in the `exceptions` field. `ex` is in the `reference` field.
13676pub struct RescueNode<'pr> {
13677    /// The pointer to the parser this node came from.
13678    parser: *const pm_parser_t,
13679
13680    /// The raw pointer to the node allocated by prism.
13681    pointer: *mut pm_rescue_node_t,
13682
13683    /// The marker to indicate the lifetime of the pointer.
13684    marker: PhantomData<&'pr mut pm_rescue_node_t>
13685}
13686
13687impl<'pr> RescueNode<'pr> {
13688    /// Converts this node to a generic node.
13689    #[must_use]
13690    pub const fn as_node(&self) -> Node<'pr> {
13691        Node::RescueNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13692    }
13693
13694    /// Returns the location of this node.
13695    #[must_use]
13696    pub fn location(&self) -> Location<'pr> {
13697        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13698        Location::new(self.parser, unsafe { &(*pointer) })
13699    }
13700
13701    /// Returns the flags of this node.
13702    #[must_use]
13703    pub fn flags(&self) -> pm_node_flags_t {
13704        unsafe { (*self.pointer).base.flags }
13705    }
13706
13707    /// Returns the `keyword_loc` param
13708    #[must_use]
13709    pub fn keyword_loc(&self) -> Location<'pr> {
13710        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
13711        Location::new(self.parser, unsafe { &(*pointer) })
13712    }
13713
13714    /// Returns the `exceptions` param
13715    #[must_use]
13716    pub fn exceptions(&self) -> NodeList<'pr> {
13717        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).exceptions };
13718        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
13719    }
13720
13721    /// Returns the `operator_loc` param
13722    #[must_use]
13723    pub fn operator_loc(&self) -> Option<Location<'pr>> {
13724        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
13725        let length = unsafe { (*pointer).length };
13726        if length == 0 {
13727            None
13728        } else {
13729            Some(Location::new(self.parser, unsafe { &(*pointer) }))
13730        }
13731    }
13732
13733    /// Returns the `reference` param
13734    #[must_use]
13735    pub fn reference(&self) -> Option<Node<'pr>> {
13736        let node: *mut pm_node_t = unsafe { (*self.pointer).reference };
13737        if node.is_null() {
13738            None
13739        } else {
13740            Some(Node::new(self.parser, node))
13741        }
13742    }
13743
13744    /// Returns the `then_keyword_loc` param
13745    #[must_use]
13746    pub fn then_keyword_loc(&self) -> Option<Location<'pr>> {
13747        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).then_keyword_loc };
13748        let length = unsafe { (*pointer).length };
13749        if length == 0 {
13750            None
13751        } else {
13752            Some(Location::new(self.parser, unsafe { &(*pointer) }))
13753        }
13754    }
13755
13756    /// Returns the `statements` param
13757    #[must_use]
13758    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
13759        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
13760        if node.is_null() {
13761            None
13762        } else {
13763            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
13764        }
13765    }
13766
13767    /// Returns the `subsequent` param
13768    #[must_use]
13769    pub fn subsequent(&self) -> Option<RescueNode<'pr>> {
13770        let node: *mut pm_rescue_node_t = unsafe { (*self.pointer).subsequent };
13771        if node.is_null() {
13772            None
13773        } else {
13774            Some(RescueNode { parser: self.parser, pointer: node, marker: PhantomData })
13775        }
13776    }
13777}
13778
13779impl std::fmt::Debug for RescueNode<'_> {
13780    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13781        write!(f, "RescueNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.exceptions(), self.operator_loc(), self.reference(), self.then_keyword_loc(), self.statements(), self.subsequent())
13782    }
13783}
13784
13785/// Represents a rest parameter to a method, block, or lambda definition.
13786/// 
13787/// ```ruby
13788/// def a(*b)
13789///       ^^
13790/// end
13791/// ```
13792pub struct RestParameterNode<'pr> {
13793    /// The pointer to the parser this node came from.
13794    parser: *const pm_parser_t,
13795
13796    /// The raw pointer to the node allocated by prism.
13797    pointer: *mut pm_rest_parameter_node_t,
13798
13799    /// The marker to indicate the lifetime of the pointer.
13800    marker: PhantomData<&'pr mut pm_rest_parameter_node_t>
13801}
13802
13803impl<'pr> RestParameterNode<'pr> {
13804    /// Converts this node to a generic node.
13805    #[must_use]
13806    pub const fn as_node(&self) -> Node<'pr> {
13807        Node::RestParameterNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13808    }
13809
13810    /// Returns the location of this node.
13811    #[must_use]
13812    pub fn location(&self) -> Location<'pr> {
13813        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13814        Location::new(self.parser, unsafe { &(*pointer) })
13815    }
13816
13817    /// Returns the flags of this node.
13818    #[must_use]
13819    pub fn flags(&self) -> pm_node_flags_t {
13820        unsafe { (*self.pointer).base.flags }
13821    }
13822
13823    /// a parameter name that has been repeated in the method signature
13824    #[must_use]
13825    pub fn is_repeated_parameter(&self) -> bool {
13826        (self.flags() & PM_PARAMETER_FLAGS_REPEATED_PARAMETER) != 0
13827    }
13828
13829    /// Returns the `name` param
13830    #[must_use]
13831    pub fn name(&self) -> Option<ConstantId<'pr>> {
13832        let id = unsafe { (*self.pointer).name };
13833        if id == 0 {
13834            None
13835        } else {
13836            Some(ConstantId::new(self.parser, id))
13837        }
13838    }
13839
13840    /// Returns the `name_loc` param
13841    #[must_use]
13842    pub fn name_loc(&self) -> Option<Location<'pr>> {
13843        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).name_loc };
13844        let length = unsafe { (*pointer).length };
13845        if length == 0 {
13846            None
13847        } else {
13848            Some(Location::new(self.parser, unsafe { &(*pointer) }))
13849        }
13850    }
13851
13852    /// Returns the `operator_loc` param
13853    #[must_use]
13854    pub fn operator_loc(&self) -> Location<'pr> {
13855        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
13856        Location::new(self.parser, unsafe { &(*pointer) })
13857    }
13858}
13859
13860impl std::fmt::Debug for RestParameterNode<'_> {
13861    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13862        write!(f, "RestParameterNode({:?}, {:?}, {:?})", self.name(), self.name_loc(), self.operator_loc())
13863    }
13864}
13865
13866/// Represents the use of the `retry` keyword.
13867/// 
13868/// ```ruby
13869/// retry
13870/// ^^^^^
13871/// ```
13872pub struct RetryNode<'pr> {
13873    /// The pointer to the parser this node came from.
13874    parser: *const pm_parser_t,
13875
13876    /// The raw pointer to the node allocated by prism.
13877    pointer: *mut pm_retry_node_t,
13878
13879    /// The marker to indicate the lifetime of the pointer.
13880    marker: PhantomData<&'pr mut pm_retry_node_t>
13881}
13882
13883impl<'pr> RetryNode<'pr> {
13884    /// Converts this node to a generic node.
13885    #[must_use]
13886    pub const fn as_node(&self) -> Node<'pr> {
13887        Node::RetryNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13888    }
13889
13890    /// Returns the location of this node.
13891    #[must_use]
13892    pub fn location(&self) -> Location<'pr> {
13893        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13894        Location::new(self.parser, unsafe { &(*pointer) })
13895    }
13896
13897    /// Returns the flags of this node.
13898    #[must_use]
13899    pub fn flags(&self) -> pm_node_flags_t {
13900        unsafe { (*self.pointer).base.flags }
13901    }
13902}
13903
13904impl std::fmt::Debug for RetryNode<'_> {
13905    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13906        write!(f, "RetryNode()")
13907    }
13908}
13909
13910/// Represents the use of the `return` keyword.
13911/// 
13912/// ```ruby
13913/// return 1
13914/// ^^^^^^^^
13915/// ```
13916pub struct ReturnNode<'pr> {
13917    /// The pointer to the parser this node came from.
13918    parser: *const pm_parser_t,
13919
13920    /// The raw pointer to the node allocated by prism.
13921    pointer: *mut pm_return_node_t,
13922
13923    /// The marker to indicate the lifetime of the pointer.
13924    marker: PhantomData<&'pr mut pm_return_node_t>
13925}
13926
13927impl<'pr> ReturnNode<'pr> {
13928    /// Converts this node to a generic node.
13929    #[must_use]
13930    pub const fn as_node(&self) -> Node<'pr> {
13931        Node::ReturnNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13932    }
13933
13934    /// Returns the location of this node.
13935    #[must_use]
13936    pub fn location(&self) -> Location<'pr> {
13937        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
13938        Location::new(self.parser, unsafe { &(*pointer) })
13939    }
13940
13941    /// Returns the flags of this node.
13942    #[must_use]
13943    pub fn flags(&self) -> pm_node_flags_t {
13944        unsafe { (*self.pointer).base.flags }
13945    }
13946
13947    /// Returns the `keyword_loc` param
13948    #[must_use]
13949    pub fn keyword_loc(&self) -> Location<'pr> {
13950        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
13951        Location::new(self.parser, unsafe { &(*pointer) })
13952    }
13953
13954    /// Returns the `arguments` param
13955    #[must_use]
13956    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
13957        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
13958        if node.is_null() {
13959            None
13960        } else {
13961            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
13962        }
13963    }
13964}
13965
13966impl std::fmt::Debug for ReturnNode<'_> {
13967    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13968        write!(f, "ReturnNode({:?}, {:?})", self.keyword_loc(), self.arguments())
13969    }
13970}
13971
13972/// Represents the `self` keyword.
13973/// 
13974/// ```ruby
13975/// self
13976/// ^^^^
13977/// ```
13978pub struct SelfNode<'pr> {
13979    /// The pointer to the parser this node came from.
13980    parser: *const pm_parser_t,
13981
13982    /// The raw pointer to the node allocated by prism.
13983    pointer: *mut pm_self_node_t,
13984
13985    /// The marker to indicate the lifetime of the pointer.
13986    marker: PhantomData<&'pr mut pm_self_node_t>
13987}
13988
13989impl<'pr> SelfNode<'pr> {
13990    /// Converts this node to a generic node.
13991    #[must_use]
13992    pub const fn as_node(&self) -> Node<'pr> {
13993        Node::SelfNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
13994    }
13995
13996    /// Returns the location of this node.
13997    #[must_use]
13998    pub fn location(&self) -> Location<'pr> {
13999        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14000        Location::new(self.parser, unsafe { &(*pointer) })
14001    }
14002
14003    /// Returns the flags of this node.
14004    #[must_use]
14005    pub fn flags(&self) -> pm_node_flags_t {
14006        unsafe { (*self.pointer).base.flags }
14007    }
14008}
14009
14010impl std::fmt::Debug for SelfNode<'_> {
14011    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14012        write!(f, "SelfNode()")
14013    }
14014}
14015
14016/// This node wraps a constant write to indicate that when the value is written, it should have its shareability state modified.
14017/// 
14018/// ```ruby
14019/// # shareable_constant_value: literal
14020/// C = { a: 1 }
14021/// ^^^^^^^^^^^^
14022/// ```
14023pub struct ShareableConstantNode<'pr> {
14024    /// The pointer to the parser this node came from.
14025    parser: *const pm_parser_t,
14026
14027    /// The raw pointer to the node allocated by prism.
14028    pointer: *mut pm_shareable_constant_node_t,
14029
14030    /// The marker to indicate the lifetime of the pointer.
14031    marker: PhantomData<&'pr mut pm_shareable_constant_node_t>
14032}
14033
14034impl<'pr> ShareableConstantNode<'pr> {
14035    /// Converts this node to a generic node.
14036    #[must_use]
14037    pub const fn as_node(&self) -> Node<'pr> {
14038        Node::ShareableConstantNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14039    }
14040
14041    /// Returns the location of this node.
14042    #[must_use]
14043    pub fn location(&self) -> Location<'pr> {
14044        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14045        Location::new(self.parser, unsafe { &(*pointer) })
14046    }
14047
14048    /// Returns the flags of this node.
14049    #[must_use]
14050    pub fn flags(&self) -> pm_node_flags_t {
14051        unsafe { (*self.pointer).base.flags }
14052    }
14053
14054    /// constant writes that should be modified with shareable constant value literal
14055    #[must_use]
14056    pub fn is_literal(&self) -> bool {
14057        (self.flags() & PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL) != 0
14058    }
14059
14060    /// constant writes that should be modified with shareable constant value experimental everything
14061    #[must_use]
14062    pub fn is_experimental_everything(&self) -> bool {
14063        (self.flags() & PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING) != 0
14064    }
14065
14066    /// constant writes that should be modified with shareable constant value experimental copy
14067    #[must_use]
14068    pub fn is_experimental_copy(&self) -> bool {
14069        (self.flags() & PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY) != 0
14070    }
14071
14072    /// Returns the `write` param
14073    #[must_use]
14074    pub fn write(&self) -> Node<'pr> {
14075        let node: *mut pm_node_t = unsafe { (*self.pointer).write };
14076        Node::new(self.parser, node)
14077    }
14078}
14079
14080impl std::fmt::Debug for ShareableConstantNode<'_> {
14081    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14082        write!(f, "ShareableConstantNode({:?})", self.write())
14083    }
14084}
14085
14086/// Represents a singleton class declaration involving the `class` keyword.
14087/// 
14088/// ```ruby
14089/// class << self end
14090/// ^^^^^^^^^^^^^^^^^
14091/// ```
14092pub struct SingletonClassNode<'pr> {
14093    /// The pointer to the parser this node came from.
14094    parser: *const pm_parser_t,
14095
14096    /// The raw pointer to the node allocated by prism.
14097    pointer: *mut pm_singleton_class_node_t,
14098
14099    /// The marker to indicate the lifetime of the pointer.
14100    marker: PhantomData<&'pr mut pm_singleton_class_node_t>
14101}
14102
14103impl<'pr> SingletonClassNode<'pr> {
14104    /// Converts this node to a generic node.
14105    #[must_use]
14106    pub const fn as_node(&self) -> Node<'pr> {
14107        Node::SingletonClassNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14108    }
14109
14110    /// Returns the location of this node.
14111    #[must_use]
14112    pub fn location(&self) -> Location<'pr> {
14113        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14114        Location::new(self.parser, unsafe { &(*pointer) })
14115    }
14116
14117    /// Returns the flags of this node.
14118    #[must_use]
14119    pub fn flags(&self) -> pm_node_flags_t {
14120        unsafe { (*self.pointer).base.flags }
14121    }
14122
14123    /// Returns the `locals` param
14124    #[must_use]
14125    pub fn locals(&self) -> ConstantList<'pr> {
14126        let pointer: *mut pm_constant_id_list_t = unsafe { &raw mut (*self.pointer).locals };
14127        ConstantList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
14128    }
14129
14130    /// Returns the `class_keyword_loc` param
14131    #[must_use]
14132    pub fn class_keyword_loc(&self) -> Location<'pr> {
14133        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).class_keyword_loc };
14134        Location::new(self.parser, unsafe { &(*pointer) })
14135    }
14136
14137    /// Returns the `operator_loc` param
14138    #[must_use]
14139    pub fn operator_loc(&self) -> Location<'pr> {
14140        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
14141        Location::new(self.parser, unsafe { &(*pointer) })
14142    }
14143
14144    /// Returns the `expression` param
14145    #[must_use]
14146    pub fn expression(&self) -> Node<'pr> {
14147        let node: *mut pm_node_t = unsafe { (*self.pointer).expression };
14148        Node::new(self.parser, node)
14149    }
14150
14151    /// Returns the `body` param
14152    #[must_use]
14153    pub fn body(&self) -> Option<Node<'pr>> {
14154        let node: *mut pm_node_t = unsafe { (*self.pointer).body };
14155        if node.is_null() {
14156            None
14157        } else {
14158            Some(Node::new(self.parser, node))
14159        }
14160    }
14161
14162    /// Returns the `end_keyword_loc` param
14163    #[must_use]
14164    pub fn end_keyword_loc(&self) -> Location<'pr> {
14165        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
14166        Location::new(self.parser, unsafe { &(*pointer) })
14167    }
14168}
14169
14170impl std::fmt::Debug for SingletonClassNode<'_> {
14171    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14172        write!(f, "SingletonClassNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.locals(), self.class_keyword_loc(), self.operator_loc(), self.expression(), self.body(), self.end_keyword_loc())
14173    }
14174}
14175
14176/// Represents the use of the `__ENCODING__` keyword.
14177/// 
14178/// ```ruby
14179/// __ENCODING__
14180/// ^^^^^^^^^^^^
14181/// ```
14182pub struct SourceEncodingNode<'pr> {
14183    /// The pointer to the parser this node came from.
14184    parser: *const pm_parser_t,
14185
14186    /// The raw pointer to the node allocated by prism.
14187    pointer: *mut pm_source_encoding_node_t,
14188
14189    /// The marker to indicate the lifetime of the pointer.
14190    marker: PhantomData<&'pr mut pm_source_encoding_node_t>
14191}
14192
14193impl<'pr> SourceEncodingNode<'pr> {
14194    /// Converts this node to a generic node.
14195    #[must_use]
14196    pub const fn as_node(&self) -> Node<'pr> {
14197        Node::SourceEncodingNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14198    }
14199
14200    /// Returns the location of this node.
14201    #[must_use]
14202    pub fn location(&self) -> Location<'pr> {
14203        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14204        Location::new(self.parser, unsafe { &(*pointer) })
14205    }
14206
14207    /// Returns the flags of this node.
14208    #[must_use]
14209    pub fn flags(&self) -> pm_node_flags_t {
14210        unsafe { (*self.pointer).base.flags }
14211    }
14212}
14213
14214impl std::fmt::Debug for SourceEncodingNode<'_> {
14215    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14216        write!(f, "SourceEncodingNode()")
14217    }
14218}
14219
14220/// Represents the use of the `__FILE__` keyword.
14221/// 
14222/// ```ruby
14223/// __FILE__
14224/// ^^^^^^^^
14225/// ```
14226pub struct SourceFileNode<'pr> {
14227    /// The pointer to the parser this node came from.
14228    parser: *const pm_parser_t,
14229
14230    /// The raw pointer to the node allocated by prism.
14231    pointer: *mut pm_source_file_node_t,
14232
14233    /// The marker to indicate the lifetime of the pointer.
14234    marker: PhantomData<&'pr mut pm_source_file_node_t>
14235}
14236
14237impl<'pr> SourceFileNode<'pr> {
14238    /// Converts this node to a generic node.
14239    #[must_use]
14240    pub const fn as_node(&self) -> Node<'pr> {
14241        Node::SourceFileNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14242    }
14243
14244    /// Returns the location of this node.
14245    #[must_use]
14246    pub fn location(&self) -> Location<'pr> {
14247        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14248        Location::new(self.parser, unsafe { &(*pointer) })
14249    }
14250
14251    /// Returns the flags of this node.
14252    #[must_use]
14253    pub fn flags(&self) -> pm_node_flags_t {
14254        unsafe { (*self.pointer).base.flags }
14255    }
14256
14257    /// internal bytes forced the encoding to UTF-8
14258    #[must_use]
14259    pub fn is_forced_utf8_encoding(&self) -> bool {
14260        (self.flags() & PM_STRING_FLAGS_FORCED_UTF8_ENCODING) != 0
14261    }
14262
14263    /// internal bytes forced the encoding to binary
14264    #[must_use]
14265    pub fn is_forced_binary_encoding(&self) -> bool {
14266        (self.flags() & PM_STRING_FLAGS_FORCED_BINARY_ENCODING) != 0
14267    }
14268
14269    /// frozen by virtue of a `frozen_string_literal: true` comment or `--enable-frozen-string-literal`
14270    #[must_use]
14271    pub fn is_frozen(&self) -> bool {
14272        (self.flags() & PM_STRING_FLAGS_FROZEN) != 0
14273    }
14274
14275    /// mutable by virtue of a `frozen_string_literal: false` comment or `--disable-frozen-string-literal`
14276    #[must_use]
14277    pub fn is_mutable(&self) -> bool {
14278        (self.flags() & PM_STRING_FLAGS_MUTABLE) != 0
14279    }
14280
14281    /// Returns the `filepath` param
14282    #[must_use]
14283    pub fn filepath(&self) -> &[u8] {
14284        unsafe {
14285            let source = (*self.pointer).filepath.source;
14286            if source.is_null() {
14287                return &[];
14288            }
14289            let length = (*self.pointer).filepath.length;
14290            std::slice::from_raw_parts(source, length)
14291        }
14292    }
14293}
14294
14295impl std::fmt::Debug for SourceFileNode<'_> {
14296    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14297        write!(f, "SourceFileNode({:?})", self.filepath())
14298    }
14299}
14300
14301/// Represents the use of the `__LINE__` keyword.
14302/// 
14303/// ```ruby
14304/// __LINE__
14305/// ^^^^^^^^
14306/// ```
14307pub struct SourceLineNode<'pr> {
14308    /// The pointer to the parser this node came from.
14309    parser: *const pm_parser_t,
14310
14311    /// The raw pointer to the node allocated by prism.
14312    pointer: *mut pm_source_line_node_t,
14313
14314    /// The marker to indicate the lifetime of the pointer.
14315    marker: PhantomData<&'pr mut pm_source_line_node_t>
14316}
14317
14318impl<'pr> SourceLineNode<'pr> {
14319    /// Converts this node to a generic node.
14320    #[must_use]
14321    pub const fn as_node(&self) -> Node<'pr> {
14322        Node::SourceLineNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14323    }
14324
14325    /// Returns the location of this node.
14326    #[must_use]
14327    pub fn location(&self) -> Location<'pr> {
14328        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14329        Location::new(self.parser, unsafe { &(*pointer) })
14330    }
14331
14332    /// Returns the flags of this node.
14333    #[must_use]
14334    pub fn flags(&self) -> pm_node_flags_t {
14335        unsafe { (*self.pointer).base.flags }
14336    }
14337}
14338
14339impl std::fmt::Debug for SourceLineNode<'_> {
14340    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14341        write!(f, "SourceLineNode()")
14342    }
14343}
14344
14345/// Represents the use of the splat operator.
14346/// 
14347/// ```ruby
14348/// [*a]
14349///  ^^
14350/// ```
14351pub struct SplatNode<'pr> {
14352    /// The pointer to the parser this node came from.
14353    parser: *const pm_parser_t,
14354
14355    /// The raw pointer to the node allocated by prism.
14356    pointer: *mut pm_splat_node_t,
14357
14358    /// The marker to indicate the lifetime of the pointer.
14359    marker: PhantomData<&'pr mut pm_splat_node_t>
14360}
14361
14362impl<'pr> SplatNode<'pr> {
14363    /// Converts this node to a generic node.
14364    #[must_use]
14365    pub const fn as_node(&self) -> Node<'pr> {
14366        Node::SplatNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14367    }
14368
14369    /// Returns the location of this node.
14370    #[must_use]
14371    pub fn location(&self) -> Location<'pr> {
14372        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14373        Location::new(self.parser, unsafe { &(*pointer) })
14374    }
14375
14376    /// Returns the flags of this node.
14377    #[must_use]
14378    pub fn flags(&self) -> pm_node_flags_t {
14379        unsafe { (*self.pointer).base.flags }
14380    }
14381
14382    /// Returns the `operator_loc` param
14383    #[must_use]
14384    pub fn operator_loc(&self) -> Location<'pr> {
14385        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).operator_loc };
14386        Location::new(self.parser, unsafe { &(*pointer) })
14387    }
14388
14389    /// Returns the `expression` param
14390    #[must_use]
14391    pub fn expression(&self) -> Option<Node<'pr>> {
14392        let node: *mut pm_node_t = unsafe { (*self.pointer).expression };
14393        if node.is_null() {
14394            None
14395        } else {
14396            Some(Node::new(self.parser, node))
14397        }
14398    }
14399}
14400
14401impl std::fmt::Debug for SplatNode<'_> {
14402    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14403        write!(f, "SplatNode({:?}, {:?})", self.operator_loc(), self.expression())
14404    }
14405}
14406
14407/// Represents a set of statements contained within some scope.
14408/// 
14409/// ```ruby
14410/// foo; bar; baz
14411/// ^^^^^^^^^^^^^
14412/// ```
14413pub struct StatementsNode<'pr> {
14414    /// The pointer to the parser this node came from.
14415    parser: *const pm_parser_t,
14416
14417    /// The raw pointer to the node allocated by prism.
14418    pointer: *mut pm_statements_node_t,
14419
14420    /// The marker to indicate the lifetime of the pointer.
14421    marker: PhantomData<&'pr mut pm_statements_node_t>
14422}
14423
14424impl<'pr> StatementsNode<'pr> {
14425    /// Converts this node to a generic node.
14426    #[must_use]
14427    pub const fn as_node(&self) -> Node<'pr> {
14428        Node::StatementsNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14429    }
14430
14431    /// Returns the location of this node.
14432    #[must_use]
14433    pub fn location(&self) -> Location<'pr> {
14434        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14435        Location::new(self.parser, unsafe { &(*pointer) })
14436    }
14437
14438    /// Returns the flags of this node.
14439    #[must_use]
14440    pub fn flags(&self) -> pm_node_flags_t {
14441        unsafe { (*self.pointer).base.flags }
14442    }
14443
14444    /// Returns the `body` param
14445    #[must_use]
14446    pub fn body(&self) -> NodeList<'pr> {
14447        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).body };
14448        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
14449    }
14450}
14451
14452impl std::fmt::Debug for StatementsNode<'_> {
14453    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14454        write!(f, "StatementsNode({:?})", self.body())
14455    }
14456}
14457
14458/// Represents a string literal, a string contained within a `%w` list, or plain string content within an interpolated string.
14459/// 
14460/// ```ruby
14461/// "foo"
14462/// ^^^^^
14463/// ```
14464/// 
14465/// ```ruby
14466/// %w[foo]
14467///    ^^^
14468/// ```
14469/// 
14470/// ```ruby
14471/// "foo #{bar} baz"
14472///  ^^^^      ^^^^
14473/// ```
14474pub struct StringNode<'pr> {
14475    /// The pointer to the parser this node came from.
14476    parser: *const pm_parser_t,
14477
14478    /// The raw pointer to the node allocated by prism.
14479    pointer: *mut pm_string_node_t,
14480
14481    /// The marker to indicate the lifetime of the pointer.
14482    marker: PhantomData<&'pr mut pm_string_node_t>
14483}
14484
14485impl<'pr> StringNode<'pr> {
14486    /// Converts this node to a generic node.
14487    #[must_use]
14488    pub const fn as_node(&self) -> Node<'pr> {
14489        Node::StringNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14490    }
14491
14492    /// Returns the location of this node.
14493    #[must_use]
14494    pub fn location(&self) -> Location<'pr> {
14495        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14496        Location::new(self.parser, unsafe { &(*pointer) })
14497    }
14498
14499    /// Returns the flags of this node.
14500    #[must_use]
14501    pub fn flags(&self) -> pm_node_flags_t {
14502        unsafe { (*self.pointer).base.flags }
14503    }
14504
14505    /// internal bytes forced the encoding to UTF-8
14506    #[must_use]
14507    pub fn is_forced_utf8_encoding(&self) -> bool {
14508        (self.flags() & PM_STRING_FLAGS_FORCED_UTF8_ENCODING) != 0
14509    }
14510
14511    /// internal bytes forced the encoding to binary
14512    #[must_use]
14513    pub fn is_forced_binary_encoding(&self) -> bool {
14514        (self.flags() & PM_STRING_FLAGS_FORCED_BINARY_ENCODING) != 0
14515    }
14516
14517    /// frozen by virtue of a `frozen_string_literal: true` comment or `--enable-frozen-string-literal`
14518    #[must_use]
14519    pub fn is_frozen(&self) -> bool {
14520        (self.flags() & PM_STRING_FLAGS_FROZEN) != 0
14521    }
14522
14523    /// mutable by virtue of a `frozen_string_literal: false` comment or `--disable-frozen-string-literal`
14524    #[must_use]
14525    pub fn is_mutable(&self) -> bool {
14526        (self.flags() & PM_STRING_FLAGS_MUTABLE) != 0
14527    }
14528
14529    /// Returns the `opening_loc` param
14530    #[must_use]
14531    pub fn opening_loc(&self) -> Option<Location<'pr>> {
14532        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
14533        let length = unsafe { (*pointer).length };
14534        if length == 0 {
14535            None
14536        } else {
14537            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14538        }
14539    }
14540
14541    /// Returns the `content_loc` param
14542    #[must_use]
14543    pub fn content_loc(&self) -> Location<'pr> {
14544        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).content_loc };
14545        Location::new(self.parser, unsafe { &(*pointer) })
14546    }
14547
14548    /// Returns the `closing_loc` param
14549    #[must_use]
14550    pub fn closing_loc(&self) -> Option<Location<'pr>> {
14551        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
14552        let length = unsafe { (*pointer).length };
14553        if length == 0 {
14554            None
14555        } else {
14556            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14557        }
14558    }
14559
14560    /// Returns the `unescaped` param
14561    #[must_use]
14562    pub fn unescaped(&self) -> &[u8] {
14563        unsafe {
14564            let source = (*self.pointer).unescaped.source;
14565            if source.is_null() {
14566                return &[];
14567            }
14568            let length = (*self.pointer).unescaped.length;
14569            std::slice::from_raw_parts(source, length)
14570        }
14571    }
14572}
14573
14574impl std::fmt::Debug for StringNode<'_> {
14575    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14576        write!(f, "StringNode({:?}, {:?}, {:?}, {:?})", self.opening_loc(), self.content_loc(), self.closing_loc(), self.unescaped())
14577    }
14578}
14579
14580/// Represents the use of the `super` keyword with parentheses or arguments.
14581/// 
14582/// ```ruby
14583/// super()
14584/// ^^^^^^^
14585/// ```
14586/// 
14587/// ```ruby
14588/// super foo, bar
14589/// ^^^^^^^^^^^^^^
14590/// ```
14591/// 
14592/// If no arguments are provided (except for a block), it would be a `ForwardingSuperNode` instead.
14593pub struct SuperNode<'pr> {
14594    /// The pointer to the parser this node came from.
14595    parser: *const pm_parser_t,
14596
14597    /// The raw pointer to the node allocated by prism.
14598    pointer: *mut pm_super_node_t,
14599
14600    /// The marker to indicate the lifetime of the pointer.
14601    marker: PhantomData<&'pr mut pm_super_node_t>
14602}
14603
14604impl<'pr> SuperNode<'pr> {
14605    /// Converts this node to a generic node.
14606    #[must_use]
14607    pub const fn as_node(&self) -> Node<'pr> {
14608        Node::SuperNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14609    }
14610
14611    /// Returns the location of this node.
14612    #[must_use]
14613    pub fn location(&self) -> Location<'pr> {
14614        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14615        Location::new(self.parser, unsafe { &(*pointer) })
14616    }
14617
14618    /// Returns the flags of this node.
14619    #[must_use]
14620    pub fn flags(&self) -> pm_node_flags_t {
14621        unsafe { (*self.pointer).base.flags }
14622    }
14623
14624    /// Returns the `keyword_loc` param
14625    #[must_use]
14626    pub fn keyword_loc(&self) -> Location<'pr> {
14627        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
14628        Location::new(self.parser, unsafe { &(*pointer) })
14629    }
14630
14631    /// Returns the `lparen_loc` param
14632    #[must_use]
14633    pub fn lparen_loc(&self) -> Option<Location<'pr>> {
14634        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
14635        let length = unsafe { (*pointer).length };
14636        if length == 0 {
14637            None
14638        } else {
14639            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14640        }
14641    }
14642
14643    /// Returns the `arguments` param
14644    #[must_use]
14645    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
14646        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
14647        if node.is_null() {
14648            None
14649        } else {
14650            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
14651        }
14652    }
14653
14654    /// Returns the `rparen_loc` param
14655    #[must_use]
14656    pub fn rparen_loc(&self) -> Option<Location<'pr>> {
14657        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
14658        let length = unsafe { (*pointer).length };
14659        if length == 0 {
14660            None
14661        } else {
14662            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14663        }
14664    }
14665
14666    /// Returns the `block` param
14667    #[must_use]
14668    pub fn block(&self) -> Option<Node<'pr>> {
14669        let node: *mut pm_node_t = unsafe { (*self.pointer).block };
14670        if node.is_null() {
14671            None
14672        } else {
14673            Some(Node::new(self.parser, node))
14674        }
14675    }
14676}
14677
14678impl std::fmt::Debug for SuperNode<'_> {
14679    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14680        write!(f, "SuperNode({:?}, {:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.lparen_loc(), self.arguments(), self.rparen_loc(), self.block())
14681    }
14682}
14683
14684/// Represents a symbol literal or a symbol contained within a `%i` list.
14685/// 
14686/// ```ruby
14687/// :foo
14688/// ^^^^
14689/// ```
14690/// 
14691/// ```ruby
14692/// %i[foo]
14693///    ^^^
14694/// ```
14695pub struct SymbolNode<'pr> {
14696    /// The pointer to the parser this node came from.
14697    parser: *const pm_parser_t,
14698
14699    /// The raw pointer to the node allocated by prism.
14700    pointer: *mut pm_symbol_node_t,
14701
14702    /// The marker to indicate the lifetime of the pointer.
14703    marker: PhantomData<&'pr mut pm_symbol_node_t>
14704}
14705
14706impl<'pr> SymbolNode<'pr> {
14707    /// Converts this node to a generic node.
14708    #[must_use]
14709    pub const fn as_node(&self) -> Node<'pr> {
14710        Node::SymbolNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14711    }
14712
14713    /// Returns the location of this node.
14714    #[must_use]
14715    pub fn location(&self) -> Location<'pr> {
14716        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14717        Location::new(self.parser, unsafe { &(*pointer) })
14718    }
14719
14720    /// Returns the flags of this node.
14721    #[must_use]
14722    pub fn flags(&self) -> pm_node_flags_t {
14723        unsafe { (*self.pointer).base.flags }
14724    }
14725
14726    /// internal bytes forced the encoding to UTF-8
14727    #[must_use]
14728    pub fn is_forced_utf8_encoding(&self) -> bool {
14729        (self.flags() & PM_SYMBOL_FLAGS_FORCED_UTF8_ENCODING) != 0
14730    }
14731
14732    /// internal bytes forced the encoding to binary
14733    #[must_use]
14734    pub fn is_forced_binary_encoding(&self) -> bool {
14735        (self.flags() & PM_SYMBOL_FLAGS_FORCED_BINARY_ENCODING) != 0
14736    }
14737
14738    /// internal bytes forced the encoding to US-ASCII
14739    #[must_use]
14740    pub fn is_forced_us_ascii_encoding(&self) -> bool {
14741        (self.flags() & PM_SYMBOL_FLAGS_FORCED_US_ASCII_ENCODING) != 0
14742    }
14743
14744    /// Returns the `opening_loc` param
14745    #[must_use]
14746    pub fn opening_loc(&self) -> Option<Location<'pr>> {
14747        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
14748        let length = unsafe { (*pointer).length };
14749        if length == 0 {
14750            None
14751        } else {
14752            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14753        }
14754    }
14755
14756    /// Returns the `value_loc` param
14757    #[must_use]
14758    pub fn value_loc(&self) -> Option<Location<'pr>> {
14759        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).value_loc };
14760        let length = unsafe { (*pointer).length };
14761        if length == 0 {
14762            None
14763        } else {
14764            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14765        }
14766    }
14767
14768    /// Returns the `closing_loc` param
14769    #[must_use]
14770    pub fn closing_loc(&self) -> Option<Location<'pr>> {
14771        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
14772        let length = unsafe { (*pointer).length };
14773        if length == 0 {
14774            None
14775        } else {
14776            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14777        }
14778    }
14779
14780    /// Returns the `unescaped` param
14781    #[must_use]
14782    pub fn unescaped(&self) -> &[u8] {
14783        unsafe {
14784            let source = (*self.pointer).unescaped.source;
14785            if source.is_null() {
14786                return &[];
14787            }
14788            let length = (*self.pointer).unescaped.length;
14789            std::slice::from_raw_parts(source, length)
14790        }
14791    }
14792}
14793
14794impl std::fmt::Debug for SymbolNode<'_> {
14795    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14796        write!(f, "SymbolNode({:?}, {:?}, {:?}, {:?})", self.opening_loc(), self.value_loc(), self.closing_loc(), self.unescaped())
14797    }
14798}
14799
14800/// Represents the use of the literal `true` keyword.
14801/// 
14802/// ```ruby
14803/// true
14804/// ^^^^
14805/// ```
14806pub struct TrueNode<'pr> {
14807    /// The pointer to the parser this node came from.
14808    parser: *const pm_parser_t,
14809
14810    /// The raw pointer to the node allocated by prism.
14811    pointer: *mut pm_true_node_t,
14812
14813    /// The marker to indicate the lifetime of the pointer.
14814    marker: PhantomData<&'pr mut pm_true_node_t>
14815}
14816
14817impl<'pr> TrueNode<'pr> {
14818    /// Converts this node to a generic node.
14819    #[must_use]
14820    pub const fn as_node(&self) -> Node<'pr> {
14821        Node::TrueNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14822    }
14823
14824    /// Returns the location of this node.
14825    #[must_use]
14826    pub fn location(&self) -> Location<'pr> {
14827        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14828        Location::new(self.parser, unsafe { &(*pointer) })
14829    }
14830
14831    /// Returns the flags of this node.
14832    #[must_use]
14833    pub fn flags(&self) -> pm_node_flags_t {
14834        unsafe { (*self.pointer).base.flags }
14835    }
14836}
14837
14838impl std::fmt::Debug for TrueNode<'_> {
14839    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14840        write!(f, "TrueNode()")
14841    }
14842}
14843
14844/// Represents the use of the `undef` keyword.
14845/// 
14846/// ```ruby
14847/// undef :foo, :bar, :baz
14848/// ^^^^^^^^^^^^^^^^^^^^^^
14849/// ```
14850pub struct UndefNode<'pr> {
14851    /// The pointer to the parser this node came from.
14852    parser: *const pm_parser_t,
14853
14854    /// The raw pointer to the node allocated by prism.
14855    pointer: *mut pm_undef_node_t,
14856
14857    /// The marker to indicate the lifetime of the pointer.
14858    marker: PhantomData<&'pr mut pm_undef_node_t>
14859}
14860
14861impl<'pr> UndefNode<'pr> {
14862    /// Converts this node to a generic node.
14863    #[must_use]
14864    pub const fn as_node(&self) -> Node<'pr> {
14865        Node::UndefNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14866    }
14867
14868    /// Returns the location of this node.
14869    #[must_use]
14870    pub fn location(&self) -> Location<'pr> {
14871        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14872        Location::new(self.parser, unsafe { &(*pointer) })
14873    }
14874
14875    /// Returns the flags of this node.
14876    #[must_use]
14877    pub fn flags(&self) -> pm_node_flags_t {
14878        unsafe { (*self.pointer).base.flags }
14879    }
14880
14881    /// Returns the `names` param
14882    #[must_use]
14883    pub fn names(&self) -> NodeList<'pr> {
14884        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).names };
14885        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
14886    }
14887
14888    /// Returns the `keyword_loc` param
14889    #[must_use]
14890    pub fn keyword_loc(&self) -> Location<'pr> {
14891        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
14892        Location::new(self.parser, unsafe { &(*pointer) })
14893    }
14894}
14895
14896impl std::fmt::Debug for UndefNode<'_> {
14897    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14898        write!(f, "UndefNode({:?}, {:?})", self.names(), self.keyword_loc())
14899    }
14900}
14901
14902/// Represents the use of the `unless` keyword, either in the block form or the modifier form.
14903/// 
14904/// ```ruby
14905/// bar unless foo
14906/// ^^^^^^^^^^^^^^
14907/// ```
14908/// 
14909/// ```ruby
14910/// unless foo then bar end
14911/// ^^^^^^^^^^^^^^^^^^^^^^^
14912/// ```
14913pub struct UnlessNode<'pr> {
14914    /// The pointer to the parser this node came from.
14915    parser: *const pm_parser_t,
14916
14917    /// The raw pointer to the node allocated by prism.
14918    pointer: *mut pm_unless_node_t,
14919
14920    /// The marker to indicate the lifetime of the pointer.
14921    marker: PhantomData<&'pr mut pm_unless_node_t>
14922}
14923
14924impl<'pr> UnlessNode<'pr> {
14925    /// Converts this node to a generic node.
14926    #[must_use]
14927    pub const fn as_node(&self) -> Node<'pr> {
14928        Node::UnlessNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
14929    }
14930
14931    /// Returns the location of this node.
14932    #[must_use]
14933    pub fn location(&self) -> Location<'pr> {
14934        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
14935        Location::new(self.parser, unsafe { &(*pointer) })
14936    }
14937
14938    /// Returns the flags of this node.
14939    #[must_use]
14940    pub fn flags(&self) -> pm_node_flags_t {
14941        unsafe { (*self.pointer).base.flags }
14942    }
14943
14944    /// Returns the `keyword_loc` param
14945    #[must_use]
14946    pub fn keyword_loc(&self) -> Location<'pr> {
14947        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
14948        Location::new(self.parser, unsafe { &(*pointer) })
14949    }
14950
14951    /// Returns the `predicate` param
14952    #[must_use]
14953    pub fn predicate(&self) -> Node<'pr> {
14954        let node: *mut pm_node_t = unsafe { (*self.pointer).predicate };
14955        Node::new(self.parser, node)
14956    }
14957
14958    /// Returns the `then_keyword_loc` param
14959    #[must_use]
14960    pub fn then_keyword_loc(&self) -> Option<Location<'pr>> {
14961        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).then_keyword_loc };
14962        let length = unsafe { (*pointer).length };
14963        if length == 0 {
14964            None
14965        } else {
14966            Some(Location::new(self.parser, unsafe { &(*pointer) }))
14967        }
14968    }
14969
14970    /// Returns the `statements` param
14971    #[must_use]
14972    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
14973        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
14974        if node.is_null() {
14975            None
14976        } else {
14977            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
14978        }
14979    }
14980
14981    /// Returns the `else_clause` param
14982    #[must_use]
14983    pub fn else_clause(&self) -> Option<ElseNode<'pr>> {
14984        let node: *mut pm_else_node_t = unsafe { (*self.pointer).else_clause };
14985        if node.is_null() {
14986            None
14987        } else {
14988            Some(ElseNode { parser: self.parser, pointer: node, marker: PhantomData })
14989        }
14990    }
14991
14992    /// Returns the `end_keyword_loc` param
14993    #[must_use]
14994    pub fn end_keyword_loc(&self) -> Option<Location<'pr>> {
14995        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).end_keyword_loc };
14996        let length = unsafe { (*pointer).length };
14997        if length == 0 {
14998            None
14999        } else {
15000            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15001        }
15002    }
15003}
15004
15005impl std::fmt::Debug for UnlessNode<'_> {
15006    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15007        write!(f, "UnlessNode({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.predicate(), self.then_keyword_loc(), self.statements(), self.else_clause(), self.end_keyword_loc())
15008    }
15009}
15010
15011/// Represents the use of the `until` keyword, either in the block form or the modifier form.
15012/// 
15013/// ```ruby
15014/// bar until foo
15015/// ^^^^^^^^^^^^^
15016/// ```
15017/// 
15018/// ```ruby
15019/// until foo do bar end
15020/// ^^^^^^^^^^^^^^^^^^^^
15021/// ```
15022pub struct UntilNode<'pr> {
15023    /// The pointer to the parser this node came from.
15024    parser: *const pm_parser_t,
15025
15026    /// The raw pointer to the node allocated by prism.
15027    pointer: *mut pm_until_node_t,
15028
15029    /// The marker to indicate the lifetime of the pointer.
15030    marker: PhantomData<&'pr mut pm_until_node_t>
15031}
15032
15033impl<'pr> UntilNode<'pr> {
15034    /// Converts this node to a generic node.
15035    #[must_use]
15036    pub const fn as_node(&self) -> Node<'pr> {
15037        Node::UntilNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
15038    }
15039
15040    /// Returns the location of this node.
15041    #[must_use]
15042    pub fn location(&self) -> Location<'pr> {
15043        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
15044        Location::new(self.parser, unsafe { &(*pointer) })
15045    }
15046
15047    /// Returns the flags of this node.
15048    #[must_use]
15049    pub fn flags(&self) -> pm_node_flags_t {
15050        unsafe { (*self.pointer).base.flags }
15051    }
15052
15053    /// a loop after a begin statement, so the body is executed first before the condition
15054    #[must_use]
15055    pub fn is_begin_modifier(&self) -> bool {
15056        (self.flags() & PM_LOOP_FLAGS_BEGIN_MODIFIER) != 0
15057    }
15058
15059    /// Returns the `keyword_loc` param
15060    #[must_use]
15061    pub fn keyword_loc(&self) -> Location<'pr> {
15062        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
15063        Location::new(self.parser, unsafe { &(*pointer) })
15064    }
15065
15066    /// Returns the `do_keyword_loc` param
15067    #[must_use]
15068    pub fn do_keyword_loc(&self) -> Option<Location<'pr>> {
15069        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).do_keyword_loc };
15070        let length = unsafe { (*pointer).length };
15071        if length == 0 {
15072            None
15073        } else {
15074            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15075        }
15076    }
15077
15078    /// Returns the `closing_loc` param
15079    #[must_use]
15080    pub fn closing_loc(&self) -> Option<Location<'pr>> {
15081        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
15082        let length = unsafe { (*pointer).length };
15083        if length == 0 {
15084            None
15085        } else {
15086            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15087        }
15088    }
15089
15090    /// Returns the `predicate` param
15091    #[must_use]
15092    pub fn predicate(&self) -> Node<'pr> {
15093        let node: *mut pm_node_t = unsafe { (*self.pointer).predicate };
15094        Node::new(self.parser, node)
15095    }
15096
15097    /// Returns the `statements` param
15098    #[must_use]
15099    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
15100        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
15101        if node.is_null() {
15102            None
15103        } else {
15104            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
15105        }
15106    }
15107}
15108
15109impl std::fmt::Debug for UntilNode<'_> {
15110    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15111        write!(f, "UntilNode({:?}, {:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.do_keyword_loc(), self.closing_loc(), self.predicate(), self.statements())
15112    }
15113}
15114
15115/// Represents the use of the `when` keyword within a case statement.
15116/// 
15117/// ```ruby
15118/// case true
15119/// when true
15120/// ^^^^^^^^^
15121/// end
15122/// ```
15123pub struct WhenNode<'pr> {
15124    /// The pointer to the parser this node came from.
15125    parser: *const pm_parser_t,
15126
15127    /// The raw pointer to the node allocated by prism.
15128    pointer: *mut pm_when_node_t,
15129
15130    /// The marker to indicate the lifetime of the pointer.
15131    marker: PhantomData<&'pr mut pm_when_node_t>
15132}
15133
15134impl<'pr> WhenNode<'pr> {
15135    /// Converts this node to a generic node.
15136    #[must_use]
15137    pub const fn as_node(&self) -> Node<'pr> {
15138        Node::WhenNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
15139    }
15140
15141    /// Returns the location of this node.
15142    #[must_use]
15143    pub fn location(&self) -> Location<'pr> {
15144        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
15145        Location::new(self.parser, unsafe { &(*pointer) })
15146    }
15147
15148    /// Returns the flags of this node.
15149    #[must_use]
15150    pub fn flags(&self) -> pm_node_flags_t {
15151        unsafe { (*self.pointer).base.flags }
15152    }
15153
15154    /// Returns the `keyword_loc` param
15155    #[must_use]
15156    pub fn keyword_loc(&self) -> Location<'pr> {
15157        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
15158        Location::new(self.parser, unsafe { &(*pointer) })
15159    }
15160
15161    /// Returns the `conditions` param
15162    #[must_use]
15163    pub fn conditions(&self) -> NodeList<'pr> {
15164        let pointer: *mut pm_node_list = unsafe { &raw mut (*self.pointer).conditions };
15165        NodeList { parser: self.parser, pointer: unsafe { NonNull::new_unchecked(pointer) }, marker: PhantomData }
15166    }
15167
15168    /// Returns the `then_keyword_loc` param
15169    #[must_use]
15170    pub fn then_keyword_loc(&self) -> Option<Location<'pr>> {
15171        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).then_keyword_loc };
15172        let length = unsafe { (*pointer).length };
15173        if length == 0 {
15174            None
15175        } else {
15176            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15177        }
15178    }
15179
15180    /// Returns the `statements` param
15181    #[must_use]
15182    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
15183        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
15184        if node.is_null() {
15185            None
15186        } else {
15187            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
15188        }
15189    }
15190}
15191
15192impl std::fmt::Debug for WhenNode<'_> {
15193    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15194        write!(f, "WhenNode({:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.conditions(), self.then_keyword_loc(), self.statements())
15195    }
15196}
15197
15198/// Represents the use of the `while` keyword, either in the block form or the modifier form.
15199/// 
15200/// ```ruby
15201/// bar while foo
15202/// ^^^^^^^^^^^^^
15203/// ```
15204/// 
15205/// ```ruby
15206/// while foo do bar end
15207/// ^^^^^^^^^^^^^^^^^^^^
15208/// ```
15209pub struct WhileNode<'pr> {
15210    /// The pointer to the parser this node came from.
15211    parser: *const pm_parser_t,
15212
15213    /// The raw pointer to the node allocated by prism.
15214    pointer: *mut pm_while_node_t,
15215
15216    /// The marker to indicate the lifetime of the pointer.
15217    marker: PhantomData<&'pr mut pm_while_node_t>
15218}
15219
15220impl<'pr> WhileNode<'pr> {
15221    /// Converts this node to a generic node.
15222    #[must_use]
15223    pub const fn as_node(&self) -> Node<'pr> {
15224        Node::WhileNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
15225    }
15226
15227    /// Returns the location of this node.
15228    #[must_use]
15229    pub fn location(&self) -> Location<'pr> {
15230        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
15231        Location::new(self.parser, unsafe { &(*pointer) })
15232    }
15233
15234    /// Returns the flags of this node.
15235    #[must_use]
15236    pub fn flags(&self) -> pm_node_flags_t {
15237        unsafe { (*self.pointer).base.flags }
15238    }
15239
15240    /// a loop after a begin statement, so the body is executed first before the condition
15241    #[must_use]
15242    pub fn is_begin_modifier(&self) -> bool {
15243        (self.flags() & PM_LOOP_FLAGS_BEGIN_MODIFIER) != 0
15244    }
15245
15246    /// Returns the `keyword_loc` param
15247    #[must_use]
15248    pub fn keyword_loc(&self) -> Location<'pr> {
15249        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
15250        Location::new(self.parser, unsafe { &(*pointer) })
15251    }
15252
15253    /// Returns the `do_keyword_loc` param
15254    #[must_use]
15255    pub fn do_keyword_loc(&self) -> Option<Location<'pr>> {
15256        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).do_keyword_loc };
15257        let length = unsafe { (*pointer).length };
15258        if length == 0 {
15259            None
15260        } else {
15261            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15262        }
15263    }
15264
15265    /// Returns the `closing_loc` param
15266    #[must_use]
15267    pub fn closing_loc(&self) -> Option<Location<'pr>> {
15268        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
15269        let length = unsafe { (*pointer).length };
15270        if length == 0 {
15271            None
15272        } else {
15273            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15274        }
15275    }
15276
15277    /// Returns the `predicate` param
15278    #[must_use]
15279    pub fn predicate(&self) -> Node<'pr> {
15280        let node: *mut pm_node_t = unsafe { (*self.pointer).predicate };
15281        Node::new(self.parser, node)
15282    }
15283
15284    /// Returns the `statements` param
15285    #[must_use]
15286    pub fn statements(&self) -> Option<StatementsNode<'pr>> {
15287        let node: *mut pm_statements_node_t = unsafe { (*self.pointer).statements };
15288        if node.is_null() {
15289            None
15290        } else {
15291            Some(StatementsNode { parser: self.parser, pointer: node, marker: PhantomData })
15292        }
15293    }
15294}
15295
15296impl std::fmt::Debug for WhileNode<'_> {
15297    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15298        write!(f, "WhileNode({:?}, {:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.do_keyword_loc(), self.closing_loc(), self.predicate(), self.statements())
15299    }
15300}
15301
15302/// Represents an xstring literal with no interpolation.
15303/// 
15304/// ```ruby
15305/// `foo`
15306/// ^^^^^
15307/// ```
15308pub struct XStringNode<'pr> {
15309    /// The pointer to the parser this node came from.
15310    parser: *const pm_parser_t,
15311
15312    /// The raw pointer to the node allocated by prism.
15313    pointer: *mut pm_x_string_node_t,
15314
15315    /// The marker to indicate the lifetime of the pointer.
15316    marker: PhantomData<&'pr mut pm_x_string_node_t>
15317}
15318
15319impl<'pr> XStringNode<'pr> {
15320    /// Converts this node to a generic node.
15321    #[must_use]
15322    pub const fn as_node(&self) -> Node<'pr> {
15323        Node::XStringNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
15324    }
15325
15326    /// Returns the location of this node.
15327    #[must_use]
15328    pub fn location(&self) -> Location<'pr> {
15329        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
15330        Location::new(self.parser, unsafe { &(*pointer) })
15331    }
15332
15333    /// Returns the flags of this node.
15334    #[must_use]
15335    pub fn flags(&self) -> pm_node_flags_t {
15336        unsafe { (*self.pointer).base.flags }
15337    }
15338
15339    /// internal bytes forced the encoding to UTF-8
15340    #[must_use]
15341    pub fn is_forced_utf8_encoding(&self) -> bool {
15342        (self.flags() & PM_ENCODING_FLAGS_FORCED_UTF8_ENCODING) != 0
15343    }
15344
15345    /// internal bytes forced the encoding to binary
15346    #[must_use]
15347    pub fn is_forced_binary_encoding(&self) -> bool {
15348        (self.flags() & PM_ENCODING_FLAGS_FORCED_BINARY_ENCODING) != 0
15349    }
15350
15351    /// Returns the `opening_loc` param
15352    #[must_use]
15353    pub fn opening_loc(&self) -> Location<'pr> {
15354        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).opening_loc };
15355        Location::new(self.parser, unsafe { &(*pointer) })
15356    }
15357
15358    /// Returns the `content_loc` param
15359    #[must_use]
15360    pub fn content_loc(&self) -> Location<'pr> {
15361        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).content_loc };
15362        Location::new(self.parser, unsafe { &(*pointer) })
15363    }
15364
15365    /// Returns the `closing_loc` param
15366    #[must_use]
15367    pub fn closing_loc(&self) -> Location<'pr> {
15368        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).closing_loc };
15369        Location::new(self.parser, unsafe { &(*pointer) })
15370    }
15371
15372    /// Returns the `unescaped` param
15373    #[must_use]
15374    pub fn unescaped(&self) -> &[u8] {
15375        unsafe {
15376            let source = (*self.pointer).unescaped.source;
15377            if source.is_null() {
15378                return &[];
15379            }
15380            let length = (*self.pointer).unescaped.length;
15381            std::slice::from_raw_parts(source, length)
15382        }
15383    }
15384}
15385
15386impl std::fmt::Debug for XStringNode<'_> {
15387    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15388        write!(f, "XStringNode({:?}, {:?}, {:?}, {:?})", self.opening_loc(), self.content_loc(), self.closing_loc(), self.unescaped())
15389    }
15390}
15391
15392/// Represents the use of the `yield` keyword.
15393/// 
15394/// ```ruby
15395/// yield 1
15396/// ^^^^^^^
15397/// ```
15398pub struct YieldNode<'pr> {
15399    /// The pointer to the parser this node came from.
15400    parser: *const pm_parser_t,
15401
15402    /// The raw pointer to the node allocated by prism.
15403    pointer: *mut pm_yield_node_t,
15404
15405    /// The marker to indicate the lifetime of the pointer.
15406    marker: PhantomData<&'pr mut pm_yield_node_t>
15407}
15408
15409impl<'pr> YieldNode<'pr> {
15410    /// Converts this node to a generic node.
15411    #[must_use]
15412    pub const fn as_node(&self) -> Node<'pr> {
15413        Node::YieldNode { parser: self.parser, pointer: self.pointer, marker: PhantomData }
15414    }
15415
15416    /// Returns the location of this node.
15417    #[must_use]
15418    pub fn location(&self) -> Location<'pr> {
15419        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).base.location };
15420        Location::new(self.parser, unsafe { &(*pointer) })
15421    }
15422
15423    /// Returns the flags of this node.
15424    #[must_use]
15425    pub fn flags(&self) -> pm_node_flags_t {
15426        unsafe { (*self.pointer).base.flags }
15427    }
15428
15429    /// Returns the `keyword_loc` param
15430    #[must_use]
15431    pub fn keyword_loc(&self) -> Location<'pr> {
15432        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).keyword_loc };
15433        Location::new(self.parser, unsafe { &(*pointer) })
15434    }
15435
15436    /// Returns the `lparen_loc` param
15437    #[must_use]
15438    pub fn lparen_loc(&self) -> Option<Location<'pr>> {
15439        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).lparen_loc };
15440        let length = unsafe { (*pointer).length };
15441        if length == 0 {
15442            None
15443        } else {
15444            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15445        }
15446    }
15447
15448    /// Returns the `arguments` param
15449    #[must_use]
15450    pub fn arguments(&self) -> Option<ArgumentsNode<'pr>> {
15451        let node: *mut pm_arguments_node_t = unsafe { (*self.pointer).arguments };
15452        if node.is_null() {
15453            None
15454        } else {
15455            Some(ArgumentsNode { parser: self.parser, pointer: node, marker: PhantomData })
15456        }
15457    }
15458
15459    /// Returns the `rparen_loc` param
15460    #[must_use]
15461    pub fn rparen_loc(&self) -> Option<Location<'pr>> {
15462        let pointer: *mut pm_location_t = unsafe { &raw mut (*self.pointer).rparen_loc };
15463        let length = unsafe { (*pointer).length };
15464        if length == 0 {
15465            None
15466        } else {
15467            Some(Location::new(self.parser, unsafe { &(*pointer) }))
15468        }
15469    }
15470}
15471
15472impl std::fmt::Debug for YieldNode<'_> {
15473    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15474        write!(f, "YieldNode({:?}, {:?}, {:?}, {:?})", self.keyword_loc(), self.lparen_loc(), self.arguments(), self.rparen_loc())
15475    }
15476}
15477
15478/// A trait for visiting the AST.
15479pub trait Visit<'pr> {
15480   /// Called prior to visiting a node with potential child nodes.
15481   fn visit_branch_node_enter(&mut self, _node: Node<'pr>) {
15482   }
15483
15484   /// Called after visiting a node with potential child nodes.
15485   fn visit_branch_node_leave(&mut self) {
15486   }
15487
15488   /// Called prior to visiting a node that cannot have child nodes.
15489   fn visit_leaf_node_enter(&mut self, _node: Node<'pr>) {
15490   }
15491
15492   /// Called after visiting a node that cannot have child nodes.
15493   fn visit_leaf_node_leave(&mut self) {
15494   }
15495
15496   /// Visits a node.
15497   fn visit(&mut self, node: &Node<'pr>) {
15498       match node {
15499           Node::AliasGlobalVariableNode { parser, pointer, marker } => {
15500               let concrete = AliasGlobalVariableNode { parser: *parser, pointer: *pointer, marker: *marker };
15501               self.visit_branch_node_enter(concrete.as_node());
15502               self.visit_alias_global_variable_node(&concrete);
15503               self.visit_branch_node_leave();
15504           }
15505           Node::AliasMethodNode { parser, pointer, marker } => {
15506               let concrete = AliasMethodNode { parser: *parser, pointer: *pointer, marker: *marker };
15507               self.visit_branch_node_enter(concrete.as_node());
15508               self.visit_alias_method_node(&concrete);
15509               self.visit_branch_node_leave();
15510           }
15511           Node::AlternationPatternNode { parser, pointer, marker } => {
15512               let concrete = AlternationPatternNode { parser: *parser, pointer: *pointer, marker: *marker };
15513               self.visit_branch_node_enter(concrete.as_node());
15514               self.visit_alternation_pattern_node(&concrete);
15515               self.visit_branch_node_leave();
15516           }
15517           Node::AndNode { parser, pointer, marker } => {
15518               let concrete = AndNode { parser: *parser, pointer: *pointer, marker: *marker };
15519               self.visit_branch_node_enter(concrete.as_node());
15520               self.visit_and_node(&concrete);
15521               self.visit_branch_node_leave();
15522           }
15523           Node::ArgumentsNode { parser, pointer, marker } => {
15524               let concrete = ArgumentsNode { parser: *parser, pointer: *pointer, marker: *marker };
15525               self.visit_branch_node_enter(concrete.as_node());
15526               self.visit_arguments_node(&concrete);
15527               self.visit_branch_node_leave();
15528           }
15529           Node::ArrayNode { parser, pointer, marker } => {
15530               let concrete = ArrayNode { parser: *parser, pointer: *pointer, marker: *marker };
15531               self.visit_branch_node_enter(concrete.as_node());
15532               self.visit_array_node(&concrete);
15533               self.visit_branch_node_leave();
15534           }
15535           Node::ArrayPatternNode { parser, pointer, marker } => {
15536               let concrete = ArrayPatternNode { parser: *parser, pointer: *pointer, marker: *marker };
15537               self.visit_branch_node_enter(concrete.as_node());
15538               self.visit_array_pattern_node(&concrete);
15539               self.visit_branch_node_leave();
15540           }
15541           Node::AssocNode { parser, pointer, marker } => {
15542               let concrete = AssocNode { parser: *parser, pointer: *pointer, marker: *marker };
15543               self.visit_branch_node_enter(concrete.as_node());
15544               self.visit_assoc_node(&concrete);
15545               self.visit_branch_node_leave();
15546           }
15547           Node::AssocSplatNode { parser, pointer, marker } => {
15548               let concrete = AssocSplatNode { parser: *parser, pointer: *pointer, marker: *marker };
15549               self.visit_branch_node_enter(concrete.as_node());
15550               self.visit_assoc_splat_node(&concrete);
15551               self.visit_branch_node_leave();
15552           }
15553           Node::BackReferenceReadNode { parser, pointer, marker } => {
15554               let concrete = BackReferenceReadNode { parser: *parser, pointer: *pointer, marker: *marker };
15555               self.visit_leaf_node_enter(concrete.as_node());
15556               self.visit_back_reference_read_node(&concrete);
15557               self.visit_leaf_node_leave();
15558           }
15559           Node::BeginNode { parser, pointer, marker } => {
15560               let concrete = BeginNode { parser: *parser, pointer: *pointer, marker: *marker };
15561               self.visit_branch_node_enter(concrete.as_node());
15562               self.visit_begin_node(&concrete);
15563               self.visit_branch_node_leave();
15564           }
15565           Node::BlockArgumentNode { parser, pointer, marker } => {
15566               let concrete = BlockArgumentNode { parser: *parser, pointer: *pointer, marker: *marker };
15567               self.visit_branch_node_enter(concrete.as_node());
15568               self.visit_block_argument_node(&concrete);
15569               self.visit_branch_node_leave();
15570           }
15571           Node::BlockLocalVariableNode { parser, pointer, marker } => {
15572               let concrete = BlockLocalVariableNode { parser: *parser, pointer: *pointer, marker: *marker };
15573               self.visit_leaf_node_enter(concrete.as_node());
15574               self.visit_block_local_variable_node(&concrete);
15575               self.visit_leaf_node_leave();
15576           }
15577           Node::BlockNode { parser, pointer, marker } => {
15578               let concrete = BlockNode { parser: *parser, pointer: *pointer, marker: *marker };
15579               self.visit_branch_node_enter(concrete.as_node());
15580               self.visit_block_node(&concrete);
15581               self.visit_branch_node_leave();
15582           }
15583           Node::BlockParameterNode { parser, pointer, marker } => {
15584               let concrete = BlockParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
15585               self.visit_leaf_node_enter(concrete.as_node());
15586               self.visit_block_parameter_node(&concrete);
15587               self.visit_leaf_node_leave();
15588           }
15589           Node::BlockParametersNode { parser, pointer, marker } => {
15590               let concrete = BlockParametersNode { parser: *parser, pointer: *pointer, marker: *marker };
15591               self.visit_branch_node_enter(concrete.as_node());
15592               self.visit_block_parameters_node(&concrete);
15593               self.visit_branch_node_leave();
15594           }
15595           Node::BreakNode { parser, pointer, marker } => {
15596               let concrete = BreakNode { parser: *parser, pointer: *pointer, marker: *marker };
15597               self.visit_branch_node_enter(concrete.as_node());
15598               self.visit_break_node(&concrete);
15599               self.visit_branch_node_leave();
15600           }
15601           Node::CallAndWriteNode { parser, pointer, marker } => {
15602               let concrete = CallAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15603               self.visit_branch_node_enter(concrete.as_node());
15604               self.visit_call_and_write_node(&concrete);
15605               self.visit_branch_node_leave();
15606           }
15607           Node::CallNode { parser, pointer, marker } => {
15608               let concrete = CallNode { parser: *parser, pointer: *pointer, marker: *marker };
15609               self.visit_branch_node_enter(concrete.as_node());
15610               self.visit_call_node(&concrete);
15611               self.visit_branch_node_leave();
15612           }
15613           Node::CallOperatorWriteNode { parser, pointer, marker } => {
15614               let concrete = CallOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15615               self.visit_branch_node_enter(concrete.as_node());
15616               self.visit_call_operator_write_node(&concrete);
15617               self.visit_branch_node_leave();
15618           }
15619           Node::CallOrWriteNode { parser, pointer, marker } => {
15620               let concrete = CallOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15621               self.visit_branch_node_enter(concrete.as_node());
15622               self.visit_call_or_write_node(&concrete);
15623               self.visit_branch_node_leave();
15624           }
15625           Node::CallTargetNode { parser, pointer, marker } => {
15626               let concrete = CallTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15627               self.visit_branch_node_enter(concrete.as_node());
15628               self.visit_call_target_node(&concrete);
15629               self.visit_branch_node_leave();
15630           }
15631           Node::CapturePatternNode { parser, pointer, marker } => {
15632               let concrete = CapturePatternNode { parser: *parser, pointer: *pointer, marker: *marker };
15633               self.visit_branch_node_enter(concrete.as_node());
15634               self.visit_capture_pattern_node(&concrete);
15635               self.visit_branch_node_leave();
15636           }
15637           Node::CaseMatchNode { parser, pointer, marker } => {
15638               let concrete = CaseMatchNode { parser: *parser, pointer: *pointer, marker: *marker };
15639               self.visit_branch_node_enter(concrete.as_node());
15640               self.visit_case_match_node(&concrete);
15641               self.visit_branch_node_leave();
15642           }
15643           Node::CaseNode { parser, pointer, marker } => {
15644               let concrete = CaseNode { parser: *parser, pointer: *pointer, marker: *marker };
15645               self.visit_branch_node_enter(concrete.as_node());
15646               self.visit_case_node(&concrete);
15647               self.visit_branch_node_leave();
15648           }
15649           Node::ClassNode { parser, pointer, marker } => {
15650               let concrete = ClassNode { parser: *parser, pointer: *pointer, marker: *marker };
15651               self.visit_branch_node_enter(concrete.as_node());
15652               self.visit_class_node(&concrete);
15653               self.visit_branch_node_leave();
15654           }
15655           Node::ClassVariableAndWriteNode { parser, pointer, marker } => {
15656               let concrete = ClassVariableAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15657               self.visit_branch_node_enter(concrete.as_node());
15658               self.visit_class_variable_and_write_node(&concrete);
15659               self.visit_branch_node_leave();
15660           }
15661           Node::ClassVariableOperatorWriteNode { parser, pointer, marker } => {
15662               let concrete = ClassVariableOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15663               self.visit_branch_node_enter(concrete.as_node());
15664               self.visit_class_variable_operator_write_node(&concrete);
15665               self.visit_branch_node_leave();
15666           }
15667           Node::ClassVariableOrWriteNode { parser, pointer, marker } => {
15668               let concrete = ClassVariableOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15669               self.visit_branch_node_enter(concrete.as_node());
15670               self.visit_class_variable_or_write_node(&concrete);
15671               self.visit_branch_node_leave();
15672           }
15673           Node::ClassVariableReadNode { parser, pointer, marker } => {
15674               let concrete = ClassVariableReadNode { parser: *parser, pointer: *pointer, marker: *marker };
15675               self.visit_leaf_node_enter(concrete.as_node());
15676               self.visit_class_variable_read_node(&concrete);
15677               self.visit_leaf_node_leave();
15678           }
15679           Node::ClassVariableTargetNode { parser, pointer, marker } => {
15680               let concrete = ClassVariableTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15681               self.visit_leaf_node_enter(concrete.as_node());
15682               self.visit_class_variable_target_node(&concrete);
15683               self.visit_leaf_node_leave();
15684           }
15685           Node::ClassVariableWriteNode { parser, pointer, marker } => {
15686               let concrete = ClassVariableWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15687               self.visit_branch_node_enter(concrete.as_node());
15688               self.visit_class_variable_write_node(&concrete);
15689               self.visit_branch_node_leave();
15690           }
15691           Node::ConstantAndWriteNode { parser, pointer, marker } => {
15692               let concrete = ConstantAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15693               self.visit_branch_node_enter(concrete.as_node());
15694               self.visit_constant_and_write_node(&concrete);
15695               self.visit_branch_node_leave();
15696           }
15697           Node::ConstantOperatorWriteNode { parser, pointer, marker } => {
15698               let concrete = ConstantOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15699               self.visit_branch_node_enter(concrete.as_node());
15700               self.visit_constant_operator_write_node(&concrete);
15701               self.visit_branch_node_leave();
15702           }
15703           Node::ConstantOrWriteNode { parser, pointer, marker } => {
15704               let concrete = ConstantOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15705               self.visit_branch_node_enter(concrete.as_node());
15706               self.visit_constant_or_write_node(&concrete);
15707               self.visit_branch_node_leave();
15708           }
15709           Node::ConstantPathAndWriteNode { parser, pointer, marker } => {
15710               let concrete = ConstantPathAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15711               self.visit_branch_node_enter(concrete.as_node());
15712               self.visit_constant_path_and_write_node(&concrete);
15713               self.visit_branch_node_leave();
15714           }
15715           Node::ConstantPathNode { parser, pointer, marker } => {
15716               let concrete = ConstantPathNode { parser: *parser, pointer: *pointer, marker: *marker };
15717               self.visit_branch_node_enter(concrete.as_node());
15718               self.visit_constant_path_node(&concrete);
15719               self.visit_branch_node_leave();
15720           }
15721           Node::ConstantPathOperatorWriteNode { parser, pointer, marker } => {
15722               let concrete = ConstantPathOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15723               self.visit_branch_node_enter(concrete.as_node());
15724               self.visit_constant_path_operator_write_node(&concrete);
15725               self.visit_branch_node_leave();
15726           }
15727           Node::ConstantPathOrWriteNode { parser, pointer, marker } => {
15728               let concrete = ConstantPathOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15729               self.visit_branch_node_enter(concrete.as_node());
15730               self.visit_constant_path_or_write_node(&concrete);
15731               self.visit_branch_node_leave();
15732           }
15733           Node::ConstantPathTargetNode { parser, pointer, marker } => {
15734               let concrete = ConstantPathTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15735               self.visit_branch_node_enter(concrete.as_node());
15736               self.visit_constant_path_target_node(&concrete);
15737               self.visit_branch_node_leave();
15738           }
15739           Node::ConstantPathWriteNode { parser, pointer, marker } => {
15740               let concrete = ConstantPathWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15741               self.visit_branch_node_enter(concrete.as_node());
15742               self.visit_constant_path_write_node(&concrete);
15743               self.visit_branch_node_leave();
15744           }
15745           Node::ConstantReadNode { parser, pointer, marker } => {
15746               let concrete = ConstantReadNode { parser: *parser, pointer: *pointer, marker: *marker };
15747               self.visit_leaf_node_enter(concrete.as_node());
15748               self.visit_constant_read_node(&concrete);
15749               self.visit_leaf_node_leave();
15750           }
15751           Node::ConstantTargetNode { parser, pointer, marker } => {
15752               let concrete = ConstantTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15753               self.visit_leaf_node_enter(concrete.as_node());
15754               self.visit_constant_target_node(&concrete);
15755               self.visit_leaf_node_leave();
15756           }
15757           Node::ConstantWriteNode { parser, pointer, marker } => {
15758               let concrete = ConstantWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15759               self.visit_branch_node_enter(concrete.as_node());
15760               self.visit_constant_write_node(&concrete);
15761               self.visit_branch_node_leave();
15762           }
15763           Node::DefNode { parser, pointer, marker } => {
15764               let concrete = DefNode { parser: *parser, pointer: *pointer, marker: *marker };
15765               self.visit_branch_node_enter(concrete.as_node());
15766               self.visit_def_node(&concrete);
15767               self.visit_branch_node_leave();
15768           }
15769           Node::DefinedNode { parser, pointer, marker } => {
15770               let concrete = DefinedNode { parser: *parser, pointer: *pointer, marker: *marker };
15771               self.visit_branch_node_enter(concrete.as_node());
15772               self.visit_defined_node(&concrete);
15773               self.visit_branch_node_leave();
15774           }
15775           Node::ElseNode { parser, pointer, marker } => {
15776               let concrete = ElseNode { parser: *parser, pointer: *pointer, marker: *marker };
15777               self.visit_branch_node_enter(concrete.as_node());
15778               self.visit_else_node(&concrete);
15779               self.visit_branch_node_leave();
15780           }
15781           Node::EmbeddedStatementsNode { parser, pointer, marker } => {
15782               let concrete = EmbeddedStatementsNode { parser: *parser, pointer: *pointer, marker: *marker };
15783               self.visit_branch_node_enter(concrete.as_node());
15784               self.visit_embedded_statements_node(&concrete);
15785               self.visit_branch_node_leave();
15786           }
15787           Node::EmbeddedVariableNode { parser, pointer, marker } => {
15788               let concrete = EmbeddedVariableNode { parser: *parser, pointer: *pointer, marker: *marker };
15789               self.visit_branch_node_enter(concrete.as_node());
15790               self.visit_embedded_variable_node(&concrete);
15791               self.visit_branch_node_leave();
15792           }
15793           Node::EnsureNode { parser, pointer, marker } => {
15794               let concrete = EnsureNode { parser: *parser, pointer: *pointer, marker: *marker };
15795               self.visit_branch_node_enter(concrete.as_node());
15796               self.visit_ensure_node(&concrete);
15797               self.visit_branch_node_leave();
15798           }
15799           Node::ErrorRecoveryNode { parser, pointer, marker } => {
15800               let concrete = ErrorRecoveryNode { parser: *parser, pointer: *pointer, marker: *marker };
15801               self.visit_branch_node_enter(concrete.as_node());
15802               self.visit_error_recovery_node(&concrete);
15803               self.visit_branch_node_leave();
15804           }
15805           Node::FalseNode { parser, pointer, marker } => {
15806               let concrete = FalseNode { parser: *parser, pointer: *pointer, marker: *marker };
15807               self.visit_leaf_node_enter(concrete.as_node());
15808               self.visit_false_node(&concrete);
15809               self.visit_leaf_node_leave();
15810           }
15811           Node::FindPatternNode { parser, pointer, marker } => {
15812               let concrete = FindPatternNode { parser: *parser, pointer: *pointer, marker: *marker };
15813               self.visit_branch_node_enter(concrete.as_node());
15814               self.visit_find_pattern_node(&concrete);
15815               self.visit_branch_node_leave();
15816           }
15817           Node::FlipFlopNode { parser, pointer, marker } => {
15818               let concrete = FlipFlopNode { parser: *parser, pointer: *pointer, marker: *marker };
15819               self.visit_branch_node_enter(concrete.as_node());
15820               self.visit_flip_flop_node(&concrete);
15821               self.visit_branch_node_leave();
15822           }
15823           Node::FloatNode { parser, pointer, marker } => {
15824               let concrete = FloatNode { parser: *parser, pointer: *pointer, marker: *marker };
15825               self.visit_leaf_node_enter(concrete.as_node());
15826               self.visit_float_node(&concrete);
15827               self.visit_leaf_node_leave();
15828           }
15829           Node::ForNode { parser, pointer, marker } => {
15830               let concrete = ForNode { parser: *parser, pointer: *pointer, marker: *marker };
15831               self.visit_branch_node_enter(concrete.as_node());
15832               self.visit_for_node(&concrete);
15833               self.visit_branch_node_leave();
15834           }
15835           Node::ForwardingArgumentsNode { parser, pointer, marker } => {
15836               let concrete = ForwardingArgumentsNode { parser: *parser, pointer: *pointer, marker: *marker };
15837               self.visit_leaf_node_enter(concrete.as_node());
15838               self.visit_forwarding_arguments_node(&concrete);
15839               self.visit_leaf_node_leave();
15840           }
15841           Node::ForwardingParameterNode { parser, pointer, marker } => {
15842               let concrete = ForwardingParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
15843               self.visit_leaf_node_enter(concrete.as_node());
15844               self.visit_forwarding_parameter_node(&concrete);
15845               self.visit_leaf_node_leave();
15846           }
15847           Node::ForwardingSuperNode { parser, pointer, marker } => {
15848               let concrete = ForwardingSuperNode { parser: *parser, pointer: *pointer, marker: *marker };
15849               self.visit_branch_node_enter(concrete.as_node());
15850               self.visit_forwarding_super_node(&concrete);
15851               self.visit_branch_node_leave();
15852           }
15853           Node::GlobalVariableAndWriteNode { parser, pointer, marker } => {
15854               let concrete = GlobalVariableAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15855               self.visit_branch_node_enter(concrete.as_node());
15856               self.visit_global_variable_and_write_node(&concrete);
15857               self.visit_branch_node_leave();
15858           }
15859           Node::GlobalVariableOperatorWriteNode { parser, pointer, marker } => {
15860               let concrete = GlobalVariableOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15861               self.visit_branch_node_enter(concrete.as_node());
15862               self.visit_global_variable_operator_write_node(&concrete);
15863               self.visit_branch_node_leave();
15864           }
15865           Node::GlobalVariableOrWriteNode { parser, pointer, marker } => {
15866               let concrete = GlobalVariableOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15867               self.visit_branch_node_enter(concrete.as_node());
15868               self.visit_global_variable_or_write_node(&concrete);
15869               self.visit_branch_node_leave();
15870           }
15871           Node::GlobalVariableReadNode { parser, pointer, marker } => {
15872               let concrete = GlobalVariableReadNode { parser: *parser, pointer: *pointer, marker: *marker };
15873               self.visit_leaf_node_enter(concrete.as_node());
15874               self.visit_global_variable_read_node(&concrete);
15875               self.visit_leaf_node_leave();
15876           }
15877           Node::GlobalVariableTargetNode { parser, pointer, marker } => {
15878               let concrete = GlobalVariableTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15879               self.visit_leaf_node_enter(concrete.as_node());
15880               self.visit_global_variable_target_node(&concrete);
15881               self.visit_leaf_node_leave();
15882           }
15883           Node::GlobalVariableWriteNode { parser, pointer, marker } => {
15884               let concrete = GlobalVariableWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15885               self.visit_branch_node_enter(concrete.as_node());
15886               self.visit_global_variable_write_node(&concrete);
15887               self.visit_branch_node_leave();
15888           }
15889           Node::HashNode { parser, pointer, marker } => {
15890               let concrete = HashNode { parser: *parser, pointer: *pointer, marker: *marker };
15891               self.visit_branch_node_enter(concrete.as_node());
15892               self.visit_hash_node(&concrete);
15893               self.visit_branch_node_leave();
15894           }
15895           Node::HashPatternNode { parser, pointer, marker } => {
15896               let concrete = HashPatternNode { parser: *parser, pointer: *pointer, marker: *marker };
15897               self.visit_branch_node_enter(concrete.as_node());
15898               self.visit_hash_pattern_node(&concrete);
15899               self.visit_branch_node_leave();
15900           }
15901           Node::IfNode { parser, pointer, marker } => {
15902               let concrete = IfNode { parser: *parser, pointer: *pointer, marker: *marker };
15903               self.visit_branch_node_enter(concrete.as_node());
15904               self.visit_if_node(&concrete);
15905               self.visit_branch_node_leave();
15906           }
15907           Node::ImaginaryNode { parser, pointer, marker } => {
15908               let concrete = ImaginaryNode { parser: *parser, pointer: *pointer, marker: *marker };
15909               self.visit_branch_node_enter(concrete.as_node());
15910               self.visit_imaginary_node(&concrete);
15911               self.visit_branch_node_leave();
15912           }
15913           Node::ImplicitNode { parser, pointer, marker } => {
15914               let concrete = ImplicitNode { parser: *parser, pointer: *pointer, marker: *marker };
15915               self.visit_branch_node_enter(concrete.as_node());
15916               self.visit_implicit_node(&concrete);
15917               self.visit_branch_node_leave();
15918           }
15919           Node::ImplicitRestNode { parser, pointer, marker } => {
15920               let concrete = ImplicitRestNode { parser: *parser, pointer: *pointer, marker: *marker };
15921               self.visit_leaf_node_enter(concrete.as_node());
15922               self.visit_implicit_rest_node(&concrete);
15923               self.visit_leaf_node_leave();
15924           }
15925           Node::InNode { parser, pointer, marker } => {
15926               let concrete = InNode { parser: *parser, pointer: *pointer, marker: *marker };
15927               self.visit_branch_node_enter(concrete.as_node());
15928               self.visit_in_node(&concrete);
15929               self.visit_branch_node_leave();
15930           }
15931           Node::IndexAndWriteNode { parser, pointer, marker } => {
15932               let concrete = IndexAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15933               self.visit_branch_node_enter(concrete.as_node());
15934               self.visit_index_and_write_node(&concrete);
15935               self.visit_branch_node_leave();
15936           }
15937           Node::IndexOperatorWriteNode { parser, pointer, marker } => {
15938               let concrete = IndexOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15939               self.visit_branch_node_enter(concrete.as_node());
15940               self.visit_index_operator_write_node(&concrete);
15941               self.visit_branch_node_leave();
15942           }
15943           Node::IndexOrWriteNode { parser, pointer, marker } => {
15944               let concrete = IndexOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15945               self.visit_branch_node_enter(concrete.as_node());
15946               self.visit_index_or_write_node(&concrete);
15947               self.visit_branch_node_leave();
15948           }
15949           Node::IndexTargetNode { parser, pointer, marker } => {
15950               let concrete = IndexTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15951               self.visit_branch_node_enter(concrete.as_node());
15952               self.visit_index_target_node(&concrete);
15953               self.visit_branch_node_leave();
15954           }
15955           Node::InstanceVariableAndWriteNode { parser, pointer, marker } => {
15956               let concrete = InstanceVariableAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15957               self.visit_branch_node_enter(concrete.as_node());
15958               self.visit_instance_variable_and_write_node(&concrete);
15959               self.visit_branch_node_leave();
15960           }
15961           Node::InstanceVariableOperatorWriteNode { parser, pointer, marker } => {
15962               let concrete = InstanceVariableOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15963               self.visit_branch_node_enter(concrete.as_node());
15964               self.visit_instance_variable_operator_write_node(&concrete);
15965               self.visit_branch_node_leave();
15966           }
15967           Node::InstanceVariableOrWriteNode { parser, pointer, marker } => {
15968               let concrete = InstanceVariableOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15969               self.visit_branch_node_enter(concrete.as_node());
15970               self.visit_instance_variable_or_write_node(&concrete);
15971               self.visit_branch_node_leave();
15972           }
15973           Node::InstanceVariableReadNode { parser, pointer, marker } => {
15974               let concrete = InstanceVariableReadNode { parser: *parser, pointer: *pointer, marker: *marker };
15975               self.visit_leaf_node_enter(concrete.as_node());
15976               self.visit_instance_variable_read_node(&concrete);
15977               self.visit_leaf_node_leave();
15978           }
15979           Node::InstanceVariableTargetNode { parser, pointer, marker } => {
15980               let concrete = InstanceVariableTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
15981               self.visit_leaf_node_enter(concrete.as_node());
15982               self.visit_instance_variable_target_node(&concrete);
15983               self.visit_leaf_node_leave();
15984           }
15985           Node::InstanceVariableWriteNode { parser, pointer, marker } => {
15986               let concrete = InstanceVariableWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
15987               self.visit_branch_node_enter(concrete.as_node());
15988               self.visit_instance_variable_write_node(&concrete);
15989               self.visit_branch_node_leave();
15990           }
15991           Node::IntegerNode { parser, pointer, marker } => {
15992               let concrete = IntegerNode { parser: *parser, pointer: *pointer, marker: *marker };
15993               self.visit_leaf_node_enter(concrete.as_node());
15994               self.visit_integer_node(&concrete);
15995               self.visit_leaf_node_leave();
15996           }
15997           Node::InterpolatedMatchLastLineNode { parser, pointer, marker } => {
15998               let concrete = InterpolatedMatchLastLineNode { parser: *parser, pointer: *pointer, marker: *marker };
15999               self.visit_branch_node_enter(concrete.as_node());
16000               self.visit_interpolated_match_last_line_node(&concrete);
16001               self.visit_branch_node_leave();
16002           }
16003           Node::InterpolatedRegularExpressionNode { parser, pointer, marker } => {
16004               let concrete = InterpolatedRegularExpressionNode { parser: *parser, pointer: *pointer, marker: *marker };
16005               self.visit_branch_node_enter(concrete.as_node());
16006               self.visit_interpolated_regular_expression_node(&concrete);
16007               self.visit_branch_node_leave();
16008           }
16009           Node::InterpolatedStringNode { parser, pointer, marker } => {
16010               let concrete = InterpolatedStringNode { parser: *parser, pointer: *pointer, marker: *marker };
16011               self.visit_branch_node_enter(concrete.as_node());
16012               self.visit_interpolated_string_node(&concrete);
16013               self.visit_branch_node_leave();
16014           }
16015           Node::InterpolatedSymbolNode { parser, pointer, marker } => {
16016               let concrete = InterpolatedSymbolNode { parser: *parser, pointer: *pointer, marker: *marker };
16017               self.visit_branch_node_enter(concrete.as_node());
16018               self.visit_interpolated_symbol_node(&concrete);
16019               self.visit_branch_node_leave();
16020           }
16021           Node::InterpolatedXStringNode { parser, pointer, marker } => {
16022               let concrete = InterpolatedXStringNode { parser: *parser, pointer: *pointer, marker: *marker };
16023               self.visit_branch_node_enter(concrete.as_node());
16024               self.visit_interpolated_x_string_node(&concrete);
16025               self.visit_branch_node_leave();
16026           }
16027           Node::ItLocalVariableReadNode { parser, pointer, marker } => {
16028               let concrete = ItLocalVariableReadNode { parser: *parser, pointer: *pointer, marker: *marker };
16029               self.visit_leaf_node_enter(concrete.as_node());
16030               self.visit_it_local_variable_read_node(&concrete);
16031               self.visit_leaf_node_leave();
16032           }
16033           Node::ItParametersNode { parser, pointer, marker } => {
16034               let concrete = ItParametersNode { parser: *parser, pointer: *pointer, marker: *marker };
16035               self.visit_leaf_node_enter(concrete.as_node());
16036               self.visit_it_parameters_node(&concrete);
16037               self.visit_leaf_node_leave();
16038           }
16039           Node::KeywordHashNode { parser, pointer, marker } => {
16040               let concrete = KeywordHashNode { parser: *parser, pointer: *pointer, marker: *marker };
16041               self.visit_branch_node_enter(concrete.as_node());
16042               self.visit_keyword_hash_node(&concrete);
16043               self.visit_branch_node_leave();
16044           }
16045           Node::KeywordRestParameterNode { parser, pointer, marker } => {
16046               let concrete = KeywordRestParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16047               self.visit_leaf_node_enter(concrete.as_node());
16048               self.visit_keyword_rest_parameter_node(&concrete);
16049               self.visit_leaf_node_leave();
16050           }
16051           Node::LambdaNode { parser, pointer, marker } => {
16052               let concrete = LambdaNode { parser: *parser, pointer: *pointer, marker: *marker };
16053               self.visit_branch_node_enter(concrete.as_node());
16054               self.visit_lambda_node(&concrete);
16055               self.visit_branch_node_leave();
16056           }
16057           Node::LocalVariableAndWriteNode { parser, pointer, marker } => {
16058               let concrete = LocalVariableAndWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
16059               self.visit_branch_node_enter(concrete.as_node());
16060               self.visit_local_variable_and_write_node(&concrete);
16061               self.visit_branch_node_leave();
16062           }
16063           Node::LocalVariableOperatorWriteNode { parser, pointer, marker } => {
16064               let concrete = LocalVariableOperatorWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
16065               self.visit_branch_node_enter(concrete.as_node());
16066               self.visit_local_variable_operator_write_node(&concrete);
16067               self.visit_branch_node_leave();
16068           }
16069           Node::LocalVariableOrWriteNode { parser, pointer, marker } => {
16070               let concrete = LocalVariableOrWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
16071               self.visit_branch_node_enter(concrete.as_node());
16072               self.visit_local_variable_or_write_node(&concrete);
16073               self.visit_branch_node_leave();
16074           }
16075           Node::LocalVariableReadNode { parser, pointer, marker } => {
16076               let concrete = LocalVariableReadNode { parser: *parser, pointer: *pointer, marker: *marker };
16077               self.visit_leaf_node_enter(concrete.as_node());
16078               self.visit_local_variable_read_node(&concrete);
16079               self.visit_leaf_node_leave();
16080           }
16081           Node::LocalVariableTargetNode { parser, pointer, marker } => {
16082               let concrete = LocalVariableTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
16083               self.visit_leaf_node_enter(concrete.as_node());
16084               self.visit_local_variable_target_node(&concrete);
16085               self.visit_leaf_node_leave();
16086           }
16087           Node::LocalVariableWriteNode { parser, pointer, marker } => {
16088               let concrete = LocalVariableWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
16089               self.visit_branch_node_enter(concrete.as_node());
16090               self.visit_local_variable_write_node(&concrete);
16091               self.visit_branch_node_leave();
16092           }
16093           Node::MatchLastLineNode { parser, pointer, marker } => {
16094               let concrete = MatchLastLineNode { parser: *parser, pointer: *pointer, marker: *marker };
16095               self.visit_leaf_node_enter(concrete.as_node());
16096               self.visit_match_last_line_node(&concrete);
16097               self.visit_leaf_node_leave();
16098           }
16099           Node::MatchPredicateNode { parser, pointer, marker } => {
16100               let concrete = MatchPredicateNode { parser: *parser, pointer: *pointer, marker: *marker };
16101               self.visit_branch_node_enter(concrete.as_node());
16102               self.visit_match_predicate_node(&concrete);
16103               self.visit_branch_node_leave();
16104           }
16105           Node::MatchRequiredNode { parser, pointer, marker } => {
16106               let concrete = MatchRequiredNode { parser: *parser, pointer: *pointer, marker: *marker };
16107               self.visit_branch_node_enter(concrete.as_node());
16108               self.visit_match_required_node(&concrete);
16109               self.visit_branch_node_leave();
16110           }
16111           Node::MatchWriteNode { parser, pointer, marker } => {
16112               let concrete = MatchWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
16113               self.visit_branch_node_enter(concrete.as_node());
16114               self.visit_match_write_node(&concrete);
16115               self.visit_branch_node_leave();
16116           }
16117           Node::ModuleNode { parser, pointer, marker } => {
16118               let concrete = ModuleNode { parser: *parser, pointer: *pointer, marker: *marker };
16119               self.visit_branch_node_enter(concrete.as_node());
16120               self.visit_module_node(&concrete);
16121               self.visit_branch_node_leave();
16122           }
16123           Node::MultiTargetNode { parser, pointer, marker } => {
16124               let concrete = MultiTargetNode { parser: *parser, pointer: *pointer, marker: *marker };
16125               self.visit_branch_node_enter(concrete.as_node());
16126               self.visit_multi_target_node(&concrete);
16127               self.visit_branch_node_leave();
16128           }
16129           Node::MultiWriteNode { parser, pointer, marker } => {
16130               let concrete = MultiWriteNode { parser: *parser, pointer: *pointer, marker: *marker };
16131               self.visit_branch_node_enter(concrete.as_node());
16132               self.visit_multi_write_node(&concrete);
16133               self.visit_branch_node_leave();
16134           }
16135           Node::NextNode { parser, pointer, marker } => {
16136               let concrete = NextNode { parser: *parser, pointer: *pointer, marker: *marker };
16137               self.visit_branch_node_enter(concrete.as_node());
16138               self.visit_next_node(&concrete);
16139               self.visit_branch_node_leave();
16140           }
16141           Node::NilNode { parser, pointer, marker } => {
16142               let concrete = NilNode { parser: *parser, pointer: *pointer, marker: *marker };
16143               self.visit_leaf_node_enter(concrete.as_node());
16144               self.visit_nil_node(&concrete);
16145               self.visit_leaf_node_leave();
16146           }
16147           Node::NoBlockParameterNode { parser, pointer, marker } => {
16148               let concrete = NoBlockParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16149               self.visit_leaf_node_enter(concrete.as_node());
16150               self.visit_no_block_parameter_node(&concrete);
16151               self.visit_leaf_node_leave();
16152           }
16153           Node::NoKeywordsParameterNode { parser, pointer, marker } => {
16154               let concrete = NoKeywordsParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16155               self.visit_leaf_node_enter(concrete.as_node());
16156               self.visit_no_keywords_parameter_node(&concrete);
16157               self.visit_leaf_node_leave();
16158           }
16159           Node::NumberedParametersNode { parser, pointer, marker } => {
16160               let concrete = NumberedParametersNode { parser: *parser, pointer: *pointer, marker: *marker };
16161               self.visit_leaf_node_enter(concrete.as_node());
16162               self.visit_numbered_parameters_node(&concrete);
16163               self.visit_leaf_node_leave();
16164           }
16165           Node::NumberedReferenceReadNode { parser, pointer, marker } => {
16166               let concrete = NumberedReferenceReadNode { parser: *parser, pointer: *pointer, marker: *marker };
16167               self.visit_leaf_node_enter(concrete.as_node());
16168               self.visit_numbered_reference_read_node(&concrete);
16169               self.visit_leaf_node_leave();
16170           }
16171           Node::OptionalKeywordParameterNode { parser, pointer, marker } => {
16172               let concrete = OptionalKeywordParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16173               self.visit_branch_node_enter(concrete.as_node());
16174               self.visit_optional_keyword_parameter_node(&concrete);
16175               self.visit_branch_node_leave();
16176           }
16177           Node::OptionalParameterNode { parser, pointer, marker } => {
16178               let concrete = OptionalParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16179               self.visit_branch_node_enter(concrete.as_node());
16180               self.visit_optional_parameter_node(&concrete);
16181               self.visit_branch_node_leave();
16182           }
16183           Node::OrNode { parser, pointer, marker } => {
16184               let concrete = OrNode { parser: *parser, pointer: *pointer, marker: *marker };
16185               self.visit_branch_node_enter(concrete.as_node());
16186               self.visit_or_node(&concrete);
16187               self.visit_branch_node_leave();
16188           }
16189           Node::ParametersNode { parser, pointer, marker } => {
16190               let concrete = ParametersNode { parser: *parser, pointer: *pointer, marker: *marker };
16191               self.visit_branch_node_enter(concrete.as_node());
16192               self.visit_parameters_node(&concrete);
16193               self.visit_branch_node_leave();
16194           }
16195           Node::ParenthesesNode { parser, pointer, marker } => {
16196               let concrete = ParenthesesNode { parser: *parser, pointer: *pointer, marker: *marker };
16197               self.visit_branch_node_enter(concrete.as_node());
16198               self.visit_parentheses_node(&concrete);
16199               self.visit_branch_node_leave();
16200           }
16201           Node::PinnedExpressionNode { parser, pointer, marker } => {
16202               let concrete = PinnedExpressionNode { parser: *parser, pointer: *pointer, marker: *marker };
16203               self.visit_branch_node_enter(concrete.as_node());
16204               self.visit_pinned_expression_node(&concrete);
16205               self.visit_branch_node_leave();
16206           }
16207           Node::PinnedVariableNode { parser, pointer, marker } => {
16208               let concrete = PinnedVariableNode { parser: *parser, pointer: *pointer, marker: *marker };
16209               self.visit_branch_node_enter(concrete.as_node());
16210               self.visit_pinned_variable_node(&concrete);
16211               self.visit_branch_node_leave();
16212           }
16213           Node::PostExecutionNode { parser, pointer, marker } => {
16214               let concrete = PostExecutionNode { parser: *parser, pointer: *pointer, marker: *marker };
16215               self.visit_branch_node_enter(concrete.as_node());
16216               self.visit_post_execution_node(&concrete);
16217               self.visit_branch_node_leave();
16218           }
16219           Node::PreExecutionNode { parser, pointer, marker } => {
16220               let concrete = PreExecutionNode { parser: *parser, pointer: *pointer, marker: *marker };
16221               self.visit_branch_node_enter(concrete.as_node());
16222               self.visit_pre_execution_node(&concrete);
16223               self.visit_branch_node_leave();
16224           }
16225           Node::ProgramNode { parser, pointer, marker } => {
16226               let concrete = ProgramNode { parser: *parser, pointer: *pointer, marker: *marker };
16227               self.visit_branch_node_enter(concrete.as_node());
16228               self.visit_program_node(&concrete);
16229               self.visit_branch_node_leave();
16230           }
16231           Node::RangeNode { parser, pointer, marker } => {
16232               let concrete = RangeNode { parser: *parser, pointer: *pointer, marker: *marker };
16233               self.visit_branch_node_enter(concrete.as_node());
16234               self.visit_range_node(&concrete);
16235               self.visit_branch_node_leave();
16236           }
16237           Node::RationalNode { parser, pointer, marker } => {
16238               let concrete = RationalNode { parser: *parser, pointer: *pointer, marker: *marker };
16239               self.visit_leaf_node_enter(concrete.as_node());
16240               self.visit_rational_node(&concrete);
16241               self.visit_leaf_node_leave();
16242           }
16243           Node::RedoNode { parser, pointer, marker } => {
16244               let concrete = RedoNode { parser: *parser, pointer: *pointer, marker: *marker };
16245               self.visit_leaf_node_enter(concrete.as_node());
16246               self.visit_redo_node(&concrete);
16247               self.visit_leaf_node_leave();
16248           }
16249           Node::RegularExpressionNode { parser, pointer, marker } => {
16250               let concrete = RegularExpressionNode { parser: *parser, pointer: *pointer, marker: *marker };
16251               self.visit_leaf_node_enter(concrete.as_node());
16252               self.visit_regular_expression_node(&concrete);
16253               self.visit_leaf_node_leave();
16254           }
16255           Node::RequiredKeywordParameterNode { parser, pointer, marker } => {
16256               let concrete = RequiredKeywordParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16257               self.visit_leaf_node_enter(concrete.as_node());
16258               self.visit_required_keyword_parameter_node(&concrete);
16259               self.visit_leaf_node_leave();
16260           }
16261           Node::RequiredParameterNode { parser, pointer, marker } => {
16262               let concrete = RequiredParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16263               self.visit_leaf_node_enter(concrete.as_node());
16264               self.visit_required_parameter_node(&concrete);
16265               self.visit_leaf_node_leave();
16266           }
16267           Node::RescueModifierNode { parser, pointer, marker } => {
16268               let concrete = RescueModifierNode { parser: *parser, pointer: *pointer, marker: *marker };
16269               self.visit_branch_node_enter(concrete.as_node());
16270               self.visit_rescue_modifier_node(&concrete);
16271               self.visit_branch_node_leave();
16272           }
16273           Node::RescueNode { parser, pointer, marker } => {
16274               let concrete = RescueNode { parser: *parser, pointer: *pointer, marker: *marker };
16275               self.visit_branch_node_enter(concrete.as_node());
16276               self.visit_rescue_node(&concrete);
16277               self.visit_branch_node_leave();
16278           }
16279           Node::RestParameterNode { parser, pointer, marker } => {
16280               let concrete = RestParameterNode { parser: *parser, pointer: *pointer, marker: *marker };
16281               self.visit_leaf_node_enter(concrete.as_node());
16282               self.visit_rest_parameter_node(&concrete);
16283               self.visit_leaf_node_leave();
16284           }
16285           Node::RetryNode { parser, pointer, marker } => {
16286               let concrete = RetryNode { parser: *parser, pointer: *pointer, marker: *marker };
16287               self.visit_leaf_node_enter(concrete.as_node());
16288               self.visit_retry_node(&concrete);
16289               self.visit_leaf_node_leave();
16290           }
16291           Node::ReturnNode { parser, pointer, marker } => {
16292               let concrete = ReturnNode { parser: *parser, pointer: *pointer, marker: *marker };
16293               self.visit_branch_node_enter(concrete.as_node());
16294               self.visit_return_node(&concrete);
16295               self.visit_branch_node_leave();
16296           }
16297           Node::SelfNode { parser, pointer, marker } => {
16298               let concrete = SelfNode { parser: *parser, pointer: *pointer, marker: *marker };
16299               self.visit_leaf_node_enter(concrete.as_node());
16300               self.visit_self_node(&concrete);
16301               self.visit_leaf_node_leave();
16302           }
16303           Node::ShareableConstantNode { parser, pointer, marker } => {
16304               let concrete = ShareableConstantNode { parser: *parser, pointer: *pointer, marker: *marker };
16305               self.visit_branch_node_enter(concrete.as_node());
16306               self.visit_shareable_constant_node(&concrete);
16307               self.visit_branch_node_leave();
16308           }
16309           Node::SingletonClassNode { parser, pointer, marker } => {
16310               let concrete = SingletonClassNode { parser: *parser, pointer: *pointer, marker: *marker };
16311               self.visit_branch_node_enter(concrete.as_node());
16312               self.visit_singleton_class_node(&concrete);
16313               self.visit_branch_node_leave();
16314           }
16315           Node::SourceEncodingNode { parser, pointer, marker } => {
16316               let concrete = SourceEncodingNode { parser: *parser, pointer: *pointer, marker: *marker };
16317               self.visit_leaf_node_enter(concrete.as_node());
16318               self.visit_source_encoding_node(&concrete);
16319               self.visit_leaf_node_leave();
16320           }
16321           Node::SourceFileNode { parser, pointer, marker } => {
16322               let concrete = SourceFileNode { parser: *parser, pointer: *pointer, marker: *marker };
16323               self.visit_leaf_node_enter(concrete.as_node());
16324               self.visit_source_file_node(&concrete);
16325               self.visit_leaf_node_leave();
16326           }
16327           Node::SourceLineNode { parser, pointer, marker } => {
16328               let concrete = SourceLineNode { parser: *parser, pointer: *pointer, marker: *marker };
16329               self.visit_leaf_node_enter(concrete.as_node());
16330               self.visit_source_line_node(&concrete);
16331               self.visit_leaf_node_leave();
16332           }
16333           Node::SplatNode { parser, pointer, marker } => {
16334               let concrete = SplatNode { parser: *parser, pointer: *pointer, marker: *marker };
16335               self.visit_branch_node_enter(concrete.as_node());
16336               self.visit_splat_node(&concrete);
16337               self.visit_branch_node_leave();
16338           }
16339           Node::StatementsNode { parser, pointer, marker } => {
16340               let concrete = StatementsNode { parser: *parser, pointer: *pointer, marker: *marker };
16341               self.visit_branch_node_enter(concrete.as_node());
16342               self.visit_statements_node(&concrete);
16343               self.visit_branch_node_leave();
16344           }
16345           Node::StringNode { parser, pointer, marker } => {
16346               let concrete = StringNode { parser: *parser, pointer: *pointer, marker: *marker };
16347               self.visit_leaf_node_enter(concrete.as_node());
16348               self.visit_string_node(&concrete);
16349               self.visit_leaf_node_leave();
16350           }
16351           Node::SuperNode { parser, pointer, marker } => {
16352               let concrete = SuperNode { parser: *parser, pointer: *pointer, marker: *marker };
16353               self.visit_branch_node_enter(concrete.as_node());
16354               self.visit_super_node(&concrete);
16355               self.visit_branch_node_leave();
16356           }
16357           Node::SymbolNode { parser, pointer, marker } => {
16358               let concrete = SymbolNode { parser: *parser, pointer: *pointer, marker: *marker };
16359               self.visit_leaf_node_enter(concrete.as_node());
16360               self.visit_symbol_node(&concrete);
16361               self.visit_leaf_node_leave();
16362           }
16363           Node::TrueNode { parser, pointer, marker } => {
16364               let concrete = TrueNode { parser: *parser, pointer: *pointer, marker: *marker };
16365               self.visit_leaf_node_enter(concrete.as_node());
16366               self.visit_true_node(&concrete);
16367               self.visit_leaf_node_leave();
16368           }
16369           Node::UndefNode { parser, pointer, marker } => {
16370               let concrete = UndefNode { parser: *parser, pointer: *pointer, marker: *marker };
16371               self.visit_branch_node_enter(concrete.as_node());
16372               self.visit_undef_node(&concrete);
16373               self.visit_branch_node_leave();
16374           }
16375           Node::UnlessNode { parser, pointer, marker } => {
16376               let concrete = UnlessNode { parser: *parser, pointer: *pointer, marker: *marker };
16377               self.visit_branch_node_enter(concrete.as_node());
16378               self.visit_unless_node(&concrete);
16379               self.visit_branch_node_leave();
16380           }
16381           Node::UntilNode { parser, pointer, marker } => {
16382               let concrete = UntilNode { parser: *parser, pointer: *pointer, marker: *marker };
16383               self.visit_branch_node_enter(concrete.as_node());
16384               self.visit_until_node(&concrete);
16385               self.visit_branch_node_leave();
16386           }
16387           Node::WhenNode { parser, pointer, marker } => {
16388               let concrete = WhenNode { parser: *parser, pointer: *pointer, marker: *marker };
16389               self.visit_branch_node_enter(concrete.as_node());
16390               self.visit_when_node(&concrete);
16391               self.visit_branch_node_leave();
16392           }
16393           Node::WhileNode { parser, pointer, marker } => {
16394               let concrete = WhileNode { parser: *parser, pointer: *pointer, marker: *marker };
16395               self.visit_branch_node_enter(concrete.as_node());
16396               self.visit_while_node(&concrete);
16397               self.visit_branch_node_leave();
16398           }
16399           Node::XStringNode { parser, pointer, marker } => {
16400               let concrete = XStringNode { parser: *parser, pointer: *pointer, marker: *marker };
16401               self.visit_leaf_node_enter(concrete.as_node());
16402               self.visit_x_string_node(&concrete);
16403               self.visit_leaf_node_leave();
16404           }
16405           Node::YieldNode { parser, pointer, marker } => {
16406               let concrete = YieldNode { parser: *parser, pointer: *pointer, marker: *marker };
16407               self.visit_branch_node_enter(concrete.as_node());
16408               self.visit_yield_node(&concrete);
16409               self.visit_branch_node_leave();
16410           }
16411       }
16412   }
16413
16414    /// Visits a `AliasGlobalVariableNode` node.
16415    fn visit_alias_global_variable_node(&mut self, node: &AliasGlobalVariableNode<'pr>) {
16416        visit_alias_global_variable_node(self, node);
16417    }
16418
16419    /// Visits a `AliasMethodNode` node.
16420    fn visit_alias_method_node(&mut self, node: &AliasMethodNode<'pr>) {
16421        visit_alias_method_node(self, node);
16422    }
16423
16424    /// Visits a `AlternationPatternNode` node.
16425    fn visit_alternation_pattern_node(&mut self, node: &AlternationPatternNode<'pr>) {
16426        visit_alternation_pattern_node(self, node);
16427    }
16428
16429    /// Visits a `AndNode` node.
16430    fn visit_and_node(&mut self, node: &AndNode<'pr>) {
16431        visit_and_node(self, node);
16432    }
16433
16434    /// Visits a `ArgumentsNode` node.
16435    fn visit_arguments_node(&mut self, node: &ArgumentsNode<'pr>) {
16436        visit_arguments_node(self, node);
16437    }
16438
16439    /// Visits a `ArrayNode` node.
16440    fn visit_array_node(&mut self, node: &ArrayNode<'pr>) {
16441        visit_array_node(self, node);
16442    }
16443
16444    /// Visits a `ArrayPatternNode` node.
16445    fn visit_array_pattern_node(&mut self, node: &ArrayPatternNode<'pr>) {
16446        visit_array_pattern_node(self, node);
16447    }
16448
16449    /// Visits a `AssocNode` node.
16450    fn visit_assoc_node(&mut self, node: &AssocNode<'pr>) {
16451        visit_assoc_node(self, node);
16452    }
16453
16454    /// Visits a `AssocSplatNode` node.
16455    fn visit_assoc_splat_node(&mut self, node: &AssocSplatNode<'pr>) {
16456        visit_assoc_splat_node(self, node);
16457    }
16458
16459    /// Visits a `BackReferenceReadNode` node.
16460    fn visit_back_reference_read_node(&mut self, node: &BackReferenceReadNode<'pr>) {
16461        visit_back_reference_read_node(self, node);
16462    }
16463
16464    /// Visits a `BeginNode` node.
16465    fn visit_begin_node(&mut self, node: &BeginNode<'pr>) {
16466        visit_begin_node(self, node);
16467    }
16468
16469    /// Visits a `BlockArgumentNode` node.
16470    fn visit_block_argument_node(&mut self, node: &BlockArgumentNode<'pr>) {
16471        visit_block_argument_node(self, node);
16472    }
16473
16474    /// Visits a `BlockLocalVariableNode` node.
16475    fn visit_block_local_variable_node(&mut self, node: &BlockLocalVariableNode<'pr>) {
16476        visit_block_local_variable_node(self, node);
16477    }
16478
16479    /// Visits a `BlockNode` node.
16480    fn visit_block_node(&mut self, node: &BlockNode<'pr>) {
16481        visit_block_node(self, node);
16482    }
16483
16484    /// Visits a `BlockParameterNode` node.
16485    fn visit_block_parameter_node(&mut self, node: &BlockParameterNode<'pr>) {
16486        visit_block_parameter_node(self, node);
16487    }
16488
16489    /// Visits a `BlockParametersNode` node.
16490    fn visit_block_parameters_node(&mut self, node: &BlockParametersNode<'pr>) {
16491        visit_block_parameters_node(self, node);
16492    }
16493
16494    /// Visits a `BreakNode` node.
16495    fn visit_break_node(&mut self, node: &BreakNode<'pr>) {
16496        visit_break_node(self, node);
16497    }
16498
16499    /// Visits a `CallAndWriteNode` node.
16500    fn visit_call_and_write_node(&mut self, node: &CallAndWriteNode<'pr>) {
16501        visit_call_and_write_node(self, node);
16502    }
16503
16504    /// Visits a `CallNode` node.
16505    fn visit_call_node(&mut self, node: &CallNode<'pr>) {
16506        visit_call_node(self, node);
16507    }
16508
16509    /// Visits a `CallOperatorWriteNode` node.
16510    fn visit_call_operator_write_node(&mut self, node: &CallOperatorWriteNode<'pr>) {
16511        visit_call_operator_write_node(self, node);
16512    }
16513
16514    /// Visits a `CallOrWriteNode` node.
16515    fn visit_call_or_write_node(&mut self, node: &CallOrWriteNode<'pr>) {
16516        visit_call_or_write_node(self, node);
16517    }
16518
16519    /// Visits a `CallTargetNode` node.
16520    fn visit_call_target_node(&mut self, node: &CallTargetNode<'pr>) {
16521        visit_call_target_node(self, node);
16522    }
16523
16524    /// Visits a `CapturePatternNode` node.
16525    fn visit_capture_pattern_node(&mut self, node: &CapturePatternNode<'pr>) {
16526        visit_capture_pattern_node(self, node);
16527    }
16528
16529    /// Visits a `CaseMatchNode` node.
16530    fn visit_case_match_node(&mut self, node: &CaseMatchNode<'pr>) {
16531        visit_case_match_node(self, node);
16532    }
16533
16534    /// Visits a `CaseNode` node.
16535    fn visit_case_node(&mut self, node: &CaseNode<'pr>) {
16536        visit_case_node(self, node);
16537    }
16538
16539    /// Visits a `ClassNode` node.
16540    fn visit_class_node(&mut self, node: &ClassNode<'pr>) {
16541        visit_class_node(self, node);
16542    }
16543
16544    /// Visits a `ClassVariableAndWriteNode` node.
16545    fn visit_class_variable_and_write_node(&mut self, node: &ClassVariableAndWriteNode<'pr>) {
16546        visit_class_variable_and_write_node(self, node);
16547    }
16548
16549    /// Visits a `ClassVariableOperatorWriteNode` node.
16550    fn visit_class_variable_operator_write_node(&mut self, node: &ClassVariableOperatorWriteNode<'pr>) {
16551        visit_class_variable_operator_write_node(self, node);
16552    }
16553
16554    /// Visits a `ClassVariableOrWriteNode` node.
16555    fn visit_class_variable_or_write_node(&mut self, node: &ClassVariableOrWriteNode<'pr>) {
16556        visit_class_variable_or_write_node(self, node);
16557    }
16558
16559    /// Visits a `ClassVariableReadNode` node.
16560    fn visit_class_variable_read_node(&mut self, node: &ClassVariableReadNode<'pr>) {
16561        visit_class_variable_read_node(self, node);
16562    }
16563
16564    /// Visits a `ClassVariableTargetNode` node.
16565    fn visit_class_variable_target_node(&mut self, node: &ClassVariableTargetNode<'pr>) {
16566        visit_class_variable_target_node(self, node);
16567    }
16568
16569    /// Visits a `ClassVariableWriteNode` node.
16570    fn visit_class_variable_write_node(&mut self, node: &ClassVariableWriteNode<'pr>) {
16571        visit_class_variable_write_node(self, node);
16572    }
16573
16574    /// Visits a `ConstantAndWriteNode` node.
16575    fn visit_constant_and_write_node(&mut self, node: &ConstantAndWriteNode<'pr>) {
16576        visit_constant_and_write_node(self, node);
16577    }
16578
16579    /// Visits a `ConstantOperatorWriteNode` node.
16580    fn visit_constant_operator_write_node(&mut self, node: &ConstantOperatorWriteNode<'pr>) {
16581        visit_constant_operator_write_node(self, node);
16582    }
16583
16584    /// Visits a `ConstantOrWriteNode` node.
16585    fn visit_constant_or_write_node(&mut self, node: &ConstantOrWriteNode<'pr>) {
16586        visit_constant_or_write_node(self, node);
16587    }
16588
16589    /// Visits a `ConstantPathAndWriteNode` node.
16590    fn visit_constant_path_and_write_node(&mut self, node: &ConstantPathAndWriteNode<'pr>) {
16591        visit_constant_path_and_write_node(self, node);
16592    }
16593
16594    /// Visits a `ConstantPathNode` node.
16595    fn visit_constant_path_node(&mut self, node: &ConstantPathNode<'pr>) {
16596        visit_constant_path_node(self, node);
16597    }
16598
16599    /// Visits a `ConstantPathOperatorWriteNode` node.
16600    fn visit_constant_path_operator_write_node(&mut self, node: &ConstantPathOperatorWriteNode<'pr>) {
16601        visit_constant_path_operator_write_node(self, node);
16602    }
16603
16604    /// Visits a `ConstantPathOrWriteNode` node.
16605    fn visit_constant_path_or_write_node(&mut self, node: &ConstantPathOrWriteNode<'pr>) {
16606        visit_constant_path_or_write_node(self, node);
16607    }
16608
16609    /// Visits a `ConstantPathTargetNode` node.
16610    fn visit_constant_path_target_node(&mut self, node: &ConstantPathTargetNode<'pr>) {
16611        visit_constant_path_target_node(self, node);
16612    }
16613
16614    /// Visits a `ConstantPathWriteNode` node.
16615    fn visit_constant_path_write_node(&mut self, node: &ConstantPathWriteNode<'pr>) {
16616        visit_constant_path_write_node(self, node);
16617    }
16618
16619    /// Visits a `ConstantReadNode` node.
16620    fn visit_constant_read_node(&mut self, node: &ConstantReadNode<'pr>) {
16621        visit_constant_read_node(self, node);
16622    }
16623
16624    /// Visits a `ConstantTargetNode` node.
16625    fn visit_constant_target_node(&mut self, node: &ConstantTargetNode<'pr>) {
16626        visit_constant_target_node(self, node);
16627    }
16628
16629    /// Visits a `ConstantWriteNode` node.
16630    fn visit_constant_write_node(&mut self, node: &ConstantWriteNode<'pr>) {
16631        visit_constant_write_node(self, node);
16632    }
16633
16634    /// Visits a `DefNode` node.
16635    fn visit_def_node(&mut self, node: &DefNode<'pr>) {
16636        visit_def_node(self, node);
16637    }
16638
16639    /// Visits a `DefinedNode` node.
16640    fn visit_defined_node(&mut self, node: &DefinedNode<'pr>) {
16641        visit_defined_node(self, node);
16642    }
16643
16644    /// Visits a `ElseNode` node.
16645    fn visit_else_node(&mut self, node: &ElseNode<'pr>) {
16646        visit_else_node(self, node);
16647    }
16648
16649    /// Visits a `EmbeddedStatementsNode` node.
16650    fn visit_embedded_statements_node(&mut self, node: &EmbeddedStatementsNode<'pr>) {
16651        visit_embedded_statements_node(self, node);
16652    }
16653
16654    /// Visits a `EmbeddedVariableNode` node.
16655    fn visit_embedded_variable_node(&mut self, node: &EmbeddedVariableNode<'pr>) {
16656        visit_embedded_variable_node(self, node);
16657    }
16658
16659    /// Visits a `EnsureNode` node.
16660    fn visit_ensure_node(&mut self, node: &EnsureNode<'pr>) {
16661        visit_ensure_node(self, node);
16662    }
16663
16664    /// Visits a `ErrorRecoveryNode` node.
16665    fn visit_error_recovery_node(&mut self, node: &ErrorRecoveryNode<'pr>) {
16666        visit_error_recovery_node(self, node);
16667    }
16668
16669    /// Visits a `FalseNode` node.
16670    fn visit_false_node(&mut self, node: &FalseNode<'pr>) {
16671        visit_false_node(self, node);
16672    }
16673
16674    /// Visits a `FindPatternNode` node.
16675    fn visit_find_pattern_node(&mut self, node: &FindPatternNode<'pr>) {
16676        visit_find_pattern_node(self, node);
16677    }
16678
16679    /// Visits a `FlipFlopNode` node.
16680    fn visit_flip_flop_node(&mut self, node: &FlipFlopNode<'pr>) {
16681        visit_flip_flop_node(self, node);
16682    }
16683
16684    /// Visits a `FloatNode` node.
16685    fn visit_float_node(&mut self, node: &FloatNode<'pr>) {
16686        visit_float_node(self, node);
16687    }
16688
16689    /// Visits a `ForNode` node.
16690    fn visit_for_node(&mut self, node: &ForNode<'pr>) {
16691        visit_for_node(self, node);
16692    }
16693
16694    /// Visits a `ForwardingArgumentsNode` node.
16695    fn visit_forwarding_arguments_node(&mut self, node: &ForwardingArgumentsNode<'pr>) {
16696        visit_forwarding_arguments_node(self, node);
16697    }
16698
16699    /// Visits a `ForwardingParameterNode` node.
16700    fn visit_forwarding_parameter_node(&mut self, node: &ForwardingParameterNode<'pr>) {
16701        visit_forwarding_parameter_node(self, node);
16702    }
16703
16704    /// Visits a `ForwardingSuperNode` node.
16705    fn visit_forwarding_super_node(&mut self, node: &ForwardingSuperNode<'pr>) {
16706        visit_forwarding_super_node(self, node);
16707    }
16708
16709    /// Visits a `GlobalVariableAndWriteNode` node.
16710    fn visit_global_variable_and_write_node(&mut self, node: &GlobalVariableAndWriteNode<'pr>) {
16711        visit_global_variable_and_write_node(self, node);
16712    }
16713
16714    /// Visits a `GlobalVariableOperatorWriteNode` node.
16715    fn visit_global_variable_operator_write_node(&mut self, node: &GlobalVariableOperatorWriteNode<'pr>) {
16716        visit_global_variable_operator_write_node(self, node);
16717    }
16718
16719    /// Visits a `GlobalVariableOrWriteNode` node.
16720    fn visit_global_variable_or_write_node(&mut self, node: &GlobalVariableOrWriteNode<'pr>) {
16721        visit_global_variable_or_write_node(self, node);
16722    }
16723
16724    /// Visits a `GlobalVariableReadNode` node.
16725    fn visit_global_variable_read_node(&mut self, node: &GlobalVariableReadNode<'pr>) {
16726        visit_global_variable_read_node(self, node);
16727    }
16728
16729    /// Visits a `GlobalVariableTargetNode` node.
16730    fn visit_global_variable_target_node(&mut self, node: &GlobalVariableTargetNode<'pr>) {
16731        visit_global_variable_target_node(self, node);
16732    }
16733
16734    /// Visits a `GlobalVariableWriteNode` node.
16735    fn visit_global_variable_write_node(&mut self, node: &GlobalVariableWriteNode<'pr>) {
16736        visit_global_variable_write_node(self, node);
16737    }
16738
16739    /// Visits a `HashNode` node.
16740    fn visit_hash_node(&mut self, node: &HashNode<'pr>) {
16741        visit_hash_node(self, node);
16742    }
16743
16744    /// Visits a `HashPatternNode` node.
16745    fn visit_hash_pattern_node(&mut self, node: &HashPatternNode<'pr>) {
16746        visit_hash_pattern_node(self, node);
16747    }
16748
16749    /// Visits a `IfNode` node.
16750    fn visit_if_node(&mut self, node: &IfNode<'pr>) {
16751        visit_if_node(self, node);
16752    }
16753
16754    /// Visits a `ImaginaryNode` node.
16755    fn visit_imaginary_node(&mut self, node: &ImaginaryNode<'pr>) {
16756        visit_imaginary_node(self, node);
16757    }
16758
16759    /// Visits a `ImplicitNode` node.
16760    fn visit_implicit_node(&mut self, node: &ImplicitNode<'pr>) {
16761        visit_implicit_node(self, node);
16762    }
16763
16764    /// Visits a `ImplicitRestNode` node.
16765    fn visit_implicit_rest_node(&mut self, node: &ImplicitRestNode<'pr>) {
16766        visit_implicit_rest_node(self, node);
16767    }
16768
16769    /// Visits a `InNode` node.
16770    fn visit_in_node(&mut self, node: &InNode<'pr>) {
16771        visit_in_node(self, node);
16772    }
16773
16774    /// Visits a `IndexAndWriteNode` node.
16775    fn visit_index_and_write_node(&mut self, node: &IndexAndWriteNode<'pr>) {
16776        visit_index_and_write_node(self, node);
16777    }
16778
16779    /// Visits a `IndexOperatorWriteNode` node.
16780    fn visit_index_operator_write_node(&mut self, node: &IndexOperatorWriteNode<'pr>) {
16781        visit_index_operator_write_node(self, node);
16782    }
16783
16784    /// Visits a `IndexOrWriteNode` node.
16785    fn visit_index_or_write_node(&mut self, node: &IndexOrWriteNode<'pr>) {
16786        visit_index_or_write_node(self, node);
16787    }
16788
16789    /// Visits a `IndexTargetNode` node.
16790    fn visit_index_target_node(&mut self, node: &IndexTargetNode<'pr>) {
16791        visit_index_target_node(self, node);
16792    }
16793
16794    /// Visits a `InstanceVariableAndWriteNode` node.
16795    fn visit_instance_variable_and_write_node(&mut self, node: &InstanceVariableAndWriteNode<'pr>) {
16796        visit_instance_variable_and_write_node(self, node);
16797    }
16798
16799    /// Visits a `InstanceVariableOperatorWriteNode` node.
16800    fn visit_instance_variable_operator_write_node(&mut self, node: &InstanceVariableOperatorWriteNode<'pr>) {
16801        visit_instance_variable_operator_write_node(self, node);
16802    }
16803
16804    /// Visits a `InstanceVariableOrWriteNode` node.
16805    fn visit_instance_variable_or_write_node(&mut self, node: &InstanceVariableOrWriteNode<'pr>) {
16806        visit_instance_variable_or_write_node(self, node);
16807    }
16808
16809    /// Visits a `InstanceVariableReadNode` node.
16810    fn visit_instance_variable_read_node(&mut self, node: &InstanceVariableReadNode<'pr>) {
16811        visit_instance_variable_read_node(self, node);
16812    }
16813
16814    /// Visits a `InstanceVariableTargetNode` node.
16815    fn visit_instance_variable_target_node(&mut self, node: &InstanceVariableTargetNode<'pr>) {
16816        visit_instance_variable_target_node(self, node);
16817    }
16818
16819    /// Visits a `InstanceVariableWriteNode` node.
16820    fn visit_instance_variable_write_node(&mut self, node: &InstanceVariableWriteNode<'pr>) {
16821        visit_instance_variable_write_node(self, node);
16822    }
16823
16824    /// Visits a `IntegerNode` node.
16825    fn visit_integer_node(&mut self, node: &IntegerNode<'pr>) {
16826        visit_integer_node(self, node);
16827    }
16828
16829    /// Visits a `InterpolatedMatchLastLineNode` node.
16830    fn visit_interpolated_match_last_line_node(&mut self, node: &InterpolatedMatchLastLineNode<'pr>) {
16831        visit_interpolated_match_last_line_node(self, node);
16832    }
16833
16834    /// Visits a `InterpolatedRegularExpressionNode` node.
16835    fn visit_interpolated_regular_expression_node(&mut self, node: &InterpolatedRegularExpressionNode<'pr>) {
16836        visit_interpolated_regular_expression_node(self, node);
16837    }
16838
16839    /// Visits a `InterpolatedStringNode` node.
16840    fn visit_interpolated_string_node(&mut self, node: &InterpolatedStringNode<'pr>) {
16841        visit_interpolated_string_node(self, node);
16842    }
16843
16844    /// Visits a `InterpolatedSymbolNode` node.
16845    fn visit_interpolated_symbol_node(&mut self, node: &InterpolatedSymbolNode<'pr>) {
16846        visit_interpolated_symbol_node(self, node);
16847    }
16848
16849    /// Visits a `InterpolatedXStringNode` node.
16850    fn visit_interpolated_x_string_node(&mut self, node: &InterpolatedXStringNode<'pr>) {
16851        visit_interpolated_x_string_node(self, node);
16852    }
16853
16854    /// Visits a `ItLocalVariableReadNode` node.
16855    fn visit_it_local_variable_read_node(&mut self, node: &ItLocalVariableReadNode<'pr>) {
16856        visit_it_local_variable_read_node(self, node);
16857    }
16858
16859    /// Visits a `ItParametersNode` node.
16860    fn visit_it_parameters_node(&mut self, node: &ItParametersNode<'pr>) {
16861        visit_it_parameters_node(self, node);
16862    }
16863
16864    /// Visits a `KeywordHashNode` node.
16865    fn visit_keyword_hash_node(&mut self, node: &KeywordHashNode<'pr>) {
16866        visit_keyword_hash_node(self, node);
16867    }
16868
16869    /// Visits a `KeywordRestParameterNode` node.
16870    fn visit_keyword_rest_parameter_node(&mut self, node: &KeywordRestParameterNode<'pr>) {
16871        visit_keyword_rest_parameter_node(self, node);
16872    }
16873
16874    /// Visits a `LambdaNode` node.
16875    fn visit_lambda_node(&mut self, node: &LambdaNode<'pr>) {
16876        visit_lambda_node(self, node);
16877    }
16878
16879    /// Visits a `LocalVariableAndWriteNode` node.
16880    fn visit_local_variable_and_write_node(&mut self, node: &LocalVariableAndWriteNode<'pr>) {
16881        visit_local_variable_and_write_node(self, node);
16882    }
16883
16884    /// Visits a `LocalVariableOperatorWriteNode` node.
16885    fn visit_local_variable_operator_write_node(&mut self, node: &LocalVariableOperatorWriteNode<'pr>) {
16886        visit_local_variable_operator_write_node(self, node);
16887    }
16888
16889    /// Visits a `LocalVariableOrWriteNode` node.
16890    fn visit_local_variable_or_write_node(&mut self, node: &LocalVariableOrWriteNode<'pr>) {
16891        visit_local_variable_or_write_node(self, node);
16892    }
16893
16894    /// Visits a `LocalVariableReadNode` node.
16895    fn visit_local_variable_read_node(&mut self, node: &LocalVariableReadNode<'pr>) {
16896        visit_local_variable_read_node(self, node);
16897    }
16898
16899    /// Visits a `LocalVariableTargetNode` node.
16900    fn visit_local_variable_target_node(&mut self, node: &LocalVariableTargetNode<'pr>) {
16901        visit_local_variable_target_node(self, node);
16902    }
16903
16904    /// Visits a `LocalVariableWriteNode` node.
16905    fn visit_local_variable_write_node(&mut self, node: &LocalVariableWriteNode<'pr>) {
16906        visit_local_variable_write_node(self, node);
16907    }
16908
16909    /// Visits a `MatchLastLineNode` node.
16910    fn visit_match_last_line_node(&mut self, node: &MatchLastLineNode<'pr>) {
16911        visit_match_last_line_node(self, node);
16912    }
16913
16914    /// Visits a `MatchPredicateNode` node.
16915    fn visit_match_predicate_node(&mut self, node: &MatchPredicateNode<'pr>) {
16916        visit_match_predicate_node(self, node);
16917    }
16918
16919    /// Visits a `MatchRequiredNode` node.
16920    fn visit_match_required_node(&mut self, node: &MatchRequiredNode<'pr>) {
16921        visit_match_required_node(self, node);
16922    }
16923
16924    /// Visits a `MatchWriteNode` node.
16925    fn visit_match_write_node(&mut self, node: &MatchWriteNode<'pr>) {
16926        visit_match_write_node(self, node);
16927    }
16928
16929    /// Visits a `ModuleNode` node.
16930    fn visit_module_node(&mut self, node: &ModuleNode<'pr>) {
16931        visit_module_node(self, node);
16932    }
16933
16934    /// Visits a `MultiTargetNode` node.
16935    fn visit_multi_target_node(&mut self, node: &MultiTargetNode<'pr>) {
16936        visit_multi_target_node(self, node);
16937    }
16938
16939    /// Visits a `MultiWriteNode` node.
16940    fn visit_multi_write_node(&mut self, node: &MultiWriteNode<'pr>) {
16941        visit_multi_write_node(self, node);
16942    }
16943
16944    /// Visits a `NextNode` node.
16945    fn visit_next_node(&mut self, node: &NextNode<'pr>) {
16946        visit_next_node(self, node);
16947    }
16948
16949    /// Visits a `NilNode` node.
16950    fn visit_nil_node(&mut self, node: &NilNode<'pr>) {
16951        visit_nil_node(self, node);
16952    }
16953
16954    /// Visits a `NoBlockParameterNode` node.
16955    fn visit_no_block_parameter_node(&mut self, node: &NoBlockParameterNode<'pr>) {
16956        visit_no_block_parameter_node(self, node);
16957    }
16958
16959    /// Visits a `NoKeywordsParameterNode` node.
16960    fn visit_no_keywords_parameter_node(&mut self, node: &NoKeywordsParameterNode<'pr>) {
16961        visit_no_keywords_parameter_node(self, node);
16962    }
16963
16964    /// Visits a `NumberedParametersNode` node.
16965    fn visit_numbered_parameters_node(&mut self, node: &NumberedParametersNode<'pr>) {
16966        visit_numbered_parameters_node(self, node);
16967    }
16968
16969    /// Visits a `NumberedReferenceReadNode` node.
16970    fn visit_numbered_reference_read_node(&mut self, node: &NumberedReferenceReadNode<'pr>) {
16971        visit_numbered_reference_read_node(self, node);
16972    }
16973
16974    /// Visits a `OptionalKeywordParameterNode` node.
16975    fn visit_optional_keyword_parameter_node(&mut self, node: &OptionalKeywordParameterNode<'pr>) {
16976        visit_optional_keyword_parameter_node(self, node);
16977    }
16978
16979    /// Visits a `OptionalParameterNode` node.
16980    fn visit_optional_parameter_node(&mut self, node: &OptionalParameterNode<'pr>) {
16981        visit_optional_parameter_node(self, node);
16982    }
16983
16984    /// Visits a `OrNode` node.
16985    fn visit_or_node(&mut self, node: &OrNode<'pr>) {
16986        visit_or_node(self, node);
16987    }
16988
16989    /// Visits a `ParametersNode` node.
16990    fn visit_parameters_node(&mut self, node: &ParametersNode<'pr>) {
16991        visit_parameters_node(self, node);
16992    }
16993
16994    /// Visits a `ParenthesesNode` node.
16995    fn visit_parentheses_node(&mut self, node: &ParenthesesNode<'pr>) {
16996        visit_parentheses_node(self, node);
16997    }
16998
16999    /// Visits a `PinnedExpressionNode` node.
17000    fn visit_pinned_expression_node(&mut self, node: &PinnedExpressionNode<'pr>) {
17001        visit_pinned_expression_node(self, node);
17002    }
17003
17004    /// Visits a `PinnedVariableNode` node.
17005    fn visit_pinned_variable_node(&mut self, node: &PinnedVariableNode<'pr>) {
17006        visit_pinned_variable_node(self, node);
17007    }
17008
17009    /// Visits a `PostExecutionNode` node.
17010    fn visit_post_execution_node(&mut self, node: &PostExecutionNode<'pr>) {
17011        visit_post_execution_node(self, node);
17012    }
17013
17014    /// Visits a `PreExecutionNode` node.
17015    fn visit_pre_execution_node(&mut self, node: &PreExecutionNode<'pr>) {
17016        visit_pre_execution_node(self, node);
17017    }
17018
17019    /// Visits a `ProgramNode` node.
17020    fn visit_program_node(&mut self, node: &ProgramNode<'pr>) {
17021        visit_program_node(self, node);
17022    }
17023
17024    /// Visits a `RangeNode` node.
17025    fn visit_range_node(&mut self, node: &RangeNode<'pr>) {
17026        visit_range_node(self, node);
17027    }
17028
17029    /// Visits a `RationalNode` node.
17030    fn visit_rational_node(&mut self, node: &RationalNode<'pr>) {
17031        visit_rational_node(self, node);
17032    }
17033
17034    /// Visits a `RedoNode` node.
17035    fn visit_redo_node(&mut self, node: &RedoNode<'pr>) {
17036        visit_redo_node(self, node);
17037    }
17038
17039    /// Visits a `RegularExpressionNode` node.
17040    fn visit_regular_expression_node(&mut self, node: &RegularExpressionNode<'pr>) {
17041        visit_regular_expression_node(self, node);
17042    }
17043
17044    /// Visits a `RequiredKeywordParameterNode` node.
17045    fn visit_required_keyword_parameter_node(&mut self, node: &RequiredKeywordParameterNode<'pr>) {
17046        visit_required_keyword_parameter_node(self, node);
17047    }
17048
17049    /// Visits a `RequiredParameterNode` node.
17050    fn visit_required_parameter_node(&mut self, node: &RequiredParameterNode<'pr>) {
17051        visit_required_parameter_node(self, node);
17052    }
17053
17054    /// Visits a `RescueModifierNode` node.
17055    fn visit_rescue_modifier_node(&mut self, node: &RescueModifierNode<'pr>) {
17056        visit_rescue_modifier_node(self, node);
17057    }
17058
17059    /// Visits a `RescueNode` node.
17060    fn visit_rescue_node(&mut self, node: &RescueNode<'pr>) {
17061        visit_rescue_node(self, node);
17062    }
17063
17064    /// Visits a `RestParameterNode` node.
17065    fn visit_rest_parameter_node(&mut self, node: &RestParameterNode<'pr>) {
17066        visit_rest_parameter_node(self, node);
17067    }
17068
17069    /// Visits a `RetryNode` node.
17070    fn visit_retry_node(&mut self, node: &RetryNode<'pr>) {
17071        visit_retry_node(self, node);
17072    }
17073
17074    /// Visits a `ReturnNode` node.
17075    fn visit_return_node(&mut self, node: &ReturnNode<'pr>) {
17076        visit_return_node(self, node);
17077    }
17078
17079    /// Visits a `SelfNode` node.
17080    fn visit_self_node(&mut self, node: &SelfNode<'pr>) {
17081        visit_self_node(self, node);
17082    }
17083
17084    /// Visits a `ShareableConstantNode` node.
17085    fn visit_shareable_constant_node(&mut self, node: &ShareableConstantNode<'pr>) {
17086        visit_shareable_constant_node(self, node);
17087    }
17088
17089    /// Visits a `SingletonClassNode` node.
17090    fn visit_singleton_class_node(&mut self, node: &SingletonClassNode<'pr>) {
17091        visit_singleton_class_node(self, node);
17092    }
17093
17094    /// Visits a `SourceEncodingNode` node.
17095    fn visit_source_encoding_node(&mut self, node: &SourceEncodingNode<'pr>) {
17096        visit_source_encoding_node(self, node);
17097    }
17098
17099    /// Visits a `SourceFileNode` node.
17100    fn visit_source_file_node(&mut self, node: &SourceFileNode<'pr>) {
17101        visit_source_file_node(self, node);
17102    }
17103
17104    /// Visits a `SourceLineNode` node.
17105    fn visit_source_line_node(&mut self, node: &SourceLineNode<'pr>) {
17106        visit_source_line_node(self, node);
17107    }
17108
17109    /// Visits a `SplatNode` node.
17110    fn visit_splat_node(&mut self, node: &SplatNode<'pr>) {
17111        visit_splat_node(self, node);
17112    }
17113
17114    /// Visits a `StatementsNode` node.
17115    fn visit_statements_node(&mut self, node: &StatementsNode<'pr>) {
17116        visit_statements_node(self, node);
17117    }
17118
17119    /// Visits a `StringNode` node.
17120    fn visit_string_node(&mut self, node: &StringNode<'pr>) {
17121        visit_string_node(self, node);
17122    }
17123
17124    /// Visits a `SuperNode` node.
17125    fn visit_super_node(&mut self, node: &SuperNode<'pr>) {
17126        visit_super_node(self, node);
17127    }
17128
17129    /// Visits a `SymbolNode` node.
17130    fn visit_symbol_node(&mut self, node: &SymbolNode<'pr>) {
17131        visit_symbol_node(self, node);
17132    }
17133
17134    /// Visits a `TrueNode` node.
17135    fn visit_true_node(&mut self, node: &TrueNode<'pr>) {
17136        visit_true_node(self, node);
17137    }
17138
17139    /// Visits a `UndefNode` node.
17140    fn visit_undef_node(&mut self, node: &UndefNode<'pr>) {
17141        visit_undef_node(self, node);
17142    }
17143
17144    /// Visits a `UnlessNode` node.
17145    fn visit_unless_node(&mut self, node: &UnlessNode<'pr>) {
17146        visit_unless_node(self, node);
17147    }
17148
17149    /// Visits a `UntilNode` node.
17150    fn visit_until_node(&mut self, node: &UntilNode<'pr>) {
17151        visit_until_node(self, node);
17152    }
17153
17154    /// Visits a `WhenNode` node.
17155    fn visit_when_node(&mut self, node: &WhenNode<'pr>) {
17156        visit_when_node(self, node);
17157    }
17158
17159    /// Visits a `WhileNode` node.
17160    fn visit_while_node(&mut self, node: &WhileNode<'pr>) {
17161        visit_while_node(self, node);
17162    }
17163
17164    /// Visits a `XStringNode` node.
17165    fn visit_x_string_node(&mut self, node: &XStringNode<'pr>) {
17166        visit_x_string_node(self, node);
17167    }
17168
17169    /// Visits a `YieldNode` node.
17170    fn visit_yield_node(&mut self, node: &YieldNode<'pr>) {
17171        visit_yield_node(self, node);
17172    }
17173}
17174
17175/// The default visitor implementation for a `AliasGlobalVariableNode` node.
17176pub fn visit_alias_global_variable_node<'pr, V>(visitor: &mut V, node: &AliasGlobalVariableNode<'pr>)
17177where
17178    V: Visit<'pr> + ?Sized,
17179{
17180    visitor.visit(&node.new_name());
17181    visitor.visit(&node.old_name());
17182}
17183
17184/// The default visitor implementation for a `AliasMethodNode` node.
17185pub fn visit_alias_method_node<'pr, V>(visitor: &mut V, node: &AliasMethodNode<'pr>)
17186where
17187    V: Visit<'pr> + ?Sized,
17188{
17189    visitor.visit(&node.new_name());
17190    visitor.visit(&node.old_name());
17191}
17192
17193/// The default visitor implementation for a `AlternationPatternNode` node.
17194pub fn visit_alternation_pattern_node<'pr, V>(visitor: &mut V, node: &AlternationPatternNode<'pr>)
17195where
17196    V: Visit<'pr> + ?Sized,
17197{
17198    visitor.visit(&node.left());
17199    visitor.visit(&node.right());
17200}
17201
17202/// The default visitor implementation for a `AndNode` node.
17203pub fn visit_and_node<'pr, V>(visitor: &mut V, node: &AndNode<'pr>)
17204where
17205    V: Visit<'pr> + ?Sized,
17206{
17207    visitor.visit(&node.left());
17208    visitor.visit(&node.right());
17209}
17210
17211/// The default visitor implementation for a `ArgumentsNode` node.
17212pub fn visit_arguments_node<'pr, V>(visitor: &mut V, node: &ArgumentsNode<'pr>)
17213where
17214    V: Visit<'pr> + ?Sized,
17215{
17216    for node in &node.arguments() {
17217        visitor.visit(&node);
17218    }
17219}
17220
17221/// The default visitor implementation for a `ArrayNode` node.
17222pub fn visit_array_node<'pr, V>(visitor: &mut V, node: &ArrayNode<'pr>)
17223where
17224    V: Visit<'pr> + ?Sized,
17225{
17226    for node in &node.elements() {
17227        visitor.visit(&node);
17228    }
17229}
17230
17231/// The default visitor implementation for a `ArrayPatternNode` node.
17232pub fn visit_array_pattern_node<'pr, V>(visitor: &mut V, node: &ArrayPatternNode<'pr>)
17233where
17234    V: Visit<'pr> + ?Sized,
17235{
17236    if let Some(node) = node.constant() {
17237        visitor.visit(&node);
17238    }
17239    for node in &node.requireds() {
17240        visitor.visit(&node);
17241    }
17242    if let Some(node) = node.rest() {
17243        visitor.visit(&node);
17244    }
17245    for node in &node.posts() {
17246        visitor.visit(&node);
17247    }
17248}
17249
17250/// The default visitor implementation for a `AssocNode` node.
17251pub fn visit_assoc_node<'pr, V>(visitor: &mut V, node: &AssocNode<'pr>)
17252where
17253    V: Visit<'pr> + ?Sized,
17254{
17255    visitor.visit(&node.key());
17256    visitor.visit(&node.value());
17257}
17258
17259/// The default visitor implementation for a `AssocSplatNode` node.
17260pub fn visit_assoc_splat_node<'pr, V>(visitor: &mut V, node: &AssocSplatNode<'pr>)
17261where
17262    V: Visit<'pr> + ?Sized,
17263{
17264    if let Some(node) = node.value() {
17265        visitor.visit(&node);
17266    }
17267}
17268
17269/// The default visitor implementation for a `BackReferenceReadNode` node.
17270pub const fn visit_back_reference_read_node<'pr, V>(_visitor: &mut V, _node: &BackReferenceReadNode<'pr>)
17271where
17272    V: Visit<'pr> + ?Sized,
17273{}
17274
17275/// The default visitor implementation for a `BeginNode` node.
17276pub fn visit_begin_node<'pr, V>(visitor: &mut V, node: &BeginNode<'pr>)
17277where
17278    V: Visit<'pr> + ?Sized,
17279{
17280    if let Some(node) = node.statements() {
17281        visitor.visit_statements_node(&node);
17282    }
17283    if let Some(node) = node.rescue_clause() {
17284        visitor.visit_rescue_node(&node);
17285    }
17286    if let Some(node) = node.else_clause() {
17287        visitor.visit_else_node(&node);
17288    }
17289    if let Some(node) = node.ensure_clause() {
17290        visitor.visit_ensure_node(&node);
17291    }
17292}
17293
17294/// The default visitor implementation for a `BlockArgumentNode` node.
17295pub fn visit_block_argument_node<'pr, V>(visitor: &mut V, node: &BlockArgumentNode<'pr>)
17296where
17297    V: Visit<'pr> + ?Sized,
17298{
17299    if let Some(node) = node.expression() {
17300        visitor.visit(&node);
17301    }
17302}
17303
17304/// The default visitor implementation for a `BlockLocalVariableNode` node.
17305pub const fn visit_block_local_variable_node<'pr, V>(_visitor: &mut V, _node: &BlockLocalVariableNode<'pr>)
17306where
17307    V: Visit<'pr> + ?Sized,
17308{}
17309
17310/// The default visitor implementation for a `BlockNode` node.
17311pub fn visit_block_node<'pr, V>(visitor: &mut V, node: &BlockNode<'pr>)
17312where
17313    V: Visit<'pr> + ?Sized,
17314{
17315    if let Some(node) = node.parameters() {
17316        visitor.visit(&node);
17317    }
17318    if let Some(node) = node.body() {
17319        visitor.visit(&node);
17320    }
17321}
17322
17323/// The default visitor implementation for a `BlockParameterNode` node.
17324pub const fn visit_block_parameter_node<'pr, V>(_visitor: &mut V, _node: &BlockParameterNode<'pr>)
17325where
17326    V: Visit<'pr> + ?Sized,
17327{}
17328
17329/// The default visitor implementation for a `BlockParametersNode` node.
17330pub fn visit_block_parameters_node<'pr, V>(visitor: &mut V, node: &BlockParametersNode<'pr>)
17331where
17332    V: Visit<'pr> + ?Sized,
17333{
17334    if let Some(node) = node.parameters() {
17335        visitor.visit_parameters_node(&node);
17336    }
17337    for node in &node.locals() {
17338        visitor.visit(&node);
17339    }
17340}
17341
17342/// The default visitor implementation for a `BreakNode` node.
17343pub fn visit_break_node<'pr, V>(visitor: &mut V, node: &BreakNode<'pr>)
17344where
17345    V: Visit<'pr> + ?Sized,
17346{
17347    if let Some(node) = node.arguments() {
17348        visitor.visit_arguments_node(&node);
17349    }
17350}
17351
17352/// The default visitor implementation for a `CallAndWriteNode` node.
17353pub fn visit_call_and_write_node<'pr, V>(visitor: &mut V, node: &CallAndWriteNode<'pr>)
17354where
17355    V: Visit<'pr> + ?Sized,
17356{
17357    if let Some(node) = node.receiver() {
17358        visitor.visit(&node);
17359    }
17360    visitor.visit(&node.value());
17361}
17362
17363/// The default visitor implementation for a `CallNode` node.
17364pub fn visit_call_node<'pr, V>(visitor: &mut V, node: &CallNode<'pr>)
17365where
17366    V: Visit<'pr> + ?Sized,
17367{
17368    if let Some(node) = node.receiver() {
17369        visitor.visit(&node);
17370    }
17371    if let Some(node) = node.arguments() {
17372        visitor.visit_arguments_node(&node);
17373    }
17374    if let Some(node) = node.block() {
17375        visitor.visit(&node);
17376    }
17377}
17378
17379/// The default visitor implementation for a `CallOperatorWriteNode` node.
17380pub fn visit_call_operator_write_node<'pr, V>(visitor: &mut V, node: &CallOperatorWriteNode<'pr>)
17381where
17382    V: Visit<'pr> + ?Sized,
17383{
17384    if let Some(node) = node.receiver() {
17385        visitor.visit(&node);
17386    }
17387    visitor.visit(&node.value());
17388}
17389
17390/// The default visitor implementation for a `CallOrWriteNode` node.
17391pub fn visit_call_or_write_node<'pr, V>(visitor: &mut V, node: &CallOrWriteNode<'pr>)
17392where
17393    V: Visit<'pr> + ?Sized,
17394{
17395    if let Some(node) = node.receiver() {
17396        visitor.visit(&node);
17397    }
17398    visitor.visit(&node.value());
17399}
17400
17401/// The default visitor implementation for a `CallTargetNode` node.
17402pub fn visit_call_target_node<'pr, V>(visitor: &mut V, node: &CallTargetNode<'pr>)
17403where
17404    V: Visit<'pr> + ?Sized,
17405{
17406    visitor.visit(&node.receiver());
17407}
17408
17409/// The default visitor implementation for a `CapturePatternNode` node.
17410pub fn visit_capture_pattern_node<'pr, V>(visitor: &mut V, node: &CapturePatternNode<'pr>)
17411where
17412    V: Visit<'pr> + ?Sized,
17413{
17414    visitor.visit(&node.value());
17415    visitor.visit_local_variable_target_node(&node.target());
17416}
17417
17418/// The default visitor implementation for a `CaseMatchNode` node.
17419pub fn visit_case_match_node<'pr, V>(visitor: &mut V, node: &CaseMatchNode<'pr>)
17420where
17421    V: Visit<'pr> + ?Sized,
17422{
17423    if let Some(node) = node.predicate() {
17424        visitor.visit(&node);
17425    }
17426    for node in &node.conditions() {
17427        visitor.visit(&node);
17428    }
17429    if let Some(node) = node.else_clause() {
17430        visitor.visit_else_node(&node);
17431    }
17432}
17433
17434/// The default visitor implementation for a `CaseNode` node.
17435pub fn visit_case_node<'pr, V>(visitor: &mut V, node: &CaseNode<'pr>)
17436where
17437    V: Visit<'pr> + ?Sized,
17438{
17439    if let Some(node) = node.predicate() {
17440        visitor.visit(&node);
17441    }
17442    for node in &node.conditions() {
17443        visitor.visit(&node);
17444    }
17445    if let Some(node) = node.else_clause() {
17446        visitor.visit_else_node(&node);
17447    }
17448}
17449
17450/// The default visitor implementation for a `ClassNode` node.
17451pub fn visit_class_node<'pr, V>(visitor: &mut V, node: &ClassNode<'pr>)
17452where
17453    V: Visit<'pr> + ?Sized,
17454{
17455    visitor.visit(&node.constant_path());
17456    if let Some(node) = node.superclass() {
17457        visitor.visit(&node);
17458    }
17459    if let Some(node) = node.body() {
17460        visitor.visit(&node);
17461    }
17462}
17463
17464/// The default visitor implementation for a `ClassVariableAndWriteNode` node.
17465pub fn visit_class_variable_and_write_node<'pr, V>(visitor: &mut V, node: &ClassVariableAndWriteNode<'pr>)
17466where
17467    V: Visit<'pr> + ?Sized,
17468{
17469    visitor.visit(&node.value());
17470}
17471
17472/// The default visitor implementation for a `ClassVariableOperatorWriteNode` node.
17473pub fn visit_class_variable_operator_write_node<'pr, V>(visitor: &mut V, node: &ClassVariableOperatorWriteNode<'pr>)
17474where
17475    V: Visit<'pr> + ?Sized,
17476{
17477    visitor.visit(&node.value());
17478}
17479
17480/// The default visitor implementation for a `ClassVariableOrWriteNode` node.
17481pub fn visit_class_variable_or_write_node<'pr, V>(visitor: &mut V, node: &ClassVariableOrWriteNode<'pr>)
17482where
17483    V: Visit<'pr> + ?Sized,
17484{
17485    visitor.visit(&node.value());
17486}
17487
17488/// The default visitor implementation for a `ClassVariableReadNode` node.
17489pub const fn visit_class_variable_read_node<'pr, V>(_visitor: &mut V, _node: &ClassVariableReadNode<'pr>)
17490where
17491    V: Visit<'pr> + ?Sized,
17492{}
17493
17494/// The default visitor implementation for a `ClassVariableTargetNode` node.
17495pub const fn visit_class_variable_target_node<'pr, V>(_visitor: &mut V, _node: &ClassVariableTargetNode<'pr>)
17496where
17497    V: Visit<'pr> + ?Sized,
17498{}
17499
17500/// The default visitor implementation for a `ClassVariableWriteNode` node.
17501pub fn visit_class_variable_write_node<'pr, V>(visitor: &mut V, node: &ClassVariableWriteNode<'pr>)
17502where
17503    V: Visit<'pr> + ?Sized,
17504{
17505    visitor.visit(&node.value());
17506}
17507
17508/// The default visitor implementation for a `ConstantAndWriteNode` node.
17509pub fn visit_constant_and_write_node<'pr, V>(visitor: &mut V, node: &ConstantAndWriteNode<'pr>)
17510where
17511    V: Visit<'pr> + ?Sized,
17512{
17513    visitor.visit(&node.value());
17514}
17515
17516/// The default visitor implementation for a `ConstantOperatorWriteNode` node.
17517pub fn visit_constant_operator_write_node<'pr, V>(visitor: &mut V, node: &ConstantOperatorWriteNode<'pr>)
17518where
17519    V: Visit<'pr> + ?Sized,
17520{
17521    visitor.visit(&node.value());
17522}
17523
17524/// The default visitor implementation for a `ConstantOrWriteNode` node.
17525pub fn visit_constant_or_write_node<'pr, V>(visitor: &mut V, node: &ConstantOrWriteNode<'pr>)
17526where
17527    V: Visit<'pr> + ?Sized,
17528{
17529    visitor.visit(&node.value());
17530}
17531
17532/// The default visitor implementation for a `ConstantPathAndWriteNode` node.
17533pub fn visit_constant_path_and_write_node<'pr, V>(visitor: &mut V, node: &ConstantPathAndWriteNode<'pr>)
17534where
17535    V: Visit<'pr> + ?Sized,
17536{
17537    visitor.visit_constant_path_node(&node.target());
17538    visitor.visit(&node.value());
17539}
17540
17541/// The default visitor implementation for a `ConstantPathNode` node.
17542pub fn visit_constant_path_node<'pr, V>(visitor: &mut V, node: &ConstantPathNode<'pr>)
17543where
17544    V: Visit<'pr> + ?Sized,
17545{
17546    if let Some(node) = node.parent() {
17547        visitor.visit(&node);
17548    }
17549}
17550
17551/// The default visitor implementation for a `ConstantPathOperatorWriteNode` node.
17552pub fn visit_constant_path_operator_write_node<'pr, V>(visitor: &mut V, node: &ConstantPathOperatorWriteNode<'pr>)
17553where
17554    V: Visit<'pr> + ?Sized,
17555{
17556    visitor.visit_constant_path_node(&node.target());
17557    visitor.visit(&node.value());
17558}
17559
17560/// The default visitor implementation for a `ConstantPathOrWriteNode` node.
17561pub fn visit_constant_path_or_write_node<'pr, V>(visitor: &mut V, node: &ConstantPathOrWriteNode<'pr>)
17562where
17563    V: Visit<'pr> + ?Sized,
17564{
17565    visitor.visit_constant_path_node(&node.target());
17566    visitor.visit(&node.value());
17567}
17568
17569/// The default visitor implementation for a `ConstantPathTargetNode` node.
17570pub fn visit_constant_path_target_node<'pr, V>(visitor: &mut V, node: &ConstantPathTargetNode<'pr>)
17571where
17572    V: Visit<'pr> + ?Sized,
17573{
17574    if let Some(node) = node.parent() {
17575        visitor.visit(&node);
17576    }
17577}
17578
17579/// The default visitor implementation for a `ConstantPathWriteNode` node.
17580pub fn visit_constant_path_write_node<'pr, V>(visitor: &mut V, node: &ConstantPathWriteNode<'pr>)
17581where
17582    V: Visit<'pr> + ?Sized,
17583{
17584    visitor.visit_constant_path_node(&node.target());
17585    visitor.visit(&node.value());
17586}
17587
17588/// The default visitor implementation for a `ConstantReadNode` node.
17589pub const fn visit_constant_read_node<'pr, V>(_visitor: &mut V, _node: &ConstantReadNode<'pr>)
17590where
17591    V: Visit<'pr> + ?Sized,
17592{}
17593
17594/// The default visitor implementation for a `ConstantTargetNode` node.
17595pub const fn visit_constant_target_node<'pr, V>(_visitor: &mut V, _node: &ConstantTargetNode<'pr>)
17596where
17597    V: Visit<'pr> + ?Sized,
17598{}
17599
17600/// The default visitor implementation for a `ConstantWriteNode` node.
17601pub fn visit_constant_write_node<'pr, V>(visitor: &mut V, node: &ConstantWriteNode<'pr>)
17602where
17603    V: Visit<'pr> + ?Sized,
17604{
17605    visitor.visit(&node.value());
17606}
17607
17608/// The default visitor implementation for a `DefNode` node.
17609pub fn visit_def_node<'pr, V>(visitor: &mut V, node: &DefNode<'pr>)
17610where
17611    V: Visit<'pr> + ?Sized,
17612{
17613    if let Some(node) = node.receiver() {
17614        visitor.visit(&node);
17615    }
17616    if let Some(node) = node.parameters() {
17617        visitor.visit_parameters_node(&node);
17618    }
17619    if let Some(node) = node.body() {
17620        visitor.visit(&node);
17621    }
17622}
17623
17624/// The default visitor implementation for a `DefinedNode` node.
17625pub fn visit_defined_node<'pr, V>(visitor: &mut V, node: &DefinedNode<'pr>)
17626where
17627    V: Visit<'pr> + ?Sized,
17628{
17629    visitor.visit(&node.value());
17630}
17631
17632/// The default visitor implementation for a `ElseNode` node.
17633pub fn visit_else_node<'pr, V>(visitor: &mut V, node: &ElseNode<'pr>)
17634where
17635    V: Visit<'pr> + ?Sized,
17636{
17637    if let Some(node) = node.statements() {
17638        visitor.visit_statements_node(&node);
17639    }
17640}
17641
17642/// The default visitor implementation for a `EmbeddedStatementsNode` node.
17643pub fn visit_embedded_statements_node<'pr, V>(visitor: &mut V, node: &EmbeddedStatementsNode<'pr>)
17644where
17645    V: Visit<'pr> + ?Sized,
17646{
17647    if let Some(node) = node.statements() {
17648        visitor.visit_statements_node(&node);
17649    }
17650}
17651
17652/// The default visitor implementation for a `EmbeddedVariableNode` node.
17653pub fn visit_embedded_variable_node<'pr, V>(visitor: &mut V, node: &EmbeddedVariableNode<'pr>)
17654where
17655    V: Visit<'pr> + ?Sized,
17656{
17657    visitor.visit(&node.variable());
17658}
17659
17660/// The default visitor implementation for a `EnsureNode` node.
17661pub fn visit_ensure_node<'pr, V>(visitor: &mut V, node: &EnsureNode<'pr>)
17662where
17663    V: Visit<'pr> + ?Sized,
17664{
17665    if let Some(node) = node.statements() {
17666        visitor.visit_statements_node(&node);
17667    }
17668}
17669
17670/// The default visitor implementation for a `ErrorRecoveryNode` node.
17671pub fn visit_error_recovery_node<'pr, V>(visitor: &mut V, node: &ErrorRecoveryNode<'pr>)
17672where
17673    V: Visit<'pr> + ?Sized,
17674{
17675    if let Some(node) = node.unexpected() {
17676        visitor.visit(&node);
17677    }
17678}
17679
17680/// The default visitor implementation for a `FalseNode` node.
17681pub const fn visit_false_node<'pr, V>(_visitor: &mut V, _node: &FalseNode<'pr>)
17682where
17683    V: Visit<'pr> + ?Sized,
17684{}
17685
17686/// The default visitor implementation for a `FindPatternNode` node.
17687pub fn visit_find_pattern_node<'pr, V>(visitor: &mut V, node: &FindPatternNode<'pr>)
17688where
17689    V: Visit<'pr> + ?Sized,
17690{
17691    if let Some(node) = node.constant() {
17692        visitor.visit(&node);
17693    }
17694    visitor.visit_splat_node(&node.left());
17695    for node in &node.requireds() {
17696        visitor.visit(&node);
17697    }
17698    visitor.visit_splat_node(&node.right());
17699}
17700
17701/// The default visitor implementation for a `FlipFlopNode` node.
17702pub fn visit_flip_flop_node<'pr, V>(visitor: &mut V, node: &FlipFlopNode<'pr>)
17703where
17704    V: Visit<'pr> + ?Sized,
17705{
17706    if let Some(node) = node.left() {
17707        visitor.visit(&node);
17708    }
17709    if let Some(node) = node.right() {
17710        visitor.visit(&node);
17711    }
17712}
17713
17714/// The default visitor implementation for a `FloatNode` node.
17715pub const fn visit_float_node<'pr, V>(_visitor: &mut V, _node: &FloatNode<'pr>)
17716where
17717    V: Visit<'pr> + ?Sized,
17718{}
17719
17720/// The default visitor implementation for a `ForNode` node.
17721pub fn visit_for_node<'pr, V>(visitor: &mut V, node: &ForNode<'pr>)
17722where
17723    V: Visit<'pr> + ?Sized,
17724{
17725    visitor.visit(&node.index());
17726    visitor.visit(&node.collection());
17727    if let Some(node) = node.statements() {
17728        visitor.visit_statements_node(&node);
17729    }
17730}
17731
17732/// The default visitor implementation for a `ForwardingArgumentsNode` node.
17733pub const fn visit_forwarding_arguments_node<'pr, V>(_visitor: &mut V, _node: &ForwardingArgumentsNode<'pr>)
17734where
17735    V: Visit<'pr> + ?Sized,
17736{}
17737
17738/// The default visitor implementation for a `ForwardingParameterNode` node.
17739pub const fn visit_forwarding_parameter_node<'pr, V>(_visitor: &mut V, _node: &ForwardingParameterNode<'pr>)
17740where
17741    V: Visit<'pr> + ?Sized,
17742{}
17743
17744/// The default visitor implementation for a `ForwardingSuperNode` node.
17745pub fn visit_forwarding_super_node<'pr, V>(visitor: &mut V, node: &ForwardingSuperNode<'pr>)
17746where
17747    V: Visit<'pr> + ?Sized,
17748{
17749    if let Some(node) = node.block() {
17750        visitor.visit_block_node(&node);
17751    }
17752}
17753
17754/// The default visitor implementation for a `GlobalVariableAndWriteNode` node.
17755pub fn visit_global_variable_and_write_node<'pr, V>(visitor: &mut V, node: &GlobalVariableAndWriteNode<'pr>)
17756where
17757    V: Visit<'pr> + ?Sized,
17758{
17759    visitor.visit(&node.value());
17760}
17761
17762/// The default visitor implementation for a `GlobalVariableOperatorWriteNode` node.
17763pub fn visit_global_variable_operator_write_node<'pr, V>(visitor: &mut V, node: &GlobalVariableOperatorWriteNode<'pr>)
17764where
17765    V: Visit<'pr> + ?Sized,
17766{
17767    visitor.visit(&node.value());
17768}
17769
17770/// The default visitor implementation for a `GlobalVariableOrWriteNode` node.
17771pub fn visit_global_variable_or_write_node<'pr, V>(visitor: &mut V, node: &GlobalVariableOrWriteNode<'pr>)
17772where
17773    V: Visit<'pr> + ?Sized,
17774{
17775    visitor.visit(&node.value());
17776}
17777
17778/// The default visitor implementation for a `GlobalVariableReadNode` node.
17779pub const fn visit_global_variable_read_node<'pr, V>(_visitor: &mut V, _node: &GlobalVariableReadNode<'pr>)
17780where
17781    V: Visit<'pr> + ?Sized,
17782{}
17783
17784/// The default visitor implementation for a `GlobalVariableTargetNode` node.
17785pub const fn visit_global_variable_target_node<'pr, V>(_visitor: &mut V, _node: &GlobalVariableTargetNode<'pr>)
17786where
17787    V: Visit<'pr> + ?Sized,
17788{}
17789
17790/// The default visitor implementation for a `GlobalVariableWriteNode` node.
17791pub fn visit_global_variable_write_node<'pr, V>(visitor: &mut V, node: &GlobalVariableWriteNode<'pr>)
17792where
17793    V: Visit<'pr> + ?Sized,
17794{
17795    visitor.visit(&node.value());
17796}
17797
17798/// The default visitor implementation for a `HashNode` node.
17799pub fn visit_hash_node<'pr, V>(visitor: &mut V, node: &HashNode<'pr>)
17800where
17801    V: Visit<'pr> + ?Sized,
17802{
17803    for node in &node.elements() {
17804        visitor.visit(&node);
17805    }
17806}
17807
17808/// The default visitor implementation for a `HashPatternNode` node.
17809pub fn visit_hash_pattern_node<'pr, V>(visitor: &mut V, node: &HashPatternNode<'pr>)
17810where
17811    V: Visit<'pr> + ?Sized,
17812{
17813    if let Some(node) = node.constant() {
17814        visitor.visit(&node);
17815    }
17816    for node in &node.elements() {
17817        visitor.visit(&node);
17818    }
17819    if let Some(node) = node.rest() {
17820        visitor.visit(&node);
17821    }
17822}
17823
17824/// The default visitor implementation for a `IfNode` node.
17825pub fn visit_if_node<'pr, V>(visitor: &mut V, node: &IfNode<'pr>)
17826where
17827    V: Visit<'pr> + ?Sized,
17828{
17829    visitor.visit(&node.predicate());
17830    if let Some(node) = node.statements() {
17831        visitor.visit_statements_node(&node);
17832    }
17833    if let Some(node) = node.subsequent() {
17834        visitor.visit(&node);
17835    }
17836}
17837
17838/// The default visitor implementation for a `ImaginaryNode` node.
17839pub fn visit_imaginary_node<'pr, V>(visitor: &mut V, node: &ImaginaryNode<'pr>)
17840where
17841    V: Visit<'pr> + ?Sized,
17842{
17843    visitor.visit(&node.numeric());
17844}
17845
17846/// The default visitor implementation for a `ImplicitNode` node.
17847pub fn visit_implicit_node<'pr, V>(visitor: &mut V, node: &ImplicitNode<'pr>)
17848where
17849    V: Visit<'pr> + ?Sized,
17850{
17851    visitor.visit(&node.value());
17852}
17853
17854/// The default visitor implementation for a `ImplicitRestNode` node.
17855pub const fn visit_implicit_rest_node<'pr, V>(_visitor: &mut V, _node: &ImplicitRestNode<'pr>)
17856where
17857    V: Visit<'pr> + ?Sized,
17858{}
17859
17860/// The default visitor implementation for a `InNode` node.
17861pub fn visit_in_node<'pr, V>(visitor: &mut V, node: &InNode<'pr>)
17862where
17863    V: Visit<'pr> + ?Sized,
17864{
17865    visitor.visit(&node.pattern());
17866    if let Some(node) = node.statements() {
17867        visitor.visit_statements_node(&node);
17868    }
17869}
17870
17871/// The default visitor implementation for a `IndexAndWriteNode` node.
17872pub fn visit_index_and_write_node<'pr, V>(visitor: &mut V, node: &IndexAndWriteNode<'pr>)
17873where
17874    V: Visit<'pr> + ?Sized,
17875{
17876    if let Some(node) = node.receiver() {
17877        visitor.visit(&node);
17878    }
17879    if let Some(node) = node.arguments() {
17880        visitor.visit_arguments_node(&node);
17881    }
17882    if let Some(node) = node.block() {
17883        visitor.visit_block_argument_node(&node);
17884    }
17885    visitor.visit(&node.value());
17886}
17887
17888/// The default visitor implementation for a `IndexOperatorWriteNode` node.
17889pub fn visit_index_operator_write_node<'pr, V>(visitor: &mut V, node: &IndexOperatorWriteNode<'pr>)
17890where
17891    V: Visit<'pr> + ?Sized,
17892{
17893    if let Some(node) = node.receiver() {
17894        visitor.visit(&node);
17895    }
17896    if let Some(node) = node.arguments() {
17897        visitor.visit_arguments_node(&node);
17898    }
17899    if let Some(node) = node.block() {
17900        visitor.visit_block_argument_node(&node);
17901    }
17902    visitor.visit(&node.value());
17903}
17904
17905/// The default visitor implementation for a `IndexOrWriteNode` node.
17906pub fn visit_index_or_write_node<'pr, V>(visitor: &mut V, node: &IndexOrWriteNode<'pr>)
17907where
17908    V: Visit<'pr> + ?Sized,
17909{
17910    if let Some(node) = node.receiver() {
17911        visitor.visit(&node);
17912    }
17913    if let Some(node) = node.arguments() {
17914        visitor.visit_arguments_node(&node);
17915    }
17916    if let Some(node) = node.block() {
17917        visitor.visit_block_argument_node(&node);
17918    }
17919    visitor.visit(&node.value());
17920}
17921
17922/// The default visitor implementation for a `IndexTargetNode` node.
17923pub fn visit_index_target_node<'pr, V>(visitor: &mut V, node: &IndexTargetNode<'pr>)
17924where
17925    V: Visit<'pr> + ?Sized,
17926{
17927    visitor.visit(&node.receiver());
17928    if let Some(node) = node.arguments() {
17929        visitor.visit_arguments_node(&node);
17930    }
17931    if let Some(node) = node.block() {
17932        visitor.visit_block_argument_node(&node);
17933    }
17934}
17935
17936/// The default visitor implementation for a `InstanceVariableAndWriteNode` node.
17937pub fn visit_instance_variable_and_write_node<'pr, V>(visitor: &mut V, node: &InstanceVariableAndWriteNode<'pr>)
17938where
17939    V: Visit<'pr> + ?Sized,
17940{
17941    visitor.visit(&node.value());
17942}
17943
17944/// The default visitor implementation for a `InstanceVariableOperatorWriteNode` node.
17945pub fn visit_instance_variable_operator_write_node<'pr, V>(visitor: &mut V, node: &InstanceVariableOperatorWriteNode<'pr>)
17946where
17947    V: Visit<'pr> + ?Sized,
17948{
17949    visitor.visit(&node.value());
17950}
17951
17952/// The default visitor implementation for a `InstanceVariableOrWriteNode` node.
17953pub fn visit_instance_variable_or_write_node<'pr, V>(visitor: &mut V, node: &InstanceVariableOrWriteNode<'pr>)
17954where
17955    V: Visit<'pr> + ?Sized,
17956{
17957    visitor.visit(&node.value());
17958}
17959
17960/// The default visitor implementation for a `InstanceVariableReadNode` node.
17961pub const fn visit_instance_variable_read_node<'pr, V>(_visitor: &mut V, _node: &InstanceVariableReadNode<'pr>)
17962where
17963    V: Visit<'pr> + ?Sized,
17964{}
17965
17966/// The default visitor implementation for a `InstanceVariableTargetNode` node.
17967pub const fn visit_instance_variable_target_node<'pr, V>(_visitor: &mut V, _node: &InstanceVariableTargetNode<'pr>)
17968where
17969    V: Visit<'pr> + ?Sized,
17970{}
17971
17972/// The default visitor implementation for a `InstanceVariableWriteNode` node.
17973pub fn visit_instance_variable_write_node<'pr, V>(visitor: &mut V, node: &InstanceVariableWriteNode<'pr>)
17974where
17975    V: Visit<'pr> + ?Sized,
17976{
17977    visitor.visit(&node.value());
17978}
17979
17980/// The default visitor implementation for a `IntegerNode` node.
17981pub const fn visit_integer_node<'pr, V>(_visitor: &mut V, _node: &IntegerNode<'pr>)
17982where
17983    V: Visit<'pr> + ?Sized,
17984{}
17985
17986/// The default visitor implementation for a `InterpolatedMatchLastLineNode` node.
17987pub fn visit_interpolated_match_last_line_node<'pr, V>(visitor: &mut V, node: &InterpolatedMatchLastLineNode<'pr>)
17988where
17989    V: Visit<'pr> + ?Sized,
17990{
17991    for node in &node.parts() {
17992        visitor.visit(&node);
17993    }
17994}
17995
17996/// The default visitor implementation for a `InterpolatedRegularExpressionNode` node.
17997pub fn visit_interpolated_regular_expression_node<'pr, V>(visitor: &mut V, node: &InterpolatedRegularExpressionNode<'pr>)
17998where
17999    V: Visit<'pr> + ?Sized,
18000{
18001    for node in &node.parts() {
18002        visitor.visit(&node);
18003    }
18004}
18005
18006/// The default visitor implementation for a `InterpolatedStringNode` node.
18007pub fn visit_interpolated_string_node<'pr, V>(visitor: &mut V, node: &InterpolatedStringNode<'pr>)
18008where
18009    V: Visit<'pr> + ?Sized,
18010{
18011    for node in &node.parts() {
18012        visitor.visit(&node);
18013    }
18014}
18015
18016/// The default visitor implementation for a `InterpolatedSymbolNode` node.
18017pub fn visit_interpolated_symbol_node<'pr, V>(visitor: &mut V, node: &InterpolatedSymbolNode<'pr>)
18018where
18019    V: Visit<'pr> + ?Sized,
18020{
18021    for node in &node.parts() {
18022        visitor.visit(&node);
18023    }
18024}
18025
18026/// The default visitor implementation for a `InterpolatedXStringNode` node.
18027pub fn visit_interpolated_x_string_node<'pr, V>(visitor: &mut V, node: &InterpolatedXStringNode<'pr>)
18028where
18029    V: Visit<'pr> + ?Sized,
18030{
18031    for node in &node.parts() {
18032        visitor.visit(&node);
18033    }
18034}
18035
18036/// The default visitor implementation for a `ItLocalVariableReadNode` node.
18037pub const fn visit_it_local_variable_read_node<'pr, V>(_visitor: &mut V, _node: &ItLocalVariableReadNode<'pr>)
18038where
18039    V: Visit<'pr> + ?Sized,
18040{}
18041
18042/// The default visitor implementation for a `ItParametersNode` node.
18043pub const fn visit_it_parameters_node<'pr, V>(_visitor: &mut V, _node: &ItParametersNode<'pr>)
18044where
18045    V: Visit<'pr> + ?Sized,
18046{}
18047
18048/// The default visitor implementation for a `KeywordHashNode` node.
18049pub fn visit_keyword_hash_node<'pr, V>(visitor: &mut V, node: &KeywordHashNode<'pr>)
18050where
18051    V: Visit<'pr> + ?Sized,
18052{
18053    for node in &node.elements() {
18054        visitor.visit(&node);
18055    }
18056}
18057
18058/// The default visitor implementation for a `KeywordRestParameterNode` node.
18059pub const fn visit_keyword_rest_parameter_node<'pr, V>(_visitor: &mut V, _node: &KeywordRestParameterNode<'pr>)
18060where
18061    V: Visit<'pr> + ?Sized,
18062{}
18063
18064/// The default visitor implementation for a `LambdaNode` node.
18065pub fn visit_lambda_node<'pr, V>(visitor: &mut V, node: &LambdaNode<'pr>)
18066where
18067    V: Visit<'pr> + ?Sized,
18068{
18069    if let Some(node) = node.parameters() {
18070        visitor.visit(&node);
18071    }
18072    if let Some(node) = node.body() {
18073        visitor.visit(&node);
18074    }
18075}
18076
18077/// The default visitor implementation for a `LocalVariableAndWriteNode` node.
18078pub fn visit_local_variable_and_write_node<'pr, V>(visitor: &mut V, node: &LocalVariableAndWriteNode<'pr>)
18079where
18080    V: Visit<'pr> + ?Sized,
18081{
18082    visitor.visit(&node.value());
18083}
18084
18085/// The default visitor implementation for a `LocalVariableOperatorWriteNode` node.
18086pub fn visit_local_variable_operator_write_node<'pr, V>(visitor: &mut V, node: &LocalVariableOperatorWriteNode<'pr>)
18087where
18088    V: Visit<'pr> + ?Sized,
18089{
18090    visitor.visit(&node.value());
18091}
18092
18093/// The default visitor implementation for a `LocalVariableOrWriteNode` node.
18094pub fn visit_local_variable_or_write_node<'pr, V>(visitor: &mut V, node: &LocalVariableOrWriteNode<'pr>)
18095where
18096    V: Visit<'pr> + ?Sized,
18097{
18098    visitor.visit(&node.value());
18099}
18100
18101/// The default visitor implementation for a `LocalVariableReadNode` node.
18102pub const fn visit_local_variable_read_node<'pr, V>(_visitor: &mut V, _node: &LocalVariableReadNode<'pr>)
18103where
18104    V: Visit<'pr> + ?Sized,
18105{}
18106
18107/// The default visitor implementation for a `LocalVariableTargetNode` node.
18108pub const fn visit_local_variable_target_node<'pr, V>(_visitor: &mut V, _node: &LocalVariableTargetNode<'pr>)
18109where
18110    V: Visit<'pr> + ?Sized,
18111{}
18112
18113/// The default visitor implementation for a `LocalVariableWriteNode` node.
18114pub fn visit_local_variable_write_node<'pr, V>(visitor: &mut V, node: &LocalVariableWriteNode<'pr>)
18115where
18116    V: Visit<'pr> + ?Sized,
18117{
18118    visitor.visit(&node.value());
18119}
18120
18121/// The default visitor implementation for a `MatchLastLineNode` node.
18122pub const fn visit_match_last_line_node<'pr, V>(_visitor: &mut V, _node: &MatchLastLineNode<'pr>)
18123where
18124    V: Visit<'pr> + ?Sized,
18125{}
18126
18127/// The default visitor implementation for a `MatchPredicateNode` node.
18128pub fn visit_match_predicate_node<'pr, V>(visitor: &mut V, node: &MatchPredicateNode<'pr>)
18129where
18130    V: Visit<'pr> + ?Sized,
18131{
18132    visitor.visit(&node.value());
18133    visitor.visit(&node.pattern());
18134}
18135
18136/// The default visitor implementation for a `MatchRequiredNode` node.
18137pub fn visit_match_required_node<'pr, V>(visitor: &mut V, node: &MatchRequiredNode<'pr>)
18138where
18139    V: Visit<'pr> + ?Sized,
18140{
18141    visitor.visit(&node.value());
18142    visitor.visit(&node.pattern());
18143}
18144
18145/// The default visitor implementation for a `MatchWriteNode` node.
18146pub fn visit_match_write_node<'pr, V>(visitor: &mut V, node: &MatchWriteNode<'pr>)
18147where
18148    V: Visit<'pr> + ?Sized,
18149{
18150    visitor.visit_call_node(&node.call());
18151    for node in &node.targets() {
18152        visitor.visit(&node);
18153    }
18154}
18155
18156/// The default visitor implementation for a `ModuleNode` node.
18157pub fn visit_module_node<'pr, V>(visitor: &mut V, node: &ModuleNode<'pr>)
18158where
18159    V: Visit<'pr> + ?Sized,
18160{
18161    visitor.visit(&node.constant_path());
18162    if let Some(node) = node.body() {
18163        visitor.visit(&node);
18164    }
18165}
18166
18167/// The default visitor implementation for a `MultiTargetNode` node.
18168pub fn visit_multi_target_node<'pr, V>(visitor: &mut V, node: &MultiTargetNode<'pr>)
18169where
18170    V: Visit<'pr> + ?Sized,
18171{
18172    for node in &node.lefts() {
18173        visitor.visit(&node);
18174    }
18175    if let Some(node) = node.rest() {
18176        visitor.visit(&node);
18177    }
18178    for node in &node.rights() {
18179        visitor.visit(&node);
18180    }
18181}
18182
18183/// The default visitor implementation for a `MultiWriteNode` node.
18184pub fn visit_multi_write_node<'pr, V>(visitor: &mut V, node: &MultiWriteNode<'pr>)
18185where
18186    V: Visit<'pr> + ?Sized,
18187{
18188    for node in &node.lefts() {
18189        visitor.visit(&node);
18190    }
18191    if let Some(node) = node.rest() {
18192        visitor.visit(&node);
18193    }
18194    for node in &node.rights() {
18195        visitor.visit(&node);
18196    }
18197    visitor.visit(&node.value());
18198}
18199
18200/// The default visitor implementation for a `NextNode` node.
18201pub fn visit_next_node<'pr, V>(visitor: &mut V, node: &NextNode<'pr>)
18202where
18203    V: Visit<'pr> + ?Sized,
18204{
18205    if let Some(node) = node.arguments() {
18206        visitor.visit_arguments_node(&node);
18207    }
18208}
18209
18210/// The default visitor implementation for a `NilNode` node.
18211pub const fn visit_nil_node<'pr, V>(_visitor: &mut V, _node: &NilNode<'pr>)
18212where
18213    V: Visit<'pr> + ?Sized,
18214{}
18215
18216/// The default visitor implementation for a `NoBlockParameterNode` node.
18217pub const fn visit_no_block_parameter_node<'pr, V>(_visitor: &mut V, _node: &NoBlockParameterNode<'pr>)
18218where
18219    V: Visit<'pr> + ?Sized,
18220{}
18221
18222/// The default visitor implementation for a `NoKeywordsParameterNode` node.
18223pub const fn visit_no_keywords_parameter_node<'pr, V>(_visitor: &mut V, _node: &NoKeywordsParameterNode<'pr>)
18224where
18225    V: Visit<'pr> + ?Sized,
18226{}
18227
18228/// The default visitor implementation for a `NumberedParametersNode` node.
18229pub const fn visit_numbered_parameters_node<'pr, V>(_visitor: &mut V, _node: &NumberedParametersNode<'pr>)
18230where
18231    V: Visit<'pr> + ?Sized,
18232{}
18233
18234/// The default visitor implementation for a `NumberedReferenceReadNode` node.
18235pub const fn visit_numbered_reference_read_node<'pr, V>(_visitor: &mut V, _node: &NumberedReferenceReadNode<'pr>)
18236where
18237    V: Visit<'pr> + ?Sized,
18238{}
18239
18240/// The default visitor implementation for a `OptionalKeywordParameterNode` node.
18241pub fn visit_optional_keyword_parameter_node<'pr, V>(visitor: &mut V, node: &OptionalKeywordParameterNode<'pr>)
18242where
18243    V: Visit<'pr> + ?Sized,
18244{
18245    visitor.visit(&node.value());
18246}
18247
18248/// The default visitor implementation for a `OptionalParameterNode` node.
18249pub fn visit_optional_parameter_node<'pr, V>(visitor: &mut V, node: &OptionalParameterNode<'pr>)
18250where
18251    V: Visit<'pr> + ?Sized,
18252{
18253    visitor.visit(&node.value());
18254}
18255
18256/// The default visitor implementation for a `OrNode` node.
18257pub fn visit_or_node<'pr, V>(visitor: &mut V, node: &OrNode<'pr>)
18258where
18259    V: Visit<'pr> + ?Sized,
18260{
18261    visitor.visit(&node.left());
18262    visitor.visit(&node.right());
18263}
18264
18265/// The default visitor implementation for a `ParametersNode` node.
18266pub fn visit_parameters_node<'pr, V>(visitor: &mut V, node: &ParametersNode<'pr>)
18267where
18268    V: Visit<'pr> + ?Sized,
18269{
18270    for node in &node.requireds() {
18271        visitor.visit(&node);
18272    }
18273    for node in &node.optionals() {
18274        visitor.visit(&node);
18275    }
18276    if let Some(node) = node.rest() {
18277        visitor.visit(&node);
18278    }
18279    for node in &node.posts() {
18280        visitor.visit(&node);
18281    }
18282    for node in &node.keywords() {
18283        visitor.visit(&node);
18284    }
18285    if let Some(node) = node.keyword_rest() {
18286        visitor.visit(&node);
18287    }
18288    if let Some(node) = node.block() {
18289        visitor.visit(&node);
18290    }
18291}
18292
18293/// The default visitor implementation for a `ParenthesesNode` node.
18294pub fn visit_parentheses_node<'pr, V>(visitor: &mut V, node: &ParenthesesNode<'pr>)
18295where
18296    V: Visit<'pr> + ?Sized,
18297{
18298    if let Some(node) = node.body() {
18299        visitor.visit(&node);
18300    }
18301}
18302
18303/// The default visitor implementation for a `PinnedExpressionNode` node.
18304pub fn visit_pinned_expression_node<'pr, V>(visitor: &mut V, node: &PinnedExpressionNode<'pr>)
18305where
18306    V: Visit<'pr> + ?Sized,
18307{
18308    visitor.visit(&node.expression());
18309}
18310
18311/// The default visitor implementation for a `PinnedVariableNode` node.
18312pub fn visit_pinned_variable_node<'pr, V>(visitor: &mut V, node: &PinnedVariableNode<'pr>)
18313where
18314    V: Visit<'pr> + ?Sized,
18315{
18316    visitor.visit(&node.variable());
18317}
18318
18319/// The default visitor implementation for a `PostExecutionNode` node.
18320pub fn visit_post_execution_node<'pr, V>(visitor: &mut V, node: &PostExecutionNode<'pr>)
18321where
18322    V: Visit<'pr> + ?Sized,
18323{
18324    if let Some(node) = node.statements() {
18325        visitor.visit_statements_node(&node);
18326    }
18327}
18328
18329/// The default visitor implementation for a `PreExecutionNode` node.
18330pub fn visit_pre_execution_node<'pr, V>(visitor: &mut V, node: &PreExecutionNode<'pr>)
18331where
18332    V: Visit<'pr> + ?Sized,
18333{
18334    if let Some(node) = node.statements() {
18335        visitor.visit_statements_node(&node);
18336    }
18337}
18338
18339/// The default visitor implementation for a `ProgramNode` node.
18340pub fn visit_program_node<'pr, V>(visitor: &mut V, node: &ProgramNode<'pr>)
18341where
18342    V: Visit<'pr> + ?Sized,
18343{
18344    visitor.visit_statements_node(&node.statements());
18345}
18346
18347/// The default visitor implementation for a `RangeNode` node.
18348pub fn visit_range_node<'pr, V>(visitor: &mut V, node: &RangeNode<'pr>)
18349where
18350    V: Visit<'pr> + ?Sized,
18351{
18352    if let Some(node) = node.left() {
18353        visitor.visit(&node);
18354    }
18355    if let Some(node) = node.right() {
18356        visitor.visit(&node);
18357    }
18358}
18359
18360/// The default visitor implementation for a `RationalNode` node.
18361pub const fn visit_rational_node<'pr, V>(_visitor: &mut V, _node: &RationalNode<'pr>)
18362where
18363    V: Visit<'pr> + ?Sized,
18364{}
18365
18366/// The default visitor implementation for a `RedoNode` node.
18367pub const fn visit_redo_node<'pr, V>(_visitor: &mut V, _node: &RedoNode<'pr>)
18368where
18369    V: Visit<'pr> + ?Sized,
18370{}
18371
18372/// The default visitor implementation for a `RegularExpressionNode` node.
18373pub const fn visit_regular_expression_node<'pr, V>(_visitor: &mut V, _node: &RegularExpressionNode<'pr>)
18374where
18375    V: Visit<'pr> + ?Sized,
18376{}
18377
18378/// The default visitor implementation for a `RequiredKeywordParameterNode` node.
18379pub const fn visit_required_keyword_parameter_node<'pr, V>(_visitor: &mut V, _node: &RequiredKeywordParameterNode<'pr>)
18380where
18381    V: Visit<'pr> + ?Sized,
18382{}
18383
18384/// The default visitor implementation for a `RequiredParameterNode` node.
18385pub const fn visit_required_parameter_node<'pr, V>(_visitor: &mut V, _node: &RequiredParameterNode<'pr>)
18386where
18387    V: Visit<'pr> + ?Sized,
18388{}
18389
18390/// The default visitor implementation for a `RescueModifierNode` node.
18391pub fn visit_rescue_modifier_node<'pr, V>(visitor: &mut V, node: &RescueModifierNode<'pr>)
18392where
18393    V: Visit<'pr> + ?Sized,
18394{
18395    visitor.visit(&node.expression());
18396    visitor.visit(&node.rescue_expression());
18397}
18398
18399/// The default visitor implementation for a `RescueNode` node.
18400pub fn visit_rescue_node<'pr, V>(visitor: &mut V, node: &RescueNode<'pr>)
18401where
18402    V: Visit<'pr> + ?Sized,
18403{
18404    for node in &node.exceptions() {
18405        visitor.visit(&node);
18406    }
18407    if let Some(node) = node.reference() {
18408        visitor.visit(&node);
18409    }
18410    if let Some(node) = node.statements() {
18411        visitor.visit_statements_node(&node);
18412    }
18413    if let Some(node) = node.subsequent() {
18414        visitor.visit_rescue_node(&node);
18415    }
18416}
18417
18418/// The default visitor implementation for a `RestParameterNode` node.
18419pub const fn visit_rest_parameter_node<'pr, V>(_visitor: &mut V, _node: &RestParameterNode<'pr>)
18420where
18421    V: Visit<'pr> + ?Sized,
18422{}
18423
18424/// The default visitor implementation for a `RetryNode` node.
18425pub const fn visit_retry_node<'pr, V>(_visitor: &mut V, _node: &RetryNode<'pr>)
18426where
18427    V: Visit<'pr> + ?Sized,
18428{}
18429
18430/// The default visitor implementation for a `ReturnNode` node.
18431pub fn visit_return_node<'pr, V>(visitor: &mut V, node: &ReturnNode<'pr>)
18432where
18433    V: Visit<'pr> + ?Sized,
18434{
18435    if let Some(node) = node.arguments() {
18436        visitor.visit_arguments_node(&node);
18437    }
18438}
18439
18440/// The default visitor implementation for a `SelfNode` node.
18441pub const fn visit_self_node<'pr, V>(_visitor: &mut V, _node: &SelfNode<'pr>)
18442where
18443    V: Visit<'pr> + ?Sized,
18444{}
18445
18446/// The default visitor implementation for a `ShareableConstantNode` node.
18447pub fn visit_shareable_constant_node<'pr, V>(visitor: &mut V, node: &ShareableConstantNode<'pr>)
18448where
18449    V: Visit<'pr> + ?Sized,
18450{
18451    visitor.visit(&node.write());
18452}
18453
18454/// The default visitor implementation for a `SingletonClassNode` node.
18455pub fn visit_singleton_class_node<'pr, V>(visitor: &mut V, node: &SingletonClassNode<'pr>)
18456where
18457    V: Visit<'pr> + ?Sized,
18458{
18459    visitor.visit(&node.expression());
18460    if let Some(node) = node.body() {
18461        visitor.visit(&node);
18462    }
18463}
18464
18465/// The default visitor implementation for a `SourceEncodingNode` node.
18466pub const fn visit_source_encoding_node<'pr, V>(_visitor: &mut V, _node: &SourceEncodingNode<'pr>)
18467where
18468    V: Visit<'pr> + ?Sized,
18469{}
18470
18471/// The default visitor implementation for a `SourceFileNode` node.
18472pub const fn visit_source_file_node<'pr, V>(_visitor: &mut V, _node: &SourceFileNode<'pr>)
18473where
18474    V: Visit<'pr> + ?Sized,
18475{}
18476
18477/// The default visitor implementation for a `SourceLineNode` node.
18478pub const fn visit_source_line_node<'pr, V>(_visitor: &mut V, _node: &SourceLineNode<'pr>)
18479where
18480    V: Visit<'pr> + ?Sized,
18481{}
18482
18483/// The default visitor implementation for a `SplatNode` node.
18484pub fn visit_splat_node<'pr, V>(visitor: &mut V, node: &SplatNode<'pr>)
18485where
18486    V: Visit<'pr> + ?Sized,
18487{
18488    if let Some(node) = node.expression() {
18489        visitor.visit(&node);
18490    }
18491}
18492
18493/// The default visitor implementation for a `StatementsNode` node.
18494pub fn visit_statements_node<'pr, V>(visitor: &mut V, node: &StatementsNode<'pr>)
18495where
18496    V: Visit<'pr> + ?Sized,
18497{
18498    for node in &node.body() {
18499        visitor.visit(&node);
18500    }
18501}
18502
18503/// The default visitor implementation for a `StringNode` node.
18504pub const fn visit_string_node<'pr, V>(_visitor: &mut V, _node: &StringNode<'pr>)
18505where
18506    V: Visit<'pr> + ?Sized,
18507{}
18508
18509/// The default visitor implementation for a `SuperNode` node.
18510pub fn visit_super_node<'pr, V>(visitor: &mut V, node: &SuperNode<'pr>)
18511where
18512    V: Visit<'pr> + ?Sized,
18513{
18514    if let Some(node) = node.arguments() {
18515        visitor.visit_arguments_node(&node);
18516    }
18517    if let Some(node) = node.block() {
18518        visitor.visit(&node);
18519    }
18520}
18521
18522/// The default visitor implementation for a `SymbolNode` node.
18523pub const fn visit_symbol_node<'pr, V>(_visitor: &mut V, _node: &SymbolNode<'pr>)
18524where
18525    V: Visit<'pr> + ?Sized,
18526{}
18527
18528/// The default visitor implementation for a `TrueNode` node.
18529pub const fn visit_true_node<'pr, V>(_visitor: &mut V, _node: &TrueNode<'pr>)
18530where
18531    V: Visit<'pr> + ?Sized,
18532{}
18533
18534/// The default visitor implementation for a `UndefNode` node.
18535pub fn visit_undef_node<'pr, V>(visitor: &mut V, node: &UndefNode<'pr>)
18536where
18537    V: Visit<'pr> + ?Sized,
18538{
18539    for node in &node.names() {
18540        visitor.visit(&node);
18541    }
18542}
18543
18544/// The default visitor implementation for a `UnlessNode` node.
18545pub fn visit_unless_node<'pr, V>(visitor: &mut V, node: &UnlessNode<'pr>)
18546where
18547    V: Visit<'pr> + ?Sized,
18548{
18549    visitor.visit(&node.predicate());
18550    if let Some(node) = node.statements() {
18551        visitor.visit_statements_node(&node);
18552    }
18553    if let Some(node) = node.else_clause() {
18554        visitor.visit_else_node(&node);
18555    }
18556}
18557
18558/// The default visitor implementation for a `UntilNode` node.
18559pub fn visit_until_node<'pr, V>(visitor: &mut V, node: &UntilNode<'pr>)
18560where
18561    V: Visit<'pr> + ?Sized,
18562{
18563    visitor.visit(&node.predicate());
18564    if let Some(node) = node.statements() {
18565        visitor.visit_statements_node(&node);
18566    }
18567}
18568
18569/// The default visitor implementation for a `WhenNode` node.
18570pub fn visit_when_node<'pr, V>(visitor: &mut V, node: &WhenNode<'pr>)
18571where
18572    V: Visit<'pr> + ?Sized,
18573{
18574    for node in &node.conditions() {
18575        visitor.visit(&node);
18576    }
18577    if let Some(node) = node.statements() {
18578        visitor.visit_statements_node(&node);
18579    }
18580}
18581
18582/// The default visitor implementation for a `WhileNode` node.
18583pub fn visit_while_node<'pr, V>(visitor: &mut V, node: &WhileNode<'pr>)
18584where
18585    V: Visit<'pr> + ?Sized,
18586{
18587    visitor.visit(&node.predicate());
18588    if let Some(node) = node.statements() {
18589        visitor.visit_statements_node(&node);
18590    }
18591}
18592
18593/// The default visitor implementation for a `XStringNode` node.
18594pub const fn visit_x_string_node<'pr, V>(_visitor: &mut V, _node: &XStringNode<'pr>)
18595where
18596    V: Visit<'pr> + ?Sized,
18597{}
18598
18599/// The default visitor implementation for a `YieldNode` node.
18600pub fn visit_yield_node<'pr, V>(visitor: &mut V, node: &YieldNode<'pr>)
18601where
18602    V: Visit<'pr> + ?Sized,
18603{
18604    if let Some(node) = node.arguments() {
18605        visitor.visit_arguments_node(&node);
18606    }
18607}