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