From c116265eb3f2b1a8549e7ceef73b780439404030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 20 Jul 2018 21:55:07 +0100 Subject: [PATCH] go/printer: make empty lines break table alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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í TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/printer/nodes.go | 17 +++++++++++++---- src/go/printer/testdata/alignment.golden | 9 +++++++++ src/go/printer/testdata/alignment.input | 9 +++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/go/printer/nodes.go b/src/go/printer/nodes.go index 18f2371d24..3723f30e56 100644 --- a/src/go/printer/nodes.go +++ b/src/go/printer/nodes.go @@ -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 diff --git a/src/go/printer/testdata/alignment.golden b/src/go/printer/testdata/alignment.golden index c65defe6ae..302b32e766 100644 --- a/src/go/printer/testdata/alignment.golden +++ b/src/go/printer/testdata/alignment.golden @@ -128,3 +128,12 @@ func main() { abcdefghijklmnopqrstuvwxyz: "foo", } } + +// ---------------------------------------------------------------------------- +// Examples from issue #26352. +var _ = map[int]string{ + 1: "", + + 12345678901234567890123456789: "", + 12345678901234567890123456789012345678: "", +} diff --git a/src/go/printer/testdata/alignment.input b/src/go/printer/testdata/alignment.input index 9b0aae6bec..83361cc7c1 100644 --- a/src/go/printer/testdata/alignment.input +++ b/src/go/printer/testdata/alignment.input @@ -128,3 +128,12 @@ func main() { abcdefghijklmnopqrstuvwxyz: "foo", } } + +// ---------------------------------------------------------------------------- +// Examples from issue #26352. +var _ = map[int]string{ + 1: "", + + 12345678901234567890123456789: "", + 12345678901234567890123456789012345678: "", +}