// 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 }
func (p *printer) writeComment(comment *ast.Comment) { text := comment.Text // shortcut common case of //-style comments if text[1] == '/' { p.writeItem(p.fset.Position(comment.Pos()), p.escape(text)) return } // for /*-style comments, print line by line and let the // write function take care of the proper indentation lines := split([]byte(text)) stripCommonPrefix(lines) // write comment lines, separated by formfeed, // without a line break after the last line linebreak := formfeeds[0:1] pos := p.fset.Position(comment.Pos()) for i, line := range lines { if i > 0 { p.write(linebreak) pos = p.pos } if len(line) > 0 { p.writeItem(pos, p.escape(string(line))) } } }