Example #1
0
// DescendentNodesByNodeKind starts at the root navigates down the root.  Every edge is checked against the edgeChecker
// to determine whether or not to follow it.  The nodes at the tail end of every chased edge are then checked against the
// the targetNodeKind.  Matches are added to the return and every checked node then has its edges checked: lather, rinse, repeat
func DescendentNodesByNodeKind(g osgraph.Graph, visitedNodes graphview.IntSet, node graph.Node, targetNodeKind string, edgeChecker osgraph.EdgeFunc) []graph.Node {
	if visitedNodes.Has(node.ID()) {
		return []graph.Node{}
	}
	visitedNodes.Insert(node.ID())

	ret := []graph.Node{}
	for _, successor := range g.From(node) {
		edge := g.Edge(node, successor)

		if edgeChecker(osgraph.New(), node, successor, g.EdgeKinds(edge)) {
			if g.Kind(successor) == targetNodeKind {
				ret = append(ret, successor)
			}

			ret = append(ret, DescendentNodesByNodeKind(g, visitedNodes, successor, targetNodeKind, edgeChecker)...)
		}
	}

	return ret
}