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