# README
astequal
Package astequal
provides AST (deep) equallity check operations.
Installation:
Go version 1.16+
go get github.com/go-toolsmith/astequal
Example
package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"log"
"reflect"
"github.com/go-toolsmith/astequal"
)
func main() {
const code = `
package foo
func main() {
x := []int{1, 2, 3}
x := []int{1, 2, 3}
}`
fset := token.NewFileSet()
pkg, err := parser.ParseFile(fset, "string", code, 0)
if err != nil {
log.Fatalf("parse error: %+v", err)
}
fn := pkg.Decls[0].(*ast.FuncDecl)
x := fn.Body.List[0]
y := fn.Body.List[1]
// Reflect DeepEqual will fail due to different Pos values.
// astequal only checks whether two nodes describe AST.
fmt.Println(reflect.DeepEqual(x, y)) // => false
fmt.Println(astequal.Node(x, y)) // => true
fmt.Println(astequal.Stmt(x, y)) // => true
}
Performance
astequal
outperforms reflection-based comparison by a big margin:
BenchmarkEqualExpr/astequal.Expr-8 5000000 298 ns/op 0 B/op 0 allocs/op
BenchmarkEqualExpr/astequal.Node-8 3000000 409 ns/op 0 B/op 0 allocs/op
BenchmarkEqualExpr/reflect.DeepEqual-8 50000 38898 ns/op 10185 B/op 156 allocs/op
License
# Functions
Decl reports whether two AST declarations are structurally (deep) equal.
No description provided by the author
Expr reports whether two AST expressions are structurally (deep) equal.
Node reports whether two AST nodes are structurally (deep) equal.
Stmt reports whether two AST statements are structurally (deep) equal.