code: func (t *tree) placeholderize(parent ast.ParentNode) *ast.ListNode {
  	// Wrap the children in Placeholder nodes unless they are RawText
  	var r []ast.Node
  	for _, child := range parent.Children() {
  		switch child := child.(type) {
  		case *ast.RawTextNode:
  			r = append(r, t.parseMsgRawText(child)...)
  		case *ast.MsgPluralNode:
  			var cases []*ast.MsgPluralCaseNode
  			for _, pc := range child.Cases {
  				cases = append(cases,
  					&ast.MsgPluralCaseNode{pc.Pos, pc.Value, t.placeholderize(pc.Body.(*ast.ListNode))})
  			}
  			r = append(r, &ast.MsgPluralNode{child.Pos, "", child.Value, cases, t.placeholderize(child.Default.(*ast.ListNode))})
  		default:
  			r = append(r, &ast.MsgPlaceholderNode{child.Position(), "", child})
  		}
  	}
  	return &ast.ListNode{parent.Position(), r}
  }
docs: // placeholderize wraps all children of the given node in placeholders as
  // necessary.  the new list of children nodes is returned.