Help us shape the future of Go! Take the 2026 Go Developer Survey

astequal

package module
v1.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2022 License: MIT Imports: 3 Imported by: 9

README

Go Report Card GoDoc Build Status

astequal

Package astequal provides AST (deep) equallity check operations.

Installation:

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

Documentation

Overview

Package astequal provides AST (deep) equallity check operations.

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

}
Output:
false
true
true

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Decl

func Decl(x, y ast.Decl) bool

Decl reports whether two AST declarations are structurally (deep) equal.

Nil arguments are permitted: true is returned if x and y are both nils. ast.BadDecl comparison always yields false.

func Expr

func Expr(x, y ast.Expr) bool

Expr reports whether two AST expressions are structurally (deep) equal.

Nil arguments are permitted: true is returned if x and y are both nils. ast.BadExpr comparison always yields false.

func Node

func Node(x, y ast.Node) bool

Node reports whether two AST nodes are structurally (deep) equal.

Nil arguments are permitted: true is returned if x and y are both nils.

See also: Expr, Stmt, Decl functions.

func Stmt

func Stmt(x, y ast.Stmt) bool

Stmt reports whether two AST statements are structurally (deep) equal.

Nil arguments are permitted: true is returned if x and y are both nils. ast.BadStmt comparison always yields false.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL