scilla_parser/ast/
converting.rs

1use super::{TraversalResult, TreeTraversalMode};
2use crate::{ast::nodes::*, parser::lexer::SourcePosition};
3
4/// The `AstConverting` trait is used for converting an Abstract Syntax Tree (AST)
5/// to some other form, such as an internal or intermediate representation.
6/// Each method corresponds to a specific node in the AST and is responsible for
7/// converting that node and its children. The methods are called upon entering and
8/// exiting the tree traversal and the return result informs the visitor algorithm
9/// how to proceed.
10pub trait AstConverting {
11    /// Pushes the source position of the current node onto a stack.
12    fn push_source_position(&mut self, start: &SourcePosition, end: &SourcePosition);
13
14    /// Pops the source position of the current node from the stack.
15    fn pop_source_position(&mut self);
16
17    /// Converts a `NodeByteStr` node.
18    fn emit_byte_str(
19        &mut self,
20        mode: TreeTraversalMode,
21        node: &NodeByteStr,
22    ) -> Result<TraversalResult, String>;
23
24    /// Converts a `NodeTypeNameIdentifier` node.
25    fn emit_type_name_identifier(
26        &mut self,
27        mode: TreeTraversalMode,
28        node: &NodeTypeNameIdentifier,
29    ) -> Result<TraversalResult, String>;
30
31    /// Converts a `NodeImportedName` node.
32    fn emit_imported_name(
33        &mut self,
34        mode: TreeTraversalMode,
35        node: &NodeImportedName,
36    ) -> Result<TraversalResult, String>;
37
38    /// Converts a `NodeImportDeclarations` node.
39    fn emit_import_declarations(
40        &mut self,
41        mode: TreeTraversalMode,
42        node: &NodeImportDeclarations,
43    ) -> Result<TraversalResult, String>;
44
45    /// Converts a `NodeMetaIdentifier` node.
46    fn emit_meta_identifier(
47        &mut self,
48        mode: TreeTraversalMode,
49        node: &NodeMetaIdentifier,
50    ) -> Result<TraversalResult, String>;
51
52    /// Converts a `NodeVariableIdentifier` node.
53    fn emit_variable_identifier(
54        &mut self,
55        mode: TreeTraversalMode,
56        node: &NodeVariableIdentifier,
57    ) -> Result<TraversalResult, String>;
58
59    /// Converts a `NodeBuiltinArguments` node.
60    fn emit_builtin_arguments(
61        &mut self,
62        mode: TreeTraversalMode,
63        node: &NodeBuiltinArguments,
64    ) -> Result<TraversalResult, String>;
65
66    /// Converts a `NodeTypeMapKey` node.
67    fn emit_type_map_key(
68        &mut self,
69        mode: TreeTraversalMode,
70        node: &NodeTypeMapKey,
71    ) -> Result<TraversalResult, String>;
72
73    /// Converts a `NodeTypeMapValue` node.
74    fn emit_type_map_value(
75        &mut self,
76        mode: TreeTraversalMode,
77        node: &NodeTypeMapValue,
78    ) -> Result<TraversalResult, String>;
79
80    /// Converts a `NodeTypeArgument` node.
81    fn emit_type_argument(
82        &mut self,
83        mode: TreeTraversalMode,
84        node: &NodeTypeArgument,
85    ) -> Result<TraversalResult, String>;
86
87    /// Converts a `NodeScillaType` node.
88    fn emit_scilla_type(
89        &mut self,
90        mode: TreeTraversalMode,
91        node: &NodeScillaType,
92    ) -> Result<TraversalResult, String>;
93
94    /// Converts a `NodeTypeMapEntry` node.
95    fn emit_type_map_entry(
96        &mut self,
97        mode: TreeTraversalMode,
98        node: &NodeTypeMapEntry,
99    ) -> Result<TraversalResult, String>;
100
101    /// Converts a `NodeAddressTypeField` node.
102    fn emit_address_type_field(
103        &mut self,
104        mode: TreeTraversalMode,
105        node: &NodeAddressTypeField,
106    ) -> Result<TraversalResult, String>;
107
108    /// Converts a `NodeAddressType` node.
109    fn emit_address_type(
110        &mut self,
111        mode: TreeTraversalMode,
112        node: &NodeAddressType,
113    ) -> Result<TraversalResult, String>;
114
115    /// Converts a `NodeFullExpression` node.
116    fn emit_full_expression(
117        &mut self,
118        mode: TreeTraversalMode,
119        node: &NodeFullExpression,
120    ) -> Result<TraversalResult, String>;
121
122    /// Converts a `NodeMessageEntry` node.
123    fn emit_message_entry(
124        &mut self,
125        mode: TreeTraversalMode,
126        node: &NodeMessageEntry,
127    ) -> Result<TraversalResult, String>;
128
129    /// Converts a `NodePatternMatchExpressionClause` node.
130    fn emit_pattern_match_expression_clause(
131        &mut self,
132        mode: TreeTraversalMode,
133        node: &NodePatternMatchExpressionClause,
134    ) -> Result<TraversalResult, String>;
135
136    /// Converts a `NodeAtomicExpression` node.
137    fn emit_atomic_expression(
138        &mut self,
139        mode: TreeTraversalMode,
140        node: &NodeAtomicExpression,
141    ) -> Result<TraversalResult, String>;
142
143    /// Converts a `NodeContractTypeArguments` node.
144    fn emit_contract_type_arguments(
145        &mut self,
146        mode: TreeTraversalMode,
147        node: &NodeContractTypeArguments,
148    ) -> Result<TraversalResult, String>;
149
150    /// Converts a `NodeValueLiteral` node.
151    fn emit_value_literal(
152        &mut self,
153        mode: TreeTraversalMode,
154        node: &NodeValueLiteral,
155    ) -> Result<TraversalResult, String>;
156
157    /// Converts a `NodeMapAccess` node.
158    fn emit_map_access(
159        &mut self,
160        mode: TreeTraversalMode,
161        node: &NodeMapAccess,
162    ) -> Result<TraversalResult, String>;
163
164    /// Converts a `NodePattern` node.
165    fn emit_pattern(
166        &mut self,
167        mode: TreeTraversalMode,
168        node: &NodePattern,
169    ) -> Result<TraversalResult, String>;
170
171    /// Converts a `NodeArgumentPattern` node.
172    fn emit_argument_pattern(
173        &mut self,
174        mode: TreeTraversalMode,
175        node: &NodeArgumentPattern,
176    ) -> Result<TraversalResult, String>;
177
178    /// Converts a `NodePatternMatchClause` node.
179    fn emit_pattern_match_clause(
180        &mut self,
181        mode: TreeTraversalMode,
182        node: &NodePatternMatchClause,
183    ) -> Result<TraversalResult, String>;
184
185    /// Converts a `NodeBlockchainFetchArguments` node.
186    fn emit_blockchain_fetch_arguments(
187        &mut self,
188        mode: TreeTraversalMode,
189        node: &NodeBlockchainFetchArguments,
190    ) -> Result<TraversalResult, String>;
191
192    /// Converts a `NodeStatement` node.
193    fn emit_statement(
194        &mut self,
195        mode: TreeTraversalMode,
196        node: &NodeStatement,
197    ) -> Result<TraversalResult, String>;
198
199    /// Converts a `NodeRemoteFetchStatement` node.
200    fn emit_remote_fetch_statement(
201        &mut self,
202        mode: TreeTraversalMode,
203        node: &NodeRemoteFetchStatement,
204    ) -> Result<TraversalResult, String>;
205
206    /// Converts a `NodeComponentId` node.
207    fn emit_component_id(
208        &mut self,
209        mode: TreeTraversalMode,
210        node: &NodeComponentId,
211    ) -> Result<TraversalResult, String>;
212
213    /// Converts a `NodeComponentParameters` node.
214    fn emit_component_parameters(
215        &mut self,
216        mode: TreeTraversalMode,
217        node: &NodeComponentParameters,
218    ) -> Result<TraversalResult, String>;
219
220    /// Converts a `NodeParameterPair` node.
221    fn emit_parameter_pair(
222        &mut self,
223        mode: TreeTraversalMode,
224        node: &NodeParameterPair,
225    ) -> Result<TraversalResult, String>;
226
227    /// Converts a `NodeComponentBody` node.
228    fn emit_component_body(
229        &mut self,
230        mode: TreeTraversalMode,
231        node: &NodeComponentBody,
232    ) -> Result<TraversalResult, String>;
233
234    /// Converts a `NodeStatementBlock` node.
235    fn emit_statement_block(
236        &mut self,
237        mode: TreeTraversalMode,
238        node: &NodeStatementBlock,
239    ) -> Result<TraversalResult, String>;
240
241    /// Converts a `NodeTypedIdentifier` node.
242    fn emit_typed_identifier(
243        &mut self,
244        mode: TreeTraversalMode,
245        node: &NodeTypedIdentifier,
246    ) -> Result<TraversalResult, String>;
247
248    /// Converts a `NodeTypeAnnotation` node.
249    fn emit_type_annotation(
250        &mut self,
251        mode: TreeTraversalMode,
252        node: &NodeTypeAnnotation,
253    ) -> Result<TraversalResult, String>;
254
255    /// Converts a `NodeProgram` node.
256    fn emit_program(
257        &mut self,
258        mode: TreeTraversalMode,
259        node: &NodeProgram,
260    ) -> Result<TraversalResult, String>;
261
262    /// Converts a `NodeLibraryDefinition` node.
263    fn emit_library_definition(
264        &mut self,
265        mode: TreeTraversalMode,
266        node: &NodeLibraryDefinition,
267    ) -> Result<TraversalResult, String>;
268
269    /// Converts a `NodeLibrarySingleDefinition` node.
270    fn emit_library_single_definition(
271        &mut self,
272        mode: TreeTraversalMode,
273        node: &NodeLibrarySingleDefinition,
274    ) -> Result<TraversalResult, String>;
275
276    /// Converts a `NodeContractDefinition` node.
277    fn emit_contract_definition(
278        &mut self,
279        mode: TreeTraversalMode,
280        node: &NodeContractDefinition,
281    ) -> Result<TraversalResult, String>;
282
283    /// Converts a `NodeContractField` node.
284    fn emit_contract_field(
285        &mut self,
286        mode: TreeTraversalMode,
287        node: &NodeContractField,
288    ) -> Result<TraversalResult, String>;
289
290    /// Converts a `NodeWithConstraint` node.
291    fn emit_with_constraint(
292        &mut self,
293        mode: TreeTraversalMode,
294        node: &NodeWithConstraint,
295    ) -> Result<TraversalResult, String>;
296
297    /// Converts a `NodeComponentDefinition` node.
298    fn emit_component_definition(
299        &mut self,
300        mode: TreeTraversalMode,
301        node: &NodeComponentDefinition,
302    ) -> Result<TraversalResult, String>;
303
304    /// Converts a `NodeProcedureDefinition` node.
305    fn emit_procedure_definition(
306        &mut self,
307        mode: TreeTraversalMode,
308        node: &NodeProcedureDefinition,
309    ) -> Result<TraversalResult, String>;
310
311    /// Converts a `NodeTransitionDefinition` node.
312    fn emit_transition_definition(
313        &mut self,
314        mode: TreeTraversalMode,
315        node: &NodeTransitionDefinition,
316    ) -> Result<TraversalResult, String>;
317
318    /// Converts a `NodeTypeAlternativeClause` node.
319    fn emit_type_alternative_clause(
320        &mut self,
321        mode: TreeTraversalMode,
322        node: &NodeTypeAlternativeClause,
323    ) -> Result<TraversalResult, String>;
324
325    /// Converts a `NodeTypeMapValueArguments` node.
326    fn emit_type_map_value_arguments(
327        &mut self,
328        mode: TreeTraversalMode,
329        node: &NodeTypeMapValueArguments,
330    ) -> Result<TraversalResult, String>;
331
332    /// Converts a `NodeTypeMapValueAllowingTypeArguments` node.
333    fn emit_type_map_value_allowing_type_arguments(
334        &mut self,
335        mode: TreeTraversalMode,
336        node: &NodeTypeMapValueAllowingTypeArguments,
337    ) -> Result<TraversalResult, String>;
338}