go/types, types2: align trace output a bit better for easier debugging

Compute alignment padding rather than using a tab in trace output.
This aligns the ":" after the file position in typical cases (files
shorter than 1000 lines, lines shorter than 100 columns), resulting
in nicer trace output for easier debugging.

Before this CL (example trace):

x.go:8:2:  -- checking type A (white, objPath = )
x.go:8:11:  .  -- type B
x.go:9:2:  .  .  -- checking type B (white, objPath = A)
x.go:9:14:  .  .  .  -- type C[D]
x.go:9:13:  .  .  .  .  -- instantiating type C with [D]
x.go:9:13:  .  .  .  .  .  -- type C
x.go:10:2:  .  .  .  .  .  .  -- checking type C (white, objPath = A->B)
x.go:10:6:  .  .  .  .  .  .  .  -- type any
x.go:10:6:  .  .  .  .  .  .  .  => any (under = any) // *Alias
x.go:10:11:  .  .  .  .  .  .  .  -- type struct{}
x.go:10:11:  .  .  .  .  .  .  .  => struct{} // *Struct
x.go:10:2:  .  .  .  .  .  .  => type C[_ any] struct{} (black)

With this CL:

x.go:8:2   :  -- checking type A (white, objPath = )
x.go:8:11  :  .  -- type B
x.go:9:2   :  .  .  -- checking type B (white, objPath = A)
x.go:9:14  :  .  .  .  -- type C[D]
x.go:9:13  :  .  .  .  .  -- instantiating type C with [D]
x.go:9:13  :  .  .  .  .  .  -- type C
x.go:10:2  :  .  .  .  .  .  .  -- checking type C (white, objPath = A->B)
x.go:10:6  :  .  .  .  .  .  .  .  -- type any
x.go:10:6  :  .  .  .  .  .  .  .  => any (under = any) // *Alias
x.go:10:11 :  .  .  .  .  .  .  .  -- type struct{}
x.go:10:11 :  .  .  .  .  .  .  .  => struct{} // *Struct
x.go:10:2  :  .  .  .  .  .  .  => type C[_ any] struct{} (black)

Change-Id: Ibcf346737f57ec5351d1e1e65178e2c3c155d766
Reviewed-on: https://go-review.googlesource.com/c/go/+/659755
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Robert Griesemer 2025-03-20 16:12:15 -07:00 committed by Gopher Robot
parent b70244ff7a
commit 3ada42ffed
2 changed files with 43 additions and 3 deletions

View File

@ -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...))

View File

@ -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...))