Skip to main content

toasty_core/stmt/
visit_mut.rs

1#![allow(unused_variables)]
2
3use super::{
4    Assignment, Assignments, Association, Condition, Cte, Delete, Expr, ExprAnd, ExprAny, ExprArg,
5    ExprBinaryOp, ExprCast, ExprColumn, ExprError, ExprExists, ExprFunc, ExprInList,
6    ExprInSubquery, ExprIsNull, ExprIsVariant, ExprLet, ExprLike, ExprList, ExprMap, ExprMatch,
7    ExprNot, ExprOr, ExprProject, ExprRecord, ExprReference, ExprSet, ExprSetOp, ExprStartsWith,
8    ExprStmt, Filter, FuncCount, FuncLastInsertId, Insert, InsertTarget, Join, JoinOp, Limit,
9    LimitCursor, LimitOffset, Node, OrderBy, OrderByExpr, Path, Projection, Query, Returning,
10    Select, Source, SourceModel, SourceTable, SourceTableId, Statement, TableDerived, TableFactor,
11    TableRef, TableWithJoins, Type, Update, UpdateTarget, Value, ValueRecord, Values, With,
12};
13
14/// Mutable visitor trait for the statement AST.
15///
16/// Implement this trait to walk and modify the AST in place. Each
17/// `visit_*_mut` method has a default implementation that recurses into
18/// child nodes via the corresponding free function (e.g.,
19/// [`visit_expr_mut`]). Override specific methods to transform nodes of
20/// interest.
21///
22/// Companion helpers:
23/// - [`for_each_expr_mut`] -- visits every expression node in post-order.
24/// - [`walk_expr_scoped_mut`] -- walks expressions while tracking
25///   `Let`/`Map` scope depth.
26///
27/// # Examples
28///
29/// ```ignore
30/// use toasty_core::stmt::{visit_mut, Expr, Value, Node};
31///
32/// let mut expr = Expr::from(Value::from(42_i64));
33/// visit_mut::for_each_expr_mut(&mut expr, |e| {
34///     // transform expressions in place
35/// });
36/// ```
37pub trait VisitMut {
38    /// Dispatches to the appropriate `visit_*_mut` method via [`Node::visit_mut`].
39    fn visit_mut<N: Node>(&mut self, i: &mut N)
40    where
41        Self: Sized,
42    {
43        i.visit_mut(self);
44    }
45
46    /// Visits an [`Assignment`] node mutably.
47    ///
48    /// The default implementation delegates to [`visit_assignment_mut`].
49    fn visit_assignment_mut(&mut self, i: &mut Assignment) {
50        visit_assignment_mut(self, i);
51    }
52
53    /// Visits an [`Assignments`] node mutably.
54    ///
55    /// The default implementation delegates to [`visit_assignments_mut`].
56    fn visit_assignments_mut(&mut self, i: &mut Assignments) {
57        visit_assignments_mut(self, i);
58    }
59
60    /// Visits an [`Association`] node mutably.
61    ///
62    /// The default implementation delegates to [`visit_association_mut`].
63    fn visit_association_mut(&mut self, i: &mut Association) {
64        visit_association_mut(self, i);
65    }
66
67    /// Visits a [`Cte`] (common table expression) node mutably.
68    ///
69    /// The default implementation delegates to [`visit_cte_mut`].
70    fn visit_cte_mut(&mut self, i: &mut Cte) {
71        visit_cte_mut(self, i);
72    }
73
74    /// Visits an [`Expr`] node mutably.
75    ///
76    /// The default implementation delegates to [`visit_expr_mut`].
77    fn visit_expr_mut(&mut self, i: &mut Expr) {
78        visit_expr_mut(self, i);
79    }
80
81    /// Visits an [`ExprAnd`] node mutably.
82    ///
83    /// The default implementation delegates to [`visit_expr_and_mut`].
84    fn visit_expr_and_mut(&mut self, i: &mut ExprAnd) {
85        visit_expr_and_mut(self, i);
86    }
87
88    /// Visits an [`ExprAny`] node mutably.
89    ///
90    /// The default implementation delegates to [`visit_expr_any_mut`].
91    fn visit_expr_any_mut(&mut self, i: &mut ExprAny) {
92        visit_expr_any_mut(self, i);
93    }
94
95    /// Visits an [`ExprArg`] node mutably.
96    ///
97    /// The default implementation delegates to [`visit_expr_arg_mut`].
98    fn visit_expr_arg_mut(&mut self, i: &mut ExprArg) {
99        visit_expr_arg_mut(self, i);
100    }
101
102    /// Visits an [`ExprBinaryOp`] node mutably.
103    ///
104    /// The default implementation delegates to [`visit_expr_binary_op_mut`].
105    fn visit_expr_binary_op_mut(&mut self, i: &mut ExprBinaryOp) {
106        visit_expr_binary_op_mut(self, i);
107    }
108
109    /// Visits an [`ExprCast`] node mutably.
110    ///
111    /// The default implementation delegates to [`visit_expr_cast_mut`].
112    fn visit_expr_cast_mut(&mut self, i: &mut ExprCast) {
113        visit_expr_cast_mut(self, i);
114    }
115
116    /// Visits an [`ExprColumn`] node mutably.
117    ///
118    /// The default implementation delegates to [`visit_expr_column_mut`].
119    fn visit_expr_column_mut(&mut self, i: &mut ExprColumn) {
120        visit_expr_column_mut(self, i);
121    }
122
123    /// Visits a default expression node mutably.
124    ///
125    /// The default implementation delegates to [`visit_expr_default_mut`].
126    fn visit_expr_default_mut(&mut self) {
127        visit_expr_default_mut(self);
128    }
129
130    /// Visits an [`ExprError`] node mutably.
131    ///
132    /// The default implementation delegates to [`visit_expr_error_mut`].
133    fn visit_expr_error_mut(&mut self, i: &mut ExprError) {
134        visit_expr_error_mut(self, i);
135    }
136
137    /// Visits an [`ExprExists`] node mutably.
138    ///
139    /// The default implementation delegates to [`visit_expr_exists_mut`].
140    fn visit_expr_exists_mut(&mut self, i: &mut ExprExists) {
141        visit_expr_exists_mut(self, i);
142    }
143
144    /// Visits an [`ExprFunc`] node mutably.
145    ///
146    /// The default implementation delegates to [`visit_expr_func_mut`].
147    fn visit_expr_func_mut(&mut self, i: &mut ExprFunc) {
148        visit_expr_func_mut(self, i);
149    }
150
151    /// Visits a [`FuncCount`] node mutably.
152    ///
153    /// The default implementation delegates to [`visit_expr_func_count_mut`].
154    fn visit_expr_func_count_mut(&mut self, i: &mut FuncCount) {
155        visit_expr_func_count_mut(self, i);
156    }
157
158    /// Visits a [`FuncLastInsertId`] node mutably.
159    ///
160    /// The default implementation delegates to [`visit_expr_func_last_insert_id_mut`].
161    fn visit_expr_func_last_insert_id_mut(&mut self, i: &mut FuncLastInsertId) {
162        visit_expr_func_last_insert_id_mut(self, i);
163    }
164
165    /// Visits an [`ExprInList`] node mutably.
166    ///
167    /// The default implementation delegates to [`visit_expr_in_list_mut`].
168    fn visit_expr_in_list_mut(&mut self, i: &mut ExprInList) {
169        visit_expr_in_list_mut(self, i);
170    }
171
172    /// Visits an [`ExprInSubquery`] node mutably.
173    ///
174    /// The default implementation delegates to [`visit_expr_in_subquery_mut`].
175    fn visit_expr_in_subquery_mut(&mut self, i: &mut ExprInSubquery) {
176        visit_expr_in_subquery_mut(self, i);
177    }
178
179    /// Visits an [`ExprIsNull`] node mutably.
180    ///
181    /// The default implementation delegates to [`visit_expr_is_null_mut`].
182    fn visit_expr_is_null_mut(&mut self, i: &mut ExprIsNull) {
183        visit_expr_is_null_mut(self, i);
184    }
185
186    /// Visits an [`ExprIsVariant`] node mutably.
187    ///
188    /// The default implementation delegates to [`visit_expr_is_variant_mut`].
189    fn visit_expr_is_variant_mut(&mut self, i: &mut ExprIsVariant) {
190        visit_expr_is_variant_mut(self, i);
191    }
192
193    /// Visits an [`ExprLet`] node mutably.
194    ///
195    /// The default implementation delegates to [`visit_expr_let_mut`].
196    fn visit_expr_let_mut(&mut self, i: &mut ExprLet) {
197        visit_expr_let_mut(self, i);
198    }
199
200    /// Visits an [`ExprLike`] node mutably.
201    ///
202    /// The default implementation delegates to [`visit_expr_like_mut`].
203    fn visit_expr_like_mut(&mut self, i: &mut ExprLike) {
204        visit_expr_like_mut(self, i);
205    }
206
207    /// Visits an [`ExprMap`] node mutably.
208    ///
209    /// The default implementation delegates to [`visit_expr_map_mut`].
210    fn visit_expr_map_mut(&mut self, i: &mut ExprMap) {
211        visit_expr_map_mut(self, i);
212    }
213
214    /// Visits an [`ExprMatch`] node mutably.
215    ///
216    /// The default implementation delegates to [`visit_expr_match_mut`].
217    fn visit_expr_match_mut(&mut self, i: &mut ExprMatch) {
218        visit_expr_match_mut(self, i);
219    }
220
221    /// Visits an [`ExprNot`] node mutably.
222    ///
223    /// The default implementation delegates to [`visit_expr_not_mut`].
224    fn visit_expr_not_mut(&mut self, i: &mut ExprNot) {
225        visit_expr_not_mut(self, i);
226    }
227
228    /// Visits an [`ExprOr`] node mutably.
229    ///
230    /// The default implementation delegates to [`visit_expr_or_mut`].
231    fn visit_expr_or_mut(&mut self, i: &mut ExprOr) {
232        visit_expr_or_mut(self, i);
233    }
234
235    /// Visits an [`ExprList`] node mutably.
236    ///
237    /// The default implementation delegates to [`visit_expr_list_mut`].
238    fn visit_expr_list_mut(&mut self, i: &mut ExprList) {
239        visit_expr_list_mut(self, i);
240    }
241
242    /// Visits an [`ExprRecord`] node mutably.
243    ///
244    /// The default implementation delegates to [`visit_expr_record_mut`].
245    fn visit_expr_record_mut(&mut self, i: &mut ExprRecord) {
246        visit_expr_record_mut(self, i);
247    }
248
249    /// Visits an [`ExprReference`] node mutably.
250    ///
251    /// The default implementation delegates to [`visit_expr_reference_mut`].
252    fn visit_expr_reference_mut(&mut self, i: &mut ExprReference) {
253        visit_expr_reference_mut(self, i);
254    }
255
256    /// Visits an [`ExprSet`] node mutably.
257    ///
258    /// The default implementation delegates to [`visit_expr_set_mut`].
259    fn visit_expr_set_mut(&mut self, i: &mut ExprSet) {
260        visit_expr_set_mut(self, i);
261    }
262
263    /// Visits an [`ExprSetOp`] node mutably.
264    ///
265    /// The default implementation delegates to [`visit_expr_set_op_mut`].
266    fn visit_expr_set_op_mut(&mut self, i: &mut ExprSetOp) {
267        visit_expr_set_op_mut(self, i);
268    }
269
270    /// Visits an [`ExprStartsWith`] node mutably.
271    ///
272    /// The default implementation delegates to [`visit_expr_starts_with_mut`].
273    fn visit_expr_starts_with_mut(&mut self, i: &mut ExprStartsWith) {
274        visit_expr_starts_with_mut(self, i);
275    }
276
277    /// Visits an [`ExprStmt`] node mutably.
278    ///
279    /// The default implementation delegates to [`visit_expr_stmt_mut`].
280    fn visit_expr_stmt_mut(&mut self, i: &mut ExprStmt) {
281        visit_expr_stmt_mut(self, i);
282    }
283
284    /// Visits a [`Filter`] node mutably.
285    ///
286    /// The default implementation delegates to [`visit_filter_mut`].
287    fn visit_filter_mut(&mut self, i: &mut Filter) {
288        visit_filter_mut(self, i);
289    }
290
291    /// Visits a [`Condition`] node mutably.
292    ///
293    /// The default implementation delegates to [`visit_condition_mut`].
294    fn visit_condition_mut(&mut self, i: &mut Condition) {
295        visit_condition_mut(self, i);
296    }
297
298    /// Visits an [`ExprProject`] node mutably.
299    ///
300    /// The default implementation delegates to [`visit_expr_project_mut`].
301    fn visit_expr_project_mut(&mut self, i: &mut ExprProject) {
302        visit_expr_project_mut(self, i);
303    }
304
305    /// Visits an [`InsertTarget`] node mutably.
306    ///
307    /// The default implementation delegates to [`visit_insert_target_mut`].
308    fn visit_insert_target_mut(&mut self, i: &mut InsertTarget) {
309        visit_insert_target_mut(self, i);
310    }
311
312    /// Visits a [`Join`] node mutably.
313    ///
314    /// The default implementation delegates to [`visit_join_mut`].
315    fn visit_join_mut(&mut self, i: &mut Join) {
316        visit_join_mut(self, i);
317    }
318
319    /// Visits a [`Limit`] node mutably.
320    ///
321    /// The default implementation delegates to [`visit_limit_mut`].
322    fn visit_limit_mut(&mut self, i: &mut Limit) {
323        visit_limit_mut(self, i);
324    }
325
326    /// Visits a [`LimitCursor`] node mutably.
327    ///
328    /// The default implementation delegates to [`visit_limit_cursor_mut`].
329    fn visit_limit_cursor_mut(&mut self, i: &mut LimitCursor) {
330        visit_limit_cursor_mut(self, i);
331    }
332
333    /// Visits a [`LimitOffset`] node mutably.
334    ///
335    /// The default implementation delegates to [`visit_limit_offset_mut`].
336    fn visit_limit_offset_mut(&mut self, i: &mut LimitOffset) {
337        visit_limit_offset_mut(self, i);
338    }
339
340    /// Visits an [`OrderBy`] node mutably.
341    ///
342    /// The default implementation delegates to [`visit_order_by_mut`].
343    fn visit_order_by_mut(&mut self, i: &mut OrderBy) {
344        visit_order_by_mut(self, i);
345    }
346
347    /// Visits an [`OrderByExpr`] node mutably.
348    ///
349    /// The default implementation delegates to [`visit_order_by_expr_mut`].
350    fn visit_order_by_expr_mut(&mut self, i: &mut OrderByExpr) {
351        visit_order_by_expr_mut(self, i);
352    }
353
354    /// Visits a [`Path`] node mutably.
355    ///
356    /// The default implementation delegates to [`visit_path_mut`].
357    fn visit_path_mut(&mut self, i: &mut Path) {
358        visit_path_mut(self, i);
359    }
360
361    /// Visits a [`Projection`] node mutably.
362    ///
363    /// The default implementation delegates to [`visit_projection_mut`].
364    fn visit_projection_mut(&mut self, i: &mut Projection) {
365        visit_projection_mut(self, i);
366    }
367
368    /// Visits a [`Returning`] node mutably.
369    ///
370    /// The default implementation delegates to [`visit_returning_mut`].
371    fn visit_returning_mut(&mut self, i: &mut Returning) {
372        visit_returning_mut(self, i);
373    }
374
375    /// Visits a [`Source`] node mutably.
376    ///
377    /// The default implementation delegates to [`visit_source_mut`].
378    fn visit_source_mut(&mut self, i: &mut Source) {
379        visit_source_mut(self, i);
380    }
381
382    /// Visits a [`SourceModel`] node mutably.
383    ///
384    /// The default implementation delegates to [`visit_source_model_mut`].
385    fn visit_source_model_mut(&mut self, i: &mut SourceModel) {
386        visit_source_model_mut(self, i);
387    }
388
389    /// Visits a [`SourceTable`] node mutably.
390    ///
391    /// The default implementation delegates to [`visit_source_table_mut`].
392    fn visit_source_table_mut(&mut self, i: &mut SourceTable) {
393        visit_source_table_mut(self, i);
394    }
395
396    /// Visits a [`SourceTableId`] node mutably.
397    ///
398    /// The default implementation delegates to [`visit_source_table_id_mut`].
399    fn visit_source_table_id_mut(&mut self, i: &mut SourceTableId) {
400        visit_source_table_id_mut(self, i);
401    }
402
403    /// Visits a [`Statement`] node mutably.
404    ///
405    /// The default implementation delegates to [`visit_stmt_mut`].
406    fn visit_stmt_mut(&mut self, i: &mut Statement) {
407        visit_stmt_mut(self, i);
408    }
409
410    /// Visits a [`Delete`] statement node mutably.
411    ///
412    /// The default implementation delegates to [`visit_stmt_delete_mut`].
413    fn visit_stmt_delete_mut(&mut self, i: &mut Delete) {
414        visit_stmt_delete_mut(self, i);
415    }
416
417    /// Visits an [`Insert`] statement node mutably.
418    ///
419    /// The default implementation delegates to [`visit_stmt_insert_mut`].
420    fn visit_stmt_insert_mut(&mut self, i: &mut Insert) {
421        visit_stmt_insert_mut(self, i);
422    }
423
424    /// Visits a [`Query`] statement node mutably.
425    ///
426    /// The default implementation delegates to [`visit_stmt_query_mut`].
427    fn visit_stmt_query_mut(&mut self, i: &mut Query) {
428        visit_stmt_query_mut(self, i);
429    }
430
431    /// Visits a [`Select`] statement node mutably.
432    ///
433    /// The default implementation delegates to [`visit_stmt_select_mut`].
434    fn visit_stmt_select_mut(&mut self, i: &mut Select) {
435        visit_stmt_select_mut(self, i);
436    }
437
438    /// Visits an [`Update`] statement node mutably.
439    ///
440    /// The default implementation delegates to [`visit_stmt_update_mut`].
441    fn visit_stmt_update_mut(&mut self, i: &mut Update) {
442        visit_stmt_update_mut(self, i);
443    }
444
445    /// Visits a [`TableDerived`] node mutably.
446    ///
447    /// The default implementation delegates to [`visit_table_derived_mut`].
448    fn visit_table_derived_mut(&mut self, i: &mut TableDerived) {
449        visit_table_derived_mut(self, i);
450    }
451
452    /// Visits a [`TableRef`] node mutably.
453    ///
454    /// The default implementation delegates to [`visit_table_ref_mut`].
455    fn visit_table_ref_mut(&mut self, i: &mut TableRef) {
456        visit_table_ref_mut(self, i);
457    }
458
459    /// Visits a [`TableFactor`] node mutably.
460    ///
461    /// The default implementation delegates to [`visit_table_factor_mut`].
462    fn visit_table_factor_mut(&mut self, i: &mut TableFactor) {
463        visit_table_factor_mut(self, i);
464    }
465
466    /// Visits a [`TableWithJoins`] node mutably.
467    ///
468    /// The default implementation delegates to [`visit_table_with_joins_mut`].
469    fn visit_table_with_joins_mut(&mut self, i: &mut TableWithJoins) {
470        visit_table_with_joins_mut(self, i);
471    }
472
473    /// Visits a [`Type`] node mutably.
474    ///
475    /// The default implementation delegates to [`visit_type_mut`].
476    fn visit_type_mut(&mut self, i: &mut Type) {
477        visit_type_mut(self, i);
478    }
479
480    /// Visits an [`UpdateTarget`] node mutably.
481    ///
482    /// The default implementation delegates to [`visit_update_target_mut`].
483    fn visit_update_target_mut(&mut self, i: &mut UpdateTarget) {
484        visit_update_target_mut(self, i);
485    }
486
487    /// Visits a [`Value`] node mutably.
488    ///
489    /// The default implementation delegates to [`visit_value_mut`].
490    fn visit_value_mut(&mut self, i: &mut Value) {
491        visit_value_mut(self, i);
492    }
493
494    /// Visits a [`ValueRecord`] node mutably.
495    ///
496    /// The default implementation delegates to [`visit_value_record`].
497    fn visit_value_record(&mut self, i: &mut ValueRecord) {
498        visit_value_record(self, i);
499    }
500
501    /// Visits a [`Values`] node mutably.
502    ///
503    /// The default implementation delegates to [`visit_values_mut`].
504    fn visit_values_mut(&mut self, i: &mut Values) {
505        visit_values_mut(self, i);
506    }
507
508    /// Visits a [`With`] node mutably.
509    ///
510    /// The default implementation delegates to [`visit_with_mut`].
511    fn visit_with_mut(&mut self, i: &mut With) {
512        visit_with_mut(self, i);
513    }
514}
515
516impl<V: VisitMut> VisitMut for &mut V {
517    fn visit_assignment_mut(&mut self, i: &mut Assignment) {
518        VisitMut::visit_assignment_mut(&mut **self, i);
519    }
520
521    fn visit_assignments_mut(&mut self, i: &mut Assignments) {
522        VisitMut::visit_assignments_mut(&mut **self, i);
523    }
524
525    fn visit_association_mut(&mut self, i: &mut Association) {
526        VisitMut::visit_association_mut(&mut **self, i);
527    }
528
529    fn visit_cte_mut(&mut self, i: &mut Cte) {
530        VisitMut::visit_cte_mut(&mut **self, i);
531    }
532
533    fn visit_expr_mut(&mut self, i: &mut Expr) {
534        VisitMut::visit_expr_mut(&mut **self, i);
535    }
536
537    fn visit_expr_and_mut(&mut self, i: &mut ExprAnd) {
538        VisitMut::visit_expr_and_mut(&mut **self, i);
539    }
540
541    fn visit_expr_arg_mut(&mut self, i: &mut ExprArg) {
542        VisitMut::visit_expr_arg_mut(&mut **self, i);
543    }
544
545    fn visit_expr_binary_op_mut(&mut self, i: &mut ExprBinaryOp) {
546        VisitMut::visit_expr_binary_op_mut(&mut **self, i);
547    }
548
549    fn visit_expr_cast_mut(&mut self, i: &mut ExprCast) {
550        VisitMut::visit_expr_cast_mut(&mut **self, i);
551    }
552
553    fn visit_expr_column_mut(&mut self, i: &mut ExprColumn) {
554        VisitMut::visit_expr_column_mut(&mut **self, i);
555    }
556
557    fn visit_expr_default_mut(&mut self) {
558        VisitMut::visit_expr_default_mut(&mut **self);
559    }
560
561    fn visit_expr_error_mut(&mut self, i: &mut ExprError) {
562        VisitMut::visit_expr_error_mut(&mut **self, i);
563    }
564
565    fn visit_expr_exists_mut(&mut self, i: &mut ExprExists) {
566        VisitMut::visit_expr_exists_mut(&mut **self, i);
567    }
568
569    fn visit_expr_func_mut(&mut self, i: &mut ExprFunc) {
570        VisitMut::visit_expr_func_mut(&mut **self, i);
571    }
572
573    fn visit_expr_func_count_mut(&mut self, i: &mut FuncCount) {
574        VisitMut::visit_expr_func_count_mut(&mut **self, i);
575    }
576
577    fn visit_expr_in_list_mut(&mut self, i: &mut ExprInList) {
578        VisitMut::visit_expr_in_list_mut(&mut **self, i);
579    }
580
581    fn visit_expr_in_subquery_mut(&mut self, i: &mut ExprInSubquery) {
582        VisitMut::visit_expr_in_subquery_mut(&mut **self, i);
583    }
584
585    fn visit_expr_is_null_mut(&mut self, i: &mut ExprIsNull) {
586        VisitMut::visit_expr_is_null_mut(&mut **self, i);
587    }
588
589    fn visit_expr_is_variant_mut(&mut self, i: &mut ExprIsVariant) {
590        VisitMut::visit_expr_is_variant_mut(&mut **self, i);
591    }
592
593    fn visit_expr_let_mut(&mut self, i: &mut ExprLet) {
594        VisitMut::visit_expr_let_mut(&mut **self, i);
595    }
596
597    fn visit_expr_like_mut(&mut self, i: &mut ExprLike) {
598        VisitMut::visit_expr_like_mut(&mut **self, i);
599    }
600
601    fn visit_expr_map_mut(&mut self, i: &mut ExprMap) {
602        VisitMut::visit_expr_map_mut(&mut **self, i);
603    }
604
605    fn visit_expr_match_mut(&mut self, i: &mut ExprMatch) {
606        VisitMut::visit_expr_match_mut(&mut **self, i);
607    }
608
609    fn visit_expr_not_mut(&mut self, i: &mut ExprNot) {
610        VisitMut::visit_expr_not_mut(&mut **self, i);
611    }
612
613    fn visit_expr_or_mut(&mut self, i: &mut ExprOr) {
614        VisitMut::visit_expr_or_mut(&mut **self, i);
615    }
616
617    fn visit_expr_list_mut(&mut self, i: &mut ExprList) {
618        VisitMut::visit_expr_list_mut(&mut **self, i);
619    }
620
621    fn visit_expr_record_mut(&mut self, i: &mut ExprRecord) {
622        VisitMut::visit_expr_record_mut(&mut **self, i);
623    }
624
625    fn visit_expr_reference_mut(&mut self, i: &mut ExprReference) {
626        VisitMut::visit_expr_reference_mut(&mut **self, i);
627    }
628
629    fn visit_expr_set_mut(&mut self, i: &mut ExprSet) {
630        VisitMut::visit_expr_set_mut(&mut **self, i);
631    }
632
633    fn visit_expr_set_op_mut(&mut self, i: &mut ExprSetOp) {
634        VisitMut::visit_expr_set_op_mut(&mut **self, i);
635    }
636
637    fn visit_expr_starts_with_mut(&mut self, i: &mut ExprStartsWith) {
638        VisitMut::visit_expr_starts_with_mut(&mut **self, i);
639    }
640
641    fn visit_expr_stmt_mut(&mut self, i: &mut ExprStmt) {
642        VisitMut::visit_expr_stmt_mut(&mut **self, i);
643    }
644
645    fn visit_filter_mut(&mut self, i: &mut Filter) {
646        VisitMut::visit_filter_mut(&mut **self, i);
647    }
648
649    fn visit_condition_mut(&mut self, i: &mut Condition) {
650        VisitMut::visit_condition_mut(&mut **self, i);
651    }
652
653    fn visit_expr_project_mut(&mut self, i: &mut ExprProject) {
654        VisitMut::visit_expr_project_mut(&mut **self, i);
655    }
656
657    fn visit_insert_target_mut(&mut self, i: &mut InsertTarget) {
658        VisitMut::visit_insert_target_mut(&mut **self, i);
659    }
660
661    fn visit_join_mut(&mut self, i: &mut Join) {
662        VisitMut::visit_join_mut(&mut **self, i);
663    }
664
665    fn visit_limit_mut(&mut self, i: &mut Limit) {
666        VisitMut::visit_limit_mut(&mut **self, i);
667    }
668
669    fn visit_limit_cursor_mut(&mut self, i: &mut LimitCursor) {
670        VisitMut::visit_limit_cursor_mut(&mut **self, i);
671    }
672
673    fn visit_limit_offset_mut(&mut self, i: &mut LimitOffset) {
674        VisitMut::visit_limit_offset_mut(&mut **self, i);
675    }
676
677    fn visit_order_by_mut(&mut self, i: &mut OrderBy) {
678        VisitMut::visit_order_by_mut(&mut **self, i);
679    }
680
681    fn visit_order_by_expr_mut(&mut self, i: &mut OrderByExpr) {
682        VisitMut::visit_order_by_expr_mut(&mut **self, i);
683    }
684
685    fn visit_path_mut(&mut self, i: &mut Path) {
686        VisitMut::visit_path_mut(&mut **self, i);
687    }
688
689    fn visit_projection_mut(&mut self, i: &mut Projection) {
690        VisitMut::visit_projection_mut(&mut **self, i);
691    }
692
693    fn visit_returning_mut(&mut self, i: &mut Returning) {
694        VisitMut::visit_returning_mut(&mut **self, i);
695    }
696
697    fn visit_source_mut(&mut self, i: &mut Source) {
698        VisitMut::visit_source_mut(&mut **self, i);
699    }
700
701    fn visit_source_model_mut(&mut self, i: &mut SourceModel) {
702        VisitMut::visit_source_model_mut(&mut **self, i);
703    }
704
705    fn visit_source_table_mut(&mut self, i: &mut SourceTable) {
706        VisitMut::visit_source_table_mut(&mut **self, i);
707    }
708
709    fn visit_source_table_id_mut(&mut self, i: &mut SourceTableId) {
710        VisitMut::visit_source_table_id_mut(&mut **self, i);
711    }
712
713    fn visit_stmt_mut(&mut self, i: &mut Statement) {
714        VisitMut::visit_stmt_mut(&mut **self, i);
715    }
716
717    fn visit_stmt_delete_mut(&mut self, i: &mut Delete) {
718        VisitMut::visit_stmt_delete_mut(&mut **self, i);
719    }
720
721    fn visit_stmt_insert_mut(&mut self, i: &mut Insert) {
722        VisitMut::visit_stmt_insert_mut(&mut **self, i);
723    }
724
725    fn visit_stmt_query_mut(&mut self, i: &mut Query) {
726        VisitMut::visit_stmt_query_mut(&mut **self, i);
727    }
728
729    fn visit_stmt_select_mut(&mut self, i: &mut Select) {
730        VisitMut::visit_stmt_select_mut(&mut **self, i);
731    }
732
733    fn visit_stmt_update_mut(&mut self, i: &mut Update) {
734        VisitMut::visit_stmt_update_mut(&mut **self, i);
735    }
736
737    fn visit_table_derived_mut(&mut self, i: &mut TableDerived) {
738        VisitMut::visit_table_derived_mut(&mut **self, i);
739    }
740
741    fn visit_table_ref_mut(&mut self, i: &mut TableRef) {
742        VisitMut::visit_table_ref_mut(&mut **self, i);
743    }
744
745    fn visit_table_factor_mut(&mut self, i: &mut TableFactor) {
746        VisitMut::visit_table_factor_mut(&mut **self, i);
747    }
748
749    fn visit_table_with_joins_mut(&mut self, i: &mut TableWithJoins) {
750        VisitMut::visit_table_with_joins_mut(&mut **self, i);
751    }
752
753    fn visit_type_mut(&mut self, i: &mut Type) {
754        VisitMut::visit_type_mut(&mut **self, i);
755    }
756
757    fn visit_update_target_mut(&mut self, i: &mut UpdateTarget) {
758        VisitMut::visit_update_target_mut(&mut **self, i);
759    }
760
761    fn visit_value_mut(&mut self, i: &mut Value) {
762        VisitMut::visit_value_mut(&mut **self, i);
763    }
764
765    fn visit_value_record(&mut self, i: &mut ValueRecord) {
766        VisitMut::visit_value_record(&mut **self, i);
767    }
768
769    fn visit_values_mut(&mut self, i: &mut Values) {
770        VisitMut::visit_values_mut(&mut **self, i);
771    }
772
773    fn visit_with_mut(&mut self, i: &mut With) {
774        VisitMut::visit_with_mut(&mut **self, i);
775    }
776}
777
778/// Default mutable traversal for [`Assignment`] nodes. Visits the assignment's expression(s).
779pub fn visit_assignment_mut<V>(v: &mut V, node: &mut Assignment)
780where
781    V: VisitMut + ?Sized,
782{
783    match node {
784        Assignment::Set(expr) | Assignment::Insert(expr) | Assignment::Remove(expr) => {
785            v.visit_expr_mut(expr);
786        }
787        Assignment::Batch(entries) => {
788            for entry in entries {
789                visit_assignment_mut(v, entry);
790            }
791        }
792    }
793}
794
795/// Default mutable traversal for [`Assignments`] nodes. Visits each assignment.
796pub fn visit_assignments_mut<V>(v: &mut V, node: &mut Assignments)
797where
798    V: VisitMut + ?Sized,
799{
800    for (_, assignment) in node.iter_mut() {
801        v.visit_assignment_mut(assignment);
802    }
803}
804
805/// Default mutable traversal for [`Association`] nodes. Visits the source query.
806pub fn visit_association_mut<V>(v: &mut V, node: &mut Association)
807where
808    V: VisitMut + ?Sized,
809{
810    v.visit_stmt_query_mut(&mut node.source);
811}
812
813/// Default mutable traversal for [`Cte`] nodes. Visits the CTE's query.
814pub fn visit_cte_mut<V>(v: &mut V, node: &mut Cte)
815where
816    V: VisitMut + ?Sized,
817{
818    v.visit_stmt_query_mut(&mut node.query);
819}
820
821/// Default mutable traversal for [`Expr`] nodes. Dispatches to variant-specific visitor.
822pub fn visit_expr_mut<V>(v: &mut V, node: &mut Expr)
823where
824    V: VisitMut + ?Sized,
825{
826    match node {
827        Expr::And(expr) => v.visit_expr_and_mut(expr),
828        Expr::Any(expr) => v.visit_expr_any_mut(expr),
829        Expr::Arg(expr) => v.visit_expr_arg_mut(expr),
830        Expr::BinaryOp(expr) => v.visit_expr_binary_op_mut(expr),
831        Expr::Cast(expr) => v.visit_expr_cast_mut(expr),
832        Expr::Default => v.visit_expr_default_mut(),
833        Expr::Error(expr) => v.visit_expr_error_mut(expr),
834        Expr::Exists(expr) => v.visit_expr_exists_mut(expr),
835        Expr::Func(expr) => v.visit_expr_func_mut(expr),
836        Expr::Ident(_) => {}
837        Expr::InList(expr) => v.visit_expr_in_list_mut(expr),
838        Expr::InSubquery(expr) => v.visit_expr_in_subquery_mut(expr),
839        Expr::IsNull(expr) => v.visit_expr_is_null_mut(expr),
840        Expr::IsVariant(expr) => v.visit_expr_is_variant_mut(expr),
841        Expr::Let(expr) => v.visit_expr_let_mut(expr),
842        Expr::Like(expr) => v.visit_expr_like_mut(expr),
843        Expr::Map(expr) => v.visit_expr_map_mut(expr),
844        Expr::Match(expr) => v.visit_expr_match_mut(expr),
845        Expr::Not(expr) => v.visit_expr_not_mut(expr),
846        Expr::Or(expr) => v.visit_expr_or_mut(expr),
847        Expr::Project(expr) => v.visit_expr_project_mut(expr),
848        Expr::Record(expr) => v.visit_expr_record_mut(expr),
849        Expr::Reference(expr) => v.visit_expr_reference_mut(expr),
850        Expr::List(expr) => v.visit_expr_list_mut(expr),
851        Expr::StartsWith(expr) => v.visit_expr_starts_with_mut(expr),
852        Expr::Stmt(expr) => v.visit_expr_stmt_mut(expr),
853        Expr::Value(expr) => v.visit_value_mut(expr),
854    }
855}
856
857/// Default mutable traversal for [`ExprAnd`] nodes. Visits each operand.
858pub fn visit_expr_and_mut<V>(v: &mut V, node: &mut ExprAnd)
859where
860    V: VisitMut + ?Sized,
861{
862    for expr in node {
863        v.visit_expr_mut(expr);
864    }
865}
866
867/// Default mutable traversal for [`ExprAny`] nodes. Visits the inner expression.
868pub fn visit_expr_any_mut<V>(v: &mut V, node: &mut ExprAny)
869where
870    V: VisitMut + ?Sized,
871{
872    v.visit_expr_mut(&mut node.expr);
873}
874
875/// Default mutable traversal for [`ExprArg`] nodes. This is a leaf node with no children to visit.
876pub fn visit_expr_arg_mut<V>(v: &mut V, node: &mut ExprArg)
877where
878    V: VisitMut + ?Sized,
879{
880}
881
882/// Default mutable traversal for [`ExprBinaryOp`] nodes. Visits the lhs and rhs expressions.
883pub fn visit_expr_binary_op_mut<V>(v: &mut V, node: &mut ExprBinaryOp)
884where
885    V: VisitMut + ?Sized,
886{
887    v.visit_expr_mut(&mut node.lhs);
888    v.visit_expr_mut(&mut node.rhs);
889}
890
891/// Default mutable traversal for [`ExprCast`] nodes. Visits the expression and its target type.
892pub fn visit_expr_cast_mut<V>(v: &mut V, node: &mut ExprCast)
893where
894    V: VisitMut + ?Sized,
895{
896    v.visit_expr_mut(&mut node.expr);
897    v.visit_type_mut(&mut node.ty);
898}
899
900/// Default mutable traversal for [`ExprColumn`] nodes. This is a leaf node with no children to visit.
901pub fn visit_expr_column_mut<V>(v: &mut V, node: &mut ExprColumn)
902where
903    V: VisitMut + ?Sized,
904{
905}
906
907/// Default mutable traversal for [`Expr::Default`] nodes. This is a leaf node with no children to visit.
908pub fn visit_expr_default_mut<V>(v: &mut V)
909where
910    V: VisitMut + ?Sized,
911{
912}
913
914/// Default mutable traversal for [`ExprError`] nodes. This is a leaf node with no children to visit.
915pub fn visit_expr_error_mut<V>(v: &mut V, node: &mut ExprError)
916where
917    V: VisitMut + ?Sized,
918{
919    // ExprError has no child expressions to visit
920}
921
922/// Default mutable traversal for [`ExprExists`] nodes. Visits the subquery.
923pub fn visit_expr_exists_mut<V>(v: &mut V, node: &mut ExprExists)
924where
925    V: VisitMut + ?Sized,
926{
927    v.visit_stmt_query_mut(&mut node.subquery);
928}
929
930/// Default mutable traversal for [`ExprFunc`] nodes. Dispatches to the function-specific visitor.
931pub fn visit_expr_func_mut<V>(v: &mut V, node: &mut ExprFunc)
932where
933    V: VisitMut + ?Sized,
934{
935    match node {
936        ExprFunc::Count(func) => v.visit_expr_func_count_mut(func),
937        ExprFunc::LastInsertId(func) => v.visit_expr_func_last_insert_id_mut(func),
938    }
939}
940
941/// Default mutable traversal for [`FuncCount`] nodes. Visits the optional argument and optional filter expressions.
942pub fn visit_expr_func_count_mut<V>(v: &mut V, node: &mut FuncCount)
943where
944    V: VisitMut + ?Sized,
945{
946    if let Some(expr) = &mut node.arg {
947        v.visit_expr_mut(expr);
948    }
949
950    if let Some(expr) = &mut node.filter {
951        v.visit_expr_mut(expr);
952    }
953}
954
955/// Default mutable traversal for [`FuncLastInsertId`] nodes. This is a leaf node with no children to visit.
956pub fn visit_expr_func_last_insert_id_mut<V>(_v: &mut V, _node: &mut FuncLastInsertId)
957where
958    V: VisitMut + ?Sized,
959{
960    // FuncLastInsertId has no fields to visit
961}
962
963/// Default mutable traversal for [`ExprInList`] nodes. Visits the expression and the list expression.
964pub fn visit_expr_in_list_mut<V>(v: &mut V, node: &mut ExprInList)
965where
966    V: VisitMut + ?Sized,
967{
968    v.visit_expr_mut(&mut node.expr);
969    v.visit_expr_mut(&mut node.list);
970}
971
972/// Default mutable traversal for [`ExprInSubquery`] nodes. Visits the expression and the subquery.
973pub fn visit_expr_in_subquery_mut<V>(v: &mut V, node: &mut ExprInSubquery)
974where
975    V: VisitMut + ?Sized,
976{
977    v.visit_expr_mut(&mut node.expr);
978    v.visit_stmt_query_mut(&mut node.query);
979}
980
981/// Default mutable traversal for [`ExprIsNull`] nodes. Visits the inner expression.
982pub fn visit_expr_is_null_mut<V>(v: &mut V, node: &mut ExprIsNull)
983where
984    V: VisitMut + ?Sized,
985{
986    v.visit_expr_mut(&mut node.expr);
987}
988
989/// Default mutable traversal for [`ExprIsVariant`] nodes. Visits the inner expression.
990pub fn visit_expr_is_variant_mut<V>(v: &mut V, node: &mut ExprIsVariant)
991where
992    V: VisitMut + ?Sized,
993{
994    v.visit_expr_mut(&mut node.expr);
995}
996
997/// Default mutable traversal for [`ExprLet`] nodes. Visits each binding expression and the body.
998pub fn visit_expr_let_mut<V>(v: &mut V, node: &mut ExprLet)
999where
1000    V: VisitMut + ?Sized,
1001{
1002    for binding in &mut node.bindings {
1003        v.visit_expr_mut(binding);
1004    }
1005    v.visit_expr_mut(&mut node.body);
1006}
1007
1008/// Default mutable traversal for [`ExprLike`] nodes. Visits the attribute expression and pattern.
1009pub fn visit_expr_like_mut<V>(v: &mut V, node: &mut ExprLike)
1010where
1011    V: VisitMut + ?Sized,
1012{
1013    v.visit_expr_mut(&mut node.expr);
1014    v.visit_expr_mut(&mut node.pattern);
1015}
1016
1017/// Default mutable traversal for [`ExprMap`] nodes. Visits the base expression and the map expression.
1018pub fn visit_expr_map_mut<V>(v: &mut V, node: &mut ExprMap)
1019where
1020    V: VisitMut + ?Sized,
1021{
1022    v.visit_expr_mut(&mut node.base);
1023    v.visit_expr_mut(&mut node.map);
1024}
1025
1026/// Default mutable traversal for [`ExprMatch`] nodes. Visits the subject, each arm's expression, and the else expression.
1027pub fn visit_expr_match_mut<V>(v: &mut V, node: &mut ExprMatch)
1028where
1029    V: VisitMut + ?Sized,
1030{
1031    v.visit_expr_mut(&mut node.subject);
1032    for arm in &mut node.arms {
1033        v.visit_expr_mut(&mut arm.expr);
1034    }
1035    v.visit_expr_mut(&mut node.else_expr);
1036}
1037
1038/// Default mutable traversal for [`ExprNot`] nodes. Visits the inner expression.
1039pub fn visit_expr_not_mut<V>(v: &mut V, node: &mut ExprNot)
1040where
1041    V: VisitMut + ?Sized,
1042{
1043    v.visit_expr_mut(&mut node.expr);
1044}
1045
1046/// Default mutable traversal for [`ExprOr`] nodes. Visits each operand.
1047pub fn visit_expr_or_mut<V>(v: &mut V, node: &mut ExprOr)
1048where
1049    V: VisitMut + ?Sized,
1050{
1051    for expr in node {
1052        v.visit_expr_mut(expr);
1053    }
1054}
1055
1056/// Default mutable traversal for [`ExprList`] nodes. Visits each item expression.
1057pub fn visit_expr_list_mut<V>(v: &mut V, node: &mut ExprList)
1058where
1059    V: VisitMut + ?Sized,
1060{
1061    for e in &mut node.items {
1062        v.visit_expr_mut(e);
1063    }
1064}
1065
1066/// Default mutable traversal for [`ExprRecord`] nodes. Visits each field expression.
1067pub fn visit_expr_record_mut<V>(v: &mut V, node: &mut ExprRecord)
1068where
1069    V: VisitMut + ?Sized,
1070{
1071    for expr in &mut **node {
1072        v.visit_expr_mut(expr);
1073    }
1074}
1075
1076/// Default mutable traversal for [`ExprReference`] nodes. Dispatches based on the reference kind.
1077pub fn visit_expr_reference_mut<V>(v: &mut V, node: &mut ExprReference)
1078where
1079    V: VisitMut + ?Sized,
1080{
1081    match node {
1082        ExprReference::Model { .. } => {}
1083        ExprReference::Field { .. } => {}
1084        ExprReference::Column(expr_column) => v.visit_expr_column_mut(expr_column),
1085    }
1086}
1087
1088/// Default mutable traversal for [`ExprSet`] nodes. Dispatches to the set expression variant visitor.
1089pub fn visit_expr_set_mut<V>(v: &mut V, node: &mut ExprSet)
1090where
1091    V: VisitMut + ?Sized,
1092{
1093    match node {
1094        ExprSet::Select(expr) => v.visit_stmt_select_mut(expr),
1095        ExprSet::SetOp(expr) => v.visit_expr_set_op_mut(expr),
1096        ExprSet::Update(expr) => v.visit_stmt_update_mut(expr),
1097        ExprSet::Values(expr) => v.visit_values_mut(expr),
1098        ExprSet::Insert(expr) => v.visit_stmt_insert_mut(expr),
1099    }
1100}
1101
1102/// Default mutable traversal for [`ExprSetOp`] nodes. Visits each operand.
1103pub fn visit_expr_set_op_mut<V>(v: &mut V, node: &mut ExprSetOp)
1104where
1105    V: VisitMut + ?Sized,
1106{
1107    for operand in &mut node.operands {
1108        v.visit_expr_set_mut(operand);
1109    }
1110}
1111
1112/// Default mutable traversal for [`ExprStartsWith`] nodes. Visits the attribute expression and prefix.
1113pub fn visit_expr_starts_with_mut<V>(v: &mut V, node: &mut ExprStartsWith)
1114where
1115    V: VisitMut + ?Sized,
1116{
1117    v.visit_expr_mut(&mut node.expr);
1118    v.visit_expr_mut(&mut node.prefix);
1119}
1120
1121/// Default mutable traversal for [`ExprStmt`] nodes. Visits the inner statement.
1122pub fn visit_expr_stmt_mut<V>(v: &mut V, node: &mut ExprStmt)
1123where
1124    V: VisitMut + ?Sized,
1125{
1126    v.visit_stmt_mut(&mut node.stmt);
1127}
1128
1129/// Default mutable traversal for [`ExprProject`] nodes. Visits the base expression and the projection.
1130pub fn visit_expr_project_mut<V>(v: &mut V, node: &mut ExprProject)
1131where
1132    V: VisitMut + ?Sized,
1133{
1134    v.visit_expr_mut(&mut node.base);
1135    v.visit_projection_mut(&mut node.projection);
1136}
1137
1138/// Default mutable traversal for [`Filter`] nodes. Visits the optional filter expression.
1139pub fn visit_filter_mut<V>(v: &mut V, node: &mut Filter)
1140where
1141    V: VisitMut + ?Sized,
1142{
1143    if let Some(expr) = &mut node.expr {
1144        v.visit_expr_mut(expr);
1145    }
1146}
1147
1148/// Default mutable traversal for [`Condition`] nodes. Visits the optional condition expression.
1149pub fn visit_condition_mut<V>(v: &mut V, node: &mut Condition)
1150where
1151    V: VisitMut + ?Sized,
1152{
1153    if let Some(expr) = &mut node.expr {
1154        v.visit_expr_mut(expr);
1155    }
1156}
1157
1158/// Default mutable traversal for [`InsertTarget`] nodes. Visits the scope query if present.
1159pub fn visit_insert_target_mut<V>(v: &mut V, node: &mut InsertTarget)
1160where
1161    V: VisitMut + ?Sized,
1162{
1163    if let InsertTarget::Scope(stmt) = node {
1164        v.visit_stmt_query_mut(stmt)
1165    }
1166}
1167
1168/// Default mutable traversal for [`Join`] nodes. Visits the table and the join constraint expression.
1169pub fn visit_join_mut<V>(v: &mut V, node: &mut Join)
1170where
1171    V: VisitMut + ?Sized,
1172{
1173    v.visit_source_table_id_mut(&mut node.table);
1174    match &mut node.constraint {
1175        JoinOp::Left(expr) => v.visit_expr_mut(expr),
1176    }
1177}
1178
1179/// Default mutable traversal for [`Limit`] nodes.
1180pub fn visit_limit_mut<V>(v: &mut V, node: &mut Limit)
1181where
1182    V: VisitMut + ?Sized,
1183{
1184    match node {
1185        Limit::Cursor(cursor) => v.visit_limit_cursor_mut(cursor),
1186        Limit::Offset(offset) => v.visit_limit_offset_mut(offset),
1187    }
1188}
1189
1190/// Default mutable traversal for [`LimitCursor`] nodes.
1191pub fn visit_limit_cursor_mut<V>(v: &mut V, node: &mut LimitCursor)
1192where
1193    V: VisitMut + ?Sized,
1194{
1195    v.visit_expr_mut(&mut node.page_size);
1196    if let Some(after) = &mut node.after {
1197        v.visit_expr_mut(after);
1198    }
1199}
1200
1201/// Default mutable traversal for [`LimitOffset`] nodes.
1202pub fn visit_limit_offset_mut<V>(v: &mut V, node: &mut LimitOffset)
1203where
1204    V: VisitMut + ?Sized,
1205{
1206    v.visit_expr_mut(&mut node.limit);
1207    if let Some(offset) = &mut node.offset {
1208        v.visit_expr_mut(offset);
1209    }
1210}
1211
1212/// Default mutable traversal for [`OrderBy`] nodes. Visits each ordering expression.
1213pub fn visit_order_by_mut<V>(v: &mut V, node: &mut OrderBy)
1214where
1215    V: VisitMut + ?Sized,
1216{
1217    for expr in &mut node.exprs {
1218        v.visit_order_by_expr_mut(expr);
1219    }
1220}
1221
1222/// Default mutable traversal for [`OrderByExpr`] nodes. Visits the ordering expression.
1223pub fn visit_order_by_expr_mut<V>(v: &mut V, node: &mut OrderByExpr)
1224where
1225    V: VisitMut + ?Sized,
1226{
1227    v.visit_expr_mut(&mut node.expr);
1228}
1229
1230/// Default mutable traversal for [`Path`] nodes. Visits the projection.
1231pub fn visit_path_mut<V>(v: &mut V, node: &mut Path)
1232where
1233    V: VisitMut + ?Sized,
1234{
1235    v.visit_projection_mut(&mut node.projection);
1236}
1237
1238/// Default mutable traversal for [`Projection`] nodes. This is a leaf node with no children to visit.
1239pub fn visit_projection_mut<V>(v: &mut V, node: &mut Projection)
1240where
1241    V: VisitMut + ?Sized,
1242{
1243}
1244
1245/// Default mutable traversal for [`Returning`] nodes. Visits each path for model variants, or the expression for expr and value variants.
1246pub fn visit_returning_mut<V>(v: &mut V, node: &mut Returning)
1247where
1248    V: VisitMut + ?Sized,
1249{
1250    match node {
1251        Returning::Model { include } => {
1252            for path in include {
1253                v.visit_path_mut(path);
1254            }
1255        }
1256        Returning::Changed => {}
1257        Returning::Project(expr) => v.visit_expr_mut(expr),
1258        Returning::Expr(expr) => v.visit_expr_mut(expr),
1259    }
1260}
1261
1262/// Default mutable traversal for [`Source`] nodes. Dispatches to the model or table source visitor.
1263pub fn visit_source_mut<V>(v: &mut V, node: &mut Source)
1264where
1265    V: VisitMut + ?Sized,
1266{
1267    match node {
1268        Source::Model(source_model) => v.visit_source_model_mut(source_model),
1269        Source::Table(source_table) => v.visit_source_table_mut(source_table),
1270    }
1271}
1272
1273/// Default mutable traversal for [`SourceModel`] nodes. Visits the optional association.
1274pub fn visit_source_model_mut<V>(v: &mut V, node: &mut SourceModel)
1275where
1276    V: VisitMut + ?Sized,
1277{
1278    if let Some(association) = &mut node.via {
1279        v.visit_association_mut(association);
1280    }
1281}
1282
1283/// Default mutable traversal for [`SourceTable`] nodes. Visits each table reference and each FROM clause table-with-joins.
1284pub fn visit_source_table_mut<V>(v: &mut V, node: &mut SourceTable)
1285where
1286    V: VisitMut + ?Sized,
1287{
1288    for table_ref in &mut node.tables {
1289        v.visit_table_ref_mut(table_ref);
1290    }
1291    for table_with_joins in &mut node.from {
1292        v.visit_table_with_joins_mut(table_with_joins);
1293    }
1294}
1295
1296/// Default mutable traversal for [`SourceTableId`] nodes. This is a leaf node with no children to visit.
1297pub fn visit_source_table_id_mut<V>(v: &mut V, node: &mut SourceTableId)
1298where
1299    V: VisitMut + ?Sized,
1300{
1301    // SourceTableId is just an index, nothing to visit
1302}
1303
1304/// Default mutable traversal for [`TableFactor`] nodes. Dispatches by factor type.
1305pub fn visit_table_factor_mut<V>(v: &mut V, node: &mut TableFactor)
1306where
1307    V: VisitMut + ?Sized,
1308{
1309    match node {
1310        TableFactor::Table(table_id) => v.visit_source_table_id_mut(table_id),
1311    }
1312}
1313
1314/// Default mutable traversal for [`Statement`] nodes. Dispatches to the statement-specific visitor.
1315pub fn visit_stmt_mut<V>(v: &mut V, node: &mut Statement)
1316where
1317    V: VisitMut + ?Sized,
1318{
1319    match node {
1320        Statement::Delete(stmt) => v.visit_stmt_delete_mut(stmt),
1321        Statement::Insert(stmt) => v.visit_stmt_insert_mut(stmt),
1322        Statement::Query(stmt) => v.visit_stmt_query_mut(stmt),
1323        Statement::Update(stmt) => v.visit_stmt_update_mut(stmt),
1324    }
1325}
1326
1327/// Default mutable traversal for [`Delete`] nodes. Visits the source, filter, and optional returning clause.
1328pub fn visit_stmt_delete_mut<V>(v: &mut V, node: &mut Delete)
1329where
1330    V: VisitMut + ?Sized,
1331{
1332    v.visit_source_mut(&mut node.from);
1333    v.visit_filter_mut(&mut node.filter);
1334    v.visit_condition_mut(&mut node.condition);
1335
1336    if let Some(returning) = &mut node.returning {
1337        v.visit_returning_mut(returning);
1338    }
1339}
1340
1341/// Default mutable traversal for [`Insert`] nodes. Visits the target, source query, and optional returning clause.
1342pub fn visit_stmt_insert_mut<V>(v: &mut V, node: &mut Insert)
1343where
1344    V: VisitMut + ?Sized,
1345{
1346    v.visit_insert_target_mut(&mut node.target);
1347    v.visit_stmt_query_mut(&mut node.source);
1348
1349    if let Some(returning) = &mut node.returning {
1350        v.visit_returning_mut(returning);
1351    }
1352}
1353
1354/// Default mutable traversal for [`Query`] nodes. Visits the optional WITH clause, body, optional ORDER BY, and optional LIMIT.
1355pub fn visit_stmt_query_mut<V>(v: &mut V, node: &mut Query)
1356where
1357    V: VisitMut + ?Sized,
1358{
1359    if let Some(with) = &mut node.with {
1360        v.visit_with_mut(with);
1361    }
1362
1363    v.visit_expr_set_mut(&mut node.body);
1364
1365    if let Some(order_by) = &mut node.order_by {
1366        v.visit_order_by_mut(order_by);
1367    }
1368
1369    if let Some(limit) = &mut node.limit {
1370        v.visit_limit_mut(limit);
1371    }
1372}
1373
1374/// Default mutable traversal for [`Select`] nodes. Visits the source, filter, and returning clause.
1375pub fn visit_stmt_select_mut<V>(v: &mut V, node: &mut Select)
1376where
1377    V: VisitMut + ?Sized,
1378{
1379    v.visit_source_mut(&mut node.source);
1380    v.visit_filter_mut(&mut node.filter);
1381    v.visit_returning_mut(&mut node.returning);
1382}
1383
1384/// Default mutable traversal for [`Update`] nodes. Visits the target, assignments, filter, condition, and optional returning clause.
1385pub fn visit_stmt_update_mut<V>(v: &mut V, node: &mut Update)
1386where
1387    V: VisitMut + ?Sized,
1388{
1389    v.visit_update_target_mut(&mut node.target);
1390    v.visit_assignments_mut(&mut node.assignments);
1391    v.visit_filter_mut(&mut node.filter);
1392    v.visit_condition_mut(&mut node.condition);
1393
1394    if let Some(returning) = &mut node.returning {
1395        v.visit_returning_mut(returning);
1396    }
1397}
1398
1399/// Default mutable traversal for [`TableDerived`] nodes. Visits the subquery.
1400pub fn visit_table_derived_mut<V>(v: &mut V, node: &mut TableDerived)
1401where
1402    V: VisitMut + ?Sized,
1403{
1404    v.visit_stmt_query_mut(&mut node.subquery);
1405}
1406
1407/// Default mutable traversal for [`TableRef`] nodes. Dispatches by reference kind, visiting derived tables and arg expressions.
1408pub fn visit_table_ref_mut<V>(v: &mut V, node: &mut TableRef)
1409where
1410    V: VisitMut + ?Sized,
1411{
1412    match node {
1413        TableRef::Cte { .. } => {}
1414        TableRef::Derived(table_derived) => v.visit_table_derived_mut(table_derived),
1415        TableRef::Table(_) => {}
1416        TableRef::Arg(expr_arg) => v.visit_expr_arg_mut(expr_arg),
1417    }
1418}
1419
1420/// Default mutable traversal for [`TableWithJoins`] nodes. Visits the relation and each join.
1421pub fn visit_table_with_joins_mut<V>(v: &mut V, node: &mut TableWithJoins)
1422where
1423    V: VisitMut + ?Sized,
1424{
1425    v.visit_table_factor_mut(&mut node.relation);
1426    for join in &mut node.joins {
1427        v.visit_join_mut(join);
1428    }
1429}
1430
1431/// Default mutable traversal for [`Type`] nodes. This is a leaf node with no children to visit.
1432pub fn visit_type_mut<V>(v: &mut V, node: &mut Type)
1433where
1434    V: VisitMut + ?Sized,
1435{
1436    // Type is just type information, no traversal needed
1437}
1438
1439/// Default mutable traversal for [`UpdateTarget`] nodes. Visits the query if present.
1440pub fn visit_update_target_mut<V>(v: &mut V, node: &mut UpdateTarget)
1441where
1442    V: VisitMut + ?Sized,
1443{
1444    if let UpdateTarget::Query(stmt) = node {
1445        v.visit_stmt_query_mut(stmt)
1446    }
1447}
1448
1449/// Default mutable traversal for [`Value`] nodes. Visits the inner record if the value is a record variant.
1450pub fn visit_value_mut<V>(v: &mut V, node: &mut Value)
1451where
1452    V: VisitMut + ?Sized,
1453{
1454    if let Value::Record(node) = node {
1455        v.visit_value_record(node);
1456    }
1457}
1458
1459/// Default mutable traversal for [`ValueRecord`] nodes. Visits each value field.
1460pub fn visit_value_record<V>(v: &mut V, node: &mut ValueRecord)
1461where
1462    V: VisitMut + ?Sized,
1463{
1464    for expr in &mut node.fields {
1465        v.visit_value_mut(expr);
1466    }
1467}
1468
1469/// Default mutable traversal for [`Values`] nodes. Visits each row expression.
1470pub fn visit_values_mut<V>(v: &mut V, node: &mut Values)
1471where
1472    V: VisitMut + ?Sized,
1473{
1474    for expr in &mut node.rows {
1475        v.visit_expr_mut(expr);
1476    }
1477}
1478
1479/// Default mutable traversal for [`With`] nodes. Visits each CTE.
1480pub fn visit_with_mut<V>(v: &mut V, node: &mut With)
1481where
1482    V: VisitMut + ?Sized,
1483{
1484    for cte in &mut node.ctes {
1485        v.visit_cte_mut(cte);
1486    }
1487}
1488
1489/// Calls `f` for every [`Expr`] node reachable from `node`, in post-order,
1490/// allowing mutation.
1491pub fn for_each_expr_mut<F>(node: &mut impl Node, f: F)
1492where
1493    F: FnMut(&mut Expr),
1494{
1495    struct ForEach<F> {
1496        f: F,
1497    }
1498
1499    impl<F> VisitMut for ForEach<F>
1500    where
1501        F: FnMut(&mut Expr),
1502    {
1503        fn visit_expr_mut(&mut self, node: &mut Expr) {
1504            visit_expr_mut(self, node);
1505            (self.f)(node);
1506        }
1507    }
1508
1509    node.visit_mut(ForEach { f });
1510}
1511
1512/// Walk an expression tree in pre-order, tracking scope depth through
1513/// Let/Map scopes.
1514///
1515/// For each node, calls `f(expr, scope_depth)`:
1516/// - If `f` returns `true`, recursion into children continues.
1517/// - If `f` returns `false`, children are skipped (e.g., when the callback
1518///   has replaced the expression and doesn't want to recurse into the
1519///   replacement).
1520///
1521/// Scope depth rules:
1522/// - `Let` bindings are visited at the current depth; the body at `depth + 1`
1523/// - `Map` base is visited at the current depth; the map function at `depth + 1`
1524/// - All other compound expressions: children at the same depth
1525///
1526/// This matches the semantics of `ExprArg.nesting`: an arg with
1527/// `nesting == scope_depth` references the outermost (statement-level) scope,
1528/// while `nesting < scope_depth` references a Let/Map binding.
1529pub fn walk_expr_scoped_mut<F>(expr: &mut Expr, scope_depth: usize, mut f: F)
1530where
1531    F: FnMut(&mut Expr, usize) -> bool,
1532{
1533    walk_expr_scoped_mut_ref(expr, scope_depth, &mut f);
1534}
1535
1536fn walk_expr_scoped_mut_ref<F>(expr: &mut Expr, scope_depth: usize, f: &mut F)
1537where
1538    F: FnMut(&mut Expr, usize) -> bool,
1539{
1540    struct ScopedWalk<'a, F> {
1541        f: &'a mut F,
1542        scope_depth: usize,
1543    }
1544
1545    impl<F> VisitMut for ScopedWalk<'_, F>
1546    where
1547        F: FnMut(&mut Expr, usize) -> bool,
1548    {
1549        fn visit_expr_mut(&mut self, node: &mut Expr) {
1550            if !(self.f)(node, self.scope_depth) {
1551                return;
1552            }
1553            visit_expr_mut(self, node);
1554        }
1555
1556        fn visit_expr_let_mut(&mut self, node: &mut ExprLet) {
1557            for binding in &mut node.bindings {
1558                self.visit_expr_mut(binding);
1559            }
1560            self.scope_depth += 1;
1561            self.visit_expr_mut(&mut node.body);
1562            self.scope_depth -= 1;
1563        }
1564
1565        fn visit_expr_map_mut(&mut self, node: &mut ExprMap) {
1566            self.visit_expr_mut(&mut node.base);
1567            self.scope_depth += 1;
1568            self.visit_expr_mut(&mut node.map);
1569            self.scope_depth -= 1;
1570        }
1571    }
1572
1573    ScopedWalk { f, scope_depth }.visit_expr_mut(expr);
1574}