Skip to content

Commit

Permalink
go/printer: make empty lines break table alignment
Browse files Browse the repository at this point in the history
In previous versions of Go including 1.10, an empty line would break the
alignment of elements within an expression list.

golang.org/cl/104755 changed the heuristic, with the side effect that
empty lines no longer broke the table alignment.

Reintroduce the behavior and add a regression test for it.

Fixes #26352.

Change-Id: I410bcff4cba25c7f8497d46bd7890a2c7ee11d46
Reviewed-on: https://go-review.googlesource.com/125260
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
  • Loading branch information
mvdan authored and griesemer committed Aug 9, 2018
1 parent 666de6c commit c116265
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 4 deletions.
17 changes: 13 additions & 4 deletions src/go/printer/nodes.go
Expand Up @@ -221,13 +221,22 @@ func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exp
// If the previous line and the current line had single-
// line-expressions and the key sizes are small or the
// ratio between the current key and the geometric mean
// if the previous key sizes does not exceed a threshold,
// align columns and do not use formfeed.
// does not exceed a threshold, align columns and do not use
// formfeed.
// If the previous line was an empty line, break the alignment.
// (The text/tabwriter will break alignment after an empty line
// even if we don't do anything here, but we can't see that; yet
// we need to reset the variables used in the geomean
// computation after an alignment break. Do it explicitly
// instead so we're aware of the break. Was issue #26352.)
if prevSize > 0 && size > 0 {
const smallSize = 40
if count == 0 || prevSize <= smallSize && size <= smallSize {
switch {
case prevLine+1 < line:
useFF = true
case count == 0, prevSize <= smallSize && size <= smallSize:
useFF = false
} else {
default:
const r = 2.5 // threshold
geomean := math.Exp(lnsum / float64(count)) // count > 0
ratio := float64(size) / geomean
Expand Down
9 changes: 9 additions & 0 deletions src/go/printer/testdata/alignment.golden
Expand Up @@ -128,3 +128,12 @@ func main() {
abcdefghijklmnopqrstuvwxyz: "foo",
}
}

// ----------------------------------------------------------------------------
// Examples from issue #26352.
var _ = map[int]string{
1: "",

12345678901234567890123456789: "",
12345678901234567890123456789012345678: "",
}
9 changes: 9 additions & 0 deletions src/go/printer/testdata/alignment.input
Expand Up @@ -128,3 +128,12 @@ func main() {
abcdefghijklmnopqrstuvwxyz: "foo",
}
}

// ----------------------------------------------------------------------------
// Examples from issue #26352.
var _ = map[int]string{
1: "",

12345678901234567890123456789: "",
12345678901234567890123456789012345678: "",
}

0 comments on commit c116265

Please sign in to comment.