in format.go [556:612]
func (un *formatter) visitConst(expr ast.Expr) error {
val := expr.AsLiteral()
switch val := val.(type) {
case types.Bool:
un.WriteString(strconv.FormatBool(bool(val)))
case types.Bytes:
// try to handle literal byte strings.
if un.options.pretty && !bytes.ContainsFunc([]byte(val), func(r rune) bool {
return !unicode.IsGraphic(r) && !unicode.IsSpace(r)
}) {
syn := un.syntax(expr.ID())
if strings.EqualFold(syn, "b'''") || strings.EqualFold(syn, `b"""`) ||
strings.EqualFold(syn, "br'''") || strings.EqualFold(syn, `br"""`) {
un.WriteString(syn)
un.WriteString(string(val))
un.WriteString(strings.TrimLeft(syn, "bBrR"))
break
}
}
// otherwise bytes constants are surrounded with b"<bytes>"
un.WriteString(`b"`)
un.WriteString(bytesToOctets([]byte(val)))
un.WriteString(`"`)
case types.Double:
// represent the float using the minimum required digits
d := strconv.FormatFloat(float64(val), 'g', -1, 64)
un.WriteString(d)
if !strings.Contains(d, ".") {
un.WriteString(".0")
}
case types.Int:
i := strconv.FormatInt(int64(val), 10)
un.WriteString(i)
case types.Null:
un.WriteString("null")
case types.String:
syn := un.syntax(expr.ID())
if un.options.pretty && syn == "'''" || syn == `"""` ||
strings.EqualFold(syn, "r'''") || strings.EqualFold(syn, `r"""`) {
// handle literal strings.
un.WriteString(syn)
un.WriteString(string(val))
un.WriteString(strings.TrimLeft(syn, "rR"))
} else {
// otherwise strings will be double quoted with quotes escaped.
un.WriteString(strconv.Quote(string(val)))
}
case types.Uint:
// uint literals have a 'u' suffix.
ui := strconv.FormatUint(uint64(val), 10)
un.WriteString(ui)
un.WriteString("u")
default:
return fmt.Errorf("unsupported constant: %v", expr)
}
return nil
}