package ast import "git.akyoto.dev/cli/q/src/build/token" // Count counts how often the given token appears in the AST. func Count(body AST, kind token.Kind, name string) int { count := 0 for _, node := range body { switch node := node.(type) { case *Assign: if node.Name.Kind == kind && node.Name.Text() == name { count++ } count += node.Value.Count(kind, name) case *Call: count += node.Expression.Count(kind, name) case *Define: count += node.Value.Count(kind, name) case *Return: if node.Value != nil { count += node.Value.Count(kind, name) } case *If: count += node.Condition.Count(kind, name) count += Count(node.Body, kind, name) case *Loop: count += Count(node.Body, kind, name) default: panic("unknown AST type") } } return count }