66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package tygoja
|
|
|
|
import (
|
|
"go/ast"
|
|
"strings"
|
|
)
|
|
|
|
func (g *PackageGenerator) writeCommentGroup(s *strings.Builder, f *ast.CommentGroup, depth int) {
|
|
if f == nil {
|
|
return
|
|
}
|
|
|
|
docLines := strings.Split(f.Text(), "\n")
|
|
|
|
g.writeIndent(s, depth)
|
|
s.WriteString("/**\n")
|
|
|
|
lastLineIdx := len(docLines) - 1
|
|
|
|
var isCodeBlock bool
|
|
|
|
emptySB := new(strings.Builder)
|
|
|
|
for i, c := range docLines {
|
|
isEndLine := i == lastLineIdx
|
|
isEmpty := len(strings.TrimSpace(c)) == 0
|
|
isIndented := strings.HasPrefix(c, "\t") || strings.HasPrefix(c, " ")
|
|
|
|
// end code block
|
|
if isCodeBlock && (isEndLine || (!isIndented && !isEmpty)) {
|
|
g.writeIndent(s, depth)
|
|
s.WriteString(" * ```\n")
|
|
isCodeBlock = false
|
|
}
|
|
|
|
// accumulate empty comment lines
|
|
// (this is done to properly enclose code blocks with new lines)
|
|
if isEmpty {
|
|
g.writeIndent(emptySB, depth)
|
|
emptySB.WriteString(" * \n")
|
|
} else {
|
|
// write all empty lines
|
|
s.WriteString(emptySB.String())
|
|
emptySB.Reset()
|
|
}
|
|
|
|
// start code block
|
|
if isIndented && !isCodeBlock && !isEndLine {
|
|
g.writeIndent(s, depth)
|
|
s.WriteString(" * ```\n")
|
|
isCodeBlock = true
|
|
}
|
|
|
|
// write comment line
|
|
if !isEmpty {
|
|
g.writeIndent(s, depth)
|
|
s.WriteString(" * ")
|
|
c = strings.ReplaceAll(c, "*/", "*\\/") // An edge case: a // comment can contain */
|
|
s.WriteString(c)
|
|
s.WriteByte('\n')
|
|
}
|
|
}
|
|
|
|
g.writeIndent(s, depth)
|
|
s.WriteString(" */\n")
|
|
}
|