Example #1
0
// cleanupSlot removes slot and fill nodes.
//
// May contain child actions:
// SlotNode:  n.List
// DefineNode: n.List
// FillNode:   n.List
// IfNode:     n.List, n.ElseList
// ListNode:   n.Nodes
// RangeNode:  n.List, n.ElseList
// WithNode:   n.List, n.ElseList
func cleanupSlot(n parse.Node) {
	switch n := n.(type) {
	case *parse.IfNode:
		cleanupSlot(n.List)
		cleanupSlot(n.ElseList)
	case *parse.ListNode:
		if n == nil {
			return
		}
		k := 0
		for k < len(n.Nodes) {
			v := n.Nodes[k]
			switch v := v.(type) {
			case *parse.SlotNode:
				// Replace the slot by its list of nodes.
				n.Nodes[k] = v.List
				continue
			case *parse.FillNode:
				// Remove the filler.
				n.Nodes = append(n.Nodes[:k], n.Nodes[k+1:]...)
				continue
			default:
				cleanupSlot(v)
			}
			k++
		}
	case *parse.RangeNode:
		cleanupSlot(n.List)
		cleanupSlot(n.ElseList)
	case *parse.WithNode:
		cleanupSlot(n.List)
		cleanupSlot(n.ElseList)
	}
}