37 lines
706 B
Go
37 lines
706 B
Go
|
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:
|
||
|
count += node.Value.Count(kind, name)
|
||
|
|
||
|
case *Call:
|
||
|
count += node.Expression.Count(kind, name)
|
||
|
|
||
|
case *Define:
|
||
|
count += node.Value.Count(kind, name)
|
||
|
|
||
|
case *Return:
|
||
|
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
|
||
|
}
|