func produceTokens(n parse.Node, tokenCh chan<- Token) { if len(n.Children()) == 0 { tokenType := ParserError moreStyle := "" switch n := n.(type) { case *parse.Primary: switch n.Type { case parse.Bareword: tokenType = Bareword case parse.SingleQuoted: tokenType = SingleQuoted case parse.DoubleQuoted: tokenType = DoubleQuoted case parse.Variable: tokenType = Variable case parse.Wildcard: tokenType = Wildcard case parse.Tilde: tokenType = Tilde } case *parse.Sep: tokenType = Sep moreStyle = styleForSep[n.SourceText()] } tokenCh <- Token{tokenType, n.SourceText(), n, moreStyle} } for _, child := range n.Children() { produceTokens(child, tokenCh) } }
func (s *Stylist) style(n parse.Node) { if fn, ok := n.(*parse.Form); ok { for _, an := range fn.Assignments { if an.Dst != nil && an.Dst.Head != nil { v := an.Dst.Head s.add(styleForType[Variable].String(), v.Begin(), v.End()) } } if fn.Head != nil { s.formHead(fn.Head) } } if cn, ok := n.(*parse.Control); ok { switch cn.Kind { case parse.ForControl: if cn.Iterator != nil { v := cn.Iterator.Head s.add(styleForType[Variable].String(), v.Begin(), v.End()) } case parse.TryControl: if cn.ExceptVar != nil { v := cn.ExceptVar.Head s.add(styleForType[Variable].String(), v.Begin(), v.End()) } } } for _, child := range n.Children() { s.style(child) } }
func produceTokens(n parse.Node, tokenCh chan<- Token) { if n.Begin() == n.End() { // Ignore empty node. This happens e.g. with an empty source code, where // the parsed node is an empty Chunk. return } if len(n.Children()) == 0 { tokenType := ParserError moreStyle := "" switch n := n.(type) { case *parse.Primary: switch n.Type { case parse.Bareword: tokenType = Bareword case parse.SingleQuoted: tokenType = SingleQuoted case parse.DoubleQuoted: tokenType = DoubleQuoted case parse.Variable: tokenType = Variable case parse.Wildcard: tokenType = Wildcard case parse.Tilde: tokenType = Tilde } case *parse.Sep: tokenType = Sep septext := n.SourceText() if strings.HasPrefix(septext, "#") { moreStyle = styleForSep["#"] } else { moreStyle = styleForSep[septext] } default: Logger.Printf("bad leaf type %T", n) } tokenCh <- Token{tokenType, n.SourceText(), n, moreStyle} } for _, child := range n.Children() { produceTokens(child, tokenCh) } }