// 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) } }