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, buffer []byte, kind token.Kind, name string) uint8 { count := uint8(0) for _, node := range body { switch node := node.(type) { case *Assert: count += node.Condition.Count(buffer, kind, name) case *Assign: count += node.Expression.Count(buffer, kind, name) case *Call: count += node.Expression.Count(buffer, kind, name) case *Define: count += node.Expression.Count(buffer, kind, name) case *Return: if node.Value != nil { count += node.Value.Count(buffer, kind, name) } case *If: count += node.Condition.Count(buffer, kind, name) count += Count(node.Body, buffer, kind, name) count += Count(node.Else, buffer, kind, name) case *Loop: count += Count(node.Body, buffer, kind, name) default: panic("unknown AST type") } } return count }