1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
package js
import (
"bytes"
"regexp"
"testing"
"github.com/tdewolff/parse/v2"
"github.com/tdewolff/test"
)
type walker struct{}
func (w *walker) Enter(n INode) IVisitor {
switch n := n.(type) {
case *Var:
if bytes.Equal(n.Data, []byte("x")) {
n.Data = []byte("obj")
}
}
return w
}
func (w *walker) Exit(n INode) {}
func TestWalk(t *testing.T) {
js := `
if (true) {
for (i = 0; i < 1; i++) {
x.y = i
}
}`
ast, err := Parse(parse.NewInputString(js), Options{})
if err != nil {
t.Fatal(err)
}
Walk(&walker{}, ast)
re := regexp.MustCompile("\n *")
t.Run("TestWalk", func(t *testing.T) {
src := ast.JSString()
src = re.ReplaceAllString(src, " ")
test.String(t, src, "if (true) { for (i = 0; i < 1; i++) { obj.y = i; } }")
})
}
func TestWalkNilNode(t *testing.T) {
nodes := []INode{
&AST{},
&Var{},
&BlockStmt{},
&EmptyStmt{},
&ExprStmt{},
&IfStmt{},
&DoWhileStmt{},
&WhileStmt{},
&ForStmt{},
&ForInStmt{},
&ForOfStmt{},
&CaseClause{},
&SwitchStmt{},
&BranchStmt{},
&ReturnStmt{},
&WithStmt{},
&LabelledStmt{},
&ThrowStmt{},
&TryStmt{},
&DebuggerStmt{},
&Alias{},
&ImportStmt{},
&ExportStmt{},
&DirectivePrologueStmt{},
&PropertyName{},
&BindingArray{},
&BindingObjectItem{},
&BindingObject{},
&BindingElement{},
&VarDecl{},
&Params{},
&FuncDecl{},
&MethodDecl{},
&Field{},
&ClassElement{},
&ClassDecl{},
&LiteralExpr{},
&Element{},
&ArrayExpr{},
&Property{},
&ObjectExpr{},
&TemplatePart{},
&TemplateExpr{},
&GroupExpr{},
&IndexExpr{},
&DotExpr{},
&NewTargetExpr{},
&ImportMetaExpr{},
&Arg{},
&Args{},
&NewExpr{},
&CallExpr{},
&UnaryExpr{},
&BinaryExpr{},
&CondExpr{},
&YieldExpr{},
&ArrowFunc{},
}
t.Run("TestWalkNilNode", func(t *testing.T) {
for _, n := range nodes {
Walk(&walker{}, n)
}
})
}
|