}
func (check *Checker) trace(pos syntax.Pos, format string, args ...any) {
- fmt.Printf("%s:\t%s%s\n",
+ // Use the width of line and pos values to align the ":" by adding padding before it.
+ // Cap padding at 5: 3 digits for the line, 2 digits for the column number, which is
+ // ok for most cases.
+ w := ndigits(pos.Line()) + ndigits(pos.Col())
+ pad := " "[:max(5-w, 0)]
+ fmt.Printf("%s%s: %s%s\n",
pos,
+ pad,
strings.Repeat(". ", check.indent),
sprintf(check.qualifier, true, format, args...),
)
}
+// ndigits returns the number of decimal digits in x.
+// For x > 100, the result is always 3.
+func ndigits(x uint) int {
+ switch {
+ case x < 10:
+ return 1
+ case x < 100:
+ return 2
+ default:
+ return 3
+ }
+}
+
// dump is only needed for debugging
func (check *Checker) dump(format string, args ...any) {
fmt.Println(sprintf(check.qualifier, true, format, args...))
}
func (check *Checker) trace(pos token.Pos, format string, args ...any) {
- fmt.Printf("%s:\t%s%s\n",
- check.fset.Position(pos),
+ pos1 := check.fset.Position(pos)
+ // Use the width of line and pos values to align the ":" by adding padding before it.
+ // Cap padding at 5: 3 digits for the line, 2 digits for the column number, which is
+ // ok for most cases.
+ w := ndigits(pos1.Line) + ndigits(pos1.Column)
+ pad := " "[:max(5-w, 0)]
+ fmt.Printf("%s%s: %s%s\n",
+ pos1,
+ pad,
strings.Repeat(". ", check.indent),
sprintf(check.fset, check.qualifier, true, format, args...),
)
}
+// ndigits returns the number of decimal digits in x.
+// For x < 10, the result is always 1.
+// For x > 100, the result is always 3.
+func ndigits(x int) int {
+ switch {
+ case x < 10:
+ return 1
+ case x < 100:
+ return 2
+ default:
+ return 3
+ }
+}
+
// dump is only needed for debugging
func (check *Checker) dump(format string, args ...any) {
fmt.Println(sprintf(check.fset, check.qualifier, true, format, args...))