Rewrite recursively invokes the rewriter to replace each expression. Nodes are traversed depth-first and rewritten from leaf to root.
(r Rewriter, expr Expr)
| 583 | // Rewrite recursively invokes the rewriter to replace each expression. |
| 584 | // Nodes are traversed depth-first and rewritten from leaf to root. |
| 585 | func Rewrite(r Rewriter, expr Expr) Expr { |
| 586 | switch e := expr.(type) { |
| 587 | case *UnaryExpr: |
| 588 | e.Expr = Rewrite(r, e.Expr) |
| 589 | |
| 590 | case *BinaryExpr: |
| 591 | e.LHS = Rewrite(r, e.LHS) |
| 592 | e.RHS = Rewrite(r, e.RHS) |
| 593 | |
| 594 | case *Case: |
| 595 | for i, cond := range e.WhenThens { |
| 596 | cond.When = Rewrite(r, cond.When) |
| 597 | cond.Then = Rewrite(r, cond.Then) |
| 598 | e.WhenThens[i] = cond |
| 599 | } |
| 600 | if e.Else != nil { |
| 601 | e.Else = Rewrite(r, e.Else) |
| 602 | } |
| 603 | |
| 604 | case *ParenExpr: |
| 605 | e.Expr = Rewrite(r, e.Expr) |
| 606 | |
| 607 | case *Call: |
| 608 | for i, expr := range e.Args { |
| 609 | e.Args[i] = Rewrite(r, expr) |
| 610 | } |
| 611 | } |
| 612 | |
| 613 | return r.Rewrite(expr) |
| 614 | } |
| 615 | |
| 616 | // RewriteFunc rewrites an expression hierarchy. |
| 617 | func RewriteFunc(e Expr, fn func(Expr) Expr) Expr { |
no test coverage detected