File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change
1
+ package patch_test
2
+
3
+ import (
4
+ "testing"
5
+
6
+ "github.com/stretchr/testify/require"
7
+
8
+ "github.com/expr-lang/expr"
9
+ "github.com/expr-lang/expr/ast"
10
+ "github.com/expr-lang/expr/vm"
11
+ "github.com/expr-lang/expr/vm/runtime"
12
+ )
13
+
14
+ func TestPatch_change_ident (t * testing.T ) {
15
+ program , err := expr .Compile (
16
+ `foo` ,
17
+ expr .Env (Env {}),
18
+ expr .Patch (changeIdent {}),
19
+ )
20
+ require .NoError (t , err )
21
+
22
+ expected := & vm.Program {
23
+ Bytecode : []vm.Opcode {
24
+ vm .OpLoadField ,
25
+ },
26
+ Arguments : []int {
27
+ 0 ,
28
+ },
29
+ Constants : []any {
30
+ & runtime.Field {
31
+ Path : []string {"bar" },
32
+ Index : []int {1 },
33
+ },
34
+ },
35
+ }
36
+
37
+ require .Equal (t , expected .Disassemble (), program .Disassemble ())
38
+ }
39
+
40
+ type Env struct {
41
+ Foo int `expr:"foo"`
42
+ Bar int `expr:"bar"`
43
+ }
44
+
45
+ type changeIdent struct {}
46
+
47
+ func (changeIdent ) Visit (node * ast.Node ) {
48
+ id , ok := (* node ).(* ast.IdentifierNode )
49
+ if ! ok {
50
+ return
51
+ }
52
+ if id .Value == "foo" {
53
+ // A correct way to patch the node:
54
+ //
55
+ // newNode := &ast.IdentifierNode{Value: "bar"}
56
+ // ast.Patch(node, newNode)
57
+ //
58
+ // But we can do it in a wrong way:
59
+ id .Value = "bar"
60
+ }
61
+ }
You can’t perform that action at this time.
0 commit comments