// intersperseComments consumes all comments that appear before the next token // tok and prints it together with the buffered whitespace (i.e., the whitespace // that needs to be written before the next token). A heuristic is used to mix // the comments and whitespace. The intersperseComments result indicates if a // newline was written or if a formfeed was dropped from the whitespace buffer. // func (p *printer) intersperseComments(next token.Position, tok token.Token) (wroteNewline, droppedFF bool) { var last *ast.Comment for p.commentBefore(next) { for _, c := range p.comment.List { p.writeCommentPrefix(p.posFor(c.Pos()), next, last, c, tok.IsKeyword()) p.writeComment(c) last = c } p.nextComment() } if last != nil { // if the last comment is a /*-style comment and the next item // follows on the same line but is not a comma or a "closing" // token, add an extra blank for separation if last.Text[1] == '*' && p.lineFor(last.Pos()) == next.Line && tok != token.COMMA && tok != token.RPAREN && tok != token.RBRACK && tok != token.RBRACE { p.writeByte(' ', 1) } // ensure that there is a line break after a //-style comment, // before a closing '}' unless explicitly disabled, or at eof needsLinebreak := last.Text[1] == '/' || tok == token.RBRACE && p.mode&noExtraLinebreak == 0 || tok == token.EOF return p.writeCommentSuffix(needsLinebreak) } // no comment was written - we should never reach here since // intersperseComments should not be called in that case p.internalError("intersperseComments called without pending comments") return }
// intersperseComments consumes all comments that appear before the next token // tok and prints it together with the buffered whitespace (i.e., the whitespace // that needs to be written before the next token). A heuristic is used to mix // the comments and whitespace. intersperseComments returns true if a pending // formfeed was dropped from the whitespace buffer. // func (p *printer) intersperseComments(next token.Position, tok token.Token) (droppedFF bool) { var last *ast.Comment for ; p.commentBefore(next); p.cindex++ { for _, c := range p.comments[p.cindex].List { p.writeCommentPrefix(p.fset.Position(c.Pos()), next, last, tok.IsKeyword()) p.writeComment(c) last = c } } if last != nil { if last.Text[1] == '*' && p.fset.Position(last.Pos()).Line == next.Line { // the last comment is a /*-style comment and the next item // follows on the same line: separate with an extra blank p.write([]byte{' '}) } // ensure that there is a line break after a //-style comment, // before a closing '}' unless explicitly disabled, or at eof needsLinebreak := last.Text[1] == '/' || tok == token.RBRACE && p.mode&noExtraLinebreak == 0 || tok == token.EOF return p.writeCommentSuffix(needsLinebreak) } // no comment was written - we should never reach here since // intersperseComments should not be called in that case p.internalError("intersperseComments called without pending comments") return false }
// intersperseComments consumes all comments that appear before the next token // tok and prints it together with the buffered whitespace (i.e., the whitespace // that needs to be written before the next token). A heuristic is used to mix // the comments and whitespace. intersperseComments returns true if a pending // formfeed was dropped from the whitespace buffer. // func (p *printer) intersperseComments(next token.Position, tok token.Token) (droppedFF bool) { var last *ast.Comment for ; p.commentBefore(next); p.cindex++ { for _, c := range p.comments[p.cindex].List { p.writeCommentPrefix(c.Pos(), next, last == nil, tok.IsKeyword()) p.writeComment(c) last = c } } if last != nil { if last.Text[1] == '*' && last.Pos().Line == next.Line { // the last comment is a /*-style comment and the next item // follows on the same line: separate with an extra blank p.write([]byte{' '}) } // ensure that there is a newline after a //-style comment // or if we are before a closing '}' or at the end of a file return p.writeCommentSuffix(last.Text[1] == '/' || tok == token.RBRACE || tok == token.EOF) } // no comment was written - we should never reach here since // intersperseComments should not be called in that case p.internalError("intersperseComments called without pending comments") return false }
func tokenclass(tok token.Token) int { switch { case tok.IsLiteral(): return literal case tok.IsOperator(): return operator case tok.IsKeyword(): return keyword } return special }
// TokenKind returns a syntaxhighlight token kind value for the given tok and lit. func TokenKind(tok token.Token, lit string) syntaxhighlight.Kind { switch { case tok.IsKeyword() || (tok.IsOperator() && tok <= token.ELLIPSIS): return syntaxhighlight.Keyword // Literals. case tok == token.INT || tok == token.FLOAT || tok == token.IMAG || tok == token.CHAR: return syntaxhighlight.Decimal case tok == token.STRING: return syntaxhighlight.String case lit == "true" || lit == "false" || lit == "iota" || lit == "nil": return syntaxhighlight.Literal case tok == token.COMMENT: return syntaxhighlight.Comment default: return syntaxhighlight.Plaintext } }
// getClass returns the CSS class name associated with tok. func (h *Highlighter) getClass(tok token.Token) string { switch { case tok.IsKeyword(): return h.KeywordClass case tok.IsLiteral(): if tok == token.IDENT { return h.IdentClass } else { return h.LiteralClass } case tok.IsOperator(): return h.OperatorClass case tok == token.COMMENT: return h.CommentClass case tok == token.ILLEGAL: break default: panic(fmt.Sprintf("unknown token type: %v", tok)) } return "" }
func getColor(tok token.Token) string { switch { case tok.IsKeyword(): return Colors[Keyword] case tok.IsLiteral(): if tok == token.IDENT { return Colors[Identifier] } else { return Colors[Literal] } case tok.IsOperator(): return Colors[Operator] case tok == token.COMMENT: return Colors[Comment] case tok == token.ILLEGAL: return Colors[Illegal] default: panic(fmt.Sprintf("unknown token type: %v", tok)) } return "" }
func (self *HTMLStyler) Token(tok token.Token) ([]byte, printer.HTMLTag) { extra := "" if tok.IsKeyword() { extra += " go-keyword" } if tok.IsLiteral() { extra += " go-literal" } if tok.IsOperator() { extra += " go-operator" } self.prev = tok return []byte(tok.String()), printer.HTMLTag{ Start: "<span class=\"go-token" + extra + "\">", End: "</span>", } }