diff --git a/src/cmd/compile/internal/types2/format.go b/src/cmd/compile/internal/types2/format.go index 442d219d1a..b61dfda1c8 100644 --- a/src/cmd/compile/internal/types2/format.go +++ b/src/cmd/compile/internal/types2/format.go @@ -88,13 +88,32 @@ func (check *Checker) sprintf(format string, args ...any) string { } 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...)) diff --git a/src/go/types/format.go b/src/go/types/format.go index 09e599c3c3..550d22f5ae 100644 --- a/src/go/types/format.go +++ b/src/go/types/format.go @@ -88,13 +88,34 @@ func (check *Checker) sprintf(format string, args ...any) string { } 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...))