mirror of
https://github.com/robertkrimen/otto
synced 2025-10-12 20:27:30 +08:00
44 lines
1015 B
Go
44 lines
1015 B
Go
package ast_test
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/robertkrimen/otto/ast"
|
|
"github.com/robertkrimen/otto/file"
|
|
"github.com/robertkrimen/otto/parser"
|
|
)
|
|
|
|
func ExampleVisitorRewrite() {
|
|
source := `var b = function() {test(); try {} catch(e) {} var test = "test(); var test = 1"} // test`
|
|
program, err := parser.ParseFile(nil, "", source, 0)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
var shift file.Idx
|
|
|
|
ast.Walk(ast.VisitorFunc(func(v ast.Visitor, n ast.Node) ast.Visitor {
|
|
if n == nil {
|
|
return v
|
|
}
|
|
if id, ok := n.(*ast.Identifier); ok && id != nil {
|
|
idx := n.Idx0() + shift - 1
|
|
s := source[:idx] + "new_" + source[idx:]
|
|
source = s
|
|
shift += 4
|
|
}
|
|
if v, ok := n.(*ast.VariableExpression); ok && v != nil {
|
|
idx := n.Idx0() + shift - 1
|
|
s := source[:idx] + "varnew_" + source[idx:]
|
|
source = s
|
|
shift += 7
|
|
}
|
|
|
|
return v
|
|
}), program)
|
|
|
|
fmt.Println(source)
|
|
// Output: var varnew_b = function() {new_test(); try {} catch(new_e) {} var varnew_test = "test(); var test = 1"} // test
|
|
}
|