1package lintutil 2 3import ( 4 "go/ast" 5 6 "golang.org/x/tools/go/ast/astutil" 7) 8 9// FindNode applies pred for root and all it's childs until it returns true. 10// Matched node is returned. 11// If none of the nodes matched predicate, nil is returned. 12func FindNode(root ast.Node, pred func(ast.Node) bool) ast.Node { 13 var found ast.Node 14 astutil.Apply(root, nil, func(cur *astutil.Cursor) bool { 15 if pred(cur.Node()) { 16 found = cur.Node() 17 return false 18 } 19 return true 20 }) 21 return found 22} 23 24// ContainsNode reports whether `FindNode(root, pred)!=nil`. 25func ContainsNode(root ast.Node, pred func(ast.Node) bool) bool { 26 return FindNode(root, pred) != nil 27} 28