@@ -11,6 +11,7 @@ import (
11
11
"github.com/pkg/errors"
12
12
"github.com/vim-volt/volt/config"
13
13
"github.com/vim-volt/volt/dsl/dslctx"
14
+ "github.com/vim-volt/volt/dsl/ops/util"
14
15
"github.com/vim-volt/volt/dsl/types"
15
16
"github.com/vim-volt/volt/lockjson"
16
17
"github.com/vim-volt/volt/pathutil"
@@ -46,7 +47,7 @@ func Execute(ctx context.Context, expr types.Expr) (_ types.Value, result error)
46
47
return nil , err
47
48
}
48
49
49
- val , rollback , err := expr . Eval (ctx )
50
+ val , rollback , err := evalDepthFirst (ctx , expr )
50
51
if err != nil {
51
52
if rollback != nil {
52
53
rollback ()
@@ -56,6 +57,35 @@ func Execute(ctx context.Context, expr types.Expr) (_ types.Value, result error)
56
57
return val , nil
57
58
}
58
59
60
+ func evalDepthFirst (ctx context.Context , expr types.Expr ) (_ types.Value , _ func (), result error ) {
61
+ op := expr .Op ()
62
+ g := util .FuncGuard (op .String ())
63
+ defer func () {
64
+ result = g .Error (recover ())
65
+ }()
66
+
67
+ // Evaluate arguments first
68
+ args := expr .Args ()
69
+ newArgs := make ([]types.Value , 0 , len (args ))
70
+ for i := range args {
71
+ innerExpr , ok := args [i ].(types.Expr )
72
+ if ! ok {
73
+ newArgs = append (newArgs , args [i ])
74
+ continue
75
+ }
76
+ ret , rbFunc , err := evalDepthFirst (ctx , innerExpr )
77
+ g .Add (rbFunc )
78
+ if err != nil {
79
+ return nil , g .Rollback , g .Error (err )
80
+ }
81
+ newArgs = append (newArgs , ret )
82
+ }
83
+
84
+ ret , rbFunc , err := op .EvalExpr (ctx , newArgs )
85
+ g .Add (rbFunc )
86
+ return ret , g .Rollback , g .Error (err )
87
+ }
88
+
59
89
func expandMacro (expr types.Expr ) (types.Expr , error ) {
60
90
val , err := doExpandMacro (expr )
61
91
if err != nil {
0 commit comments