Commit c116265e authored by Daniel Martí's avatar Daniel Martí Committed by Robert Griesemer

go/printer: make empty lines break table alignment

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: default avatarRobert Griesemer <gri@golang.org>
parent 666de6c9
...@@ -221,13 +221,22 @@ func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exp ...@@ -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- // If the previous line and the current line had single-
// line-expressions and the key sizes are small or the // line-expressions and the key sizes are small or the
// ratio between the current key and the geometric mean // ratio between the current key and the geometric mean
// if the previous key sizes does not exceed a threshold, // does not exceed a threshold, align columns and do not use
// align columns and do not use formfeed. // 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 { if prevSize > 0 && size > 0 {
const smallSize = 40 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 useFF = false
} else { default:
const r = 2.5 // threshold const r = 2.5 // threshold
geomean := math.Exp(lnsum / float64(count)) // count > 0 geomean := math.Exp(lnsum / float64(count)) // count > 0
ratio := float64(size) / geomean ratio := float64(size) / geomean
......
...@@ -128,3 +128,12 @@ func main() { ...@@ -128,3 +128,12 @@ func main() {
abcdefghijklmnopqrstuvwxyz: "foo", abcdefghijklmnopqrstuvwxyz: "foo",
} }
} }
// ----------------------------------------------------------------------------
// Examples from issue #26352.
var _ = map[int]string{
1: "",
12345678901234567890123456789: "",
12345678901234567890123456789012345678: "",
}
...@@ -128,3 +128,12 @@ func main() { ...@@ -128,3 +128,12 @@ func main() {
abcdefghijklmnopqrstuvwxyz: "foo", abcdefghijklmnopqrstuvwxyz: "foo",
} }
} }
// ----------------------------------------------------------------------------
// Examples from issue #26352.
var _ = map[int]string{
1: "",
12345678901234567890123456789: "",
12345678901234567890123456789012345678: "",
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment