1
0
mirror of https://github.com/golang/go synced 2024-11-26 16:57:14 -07:00

go/printer: print parenthesized declarations if len(d.Specs) > 1

Parenthesized declaration must be printed if len(d.Specs) > 1 even if d.Lparen==token.NoPos. This happens if the node tree is created programmatically. Otherwise, all but the first specifications just silently disappear from the output.

Change-Id: I17ab24bb1cd56fe1e611199698535ca60a97f5ea
GitHub-Last-Rev: 2f168dc7ad
GitHub-Pull-Request: golang/go#28533
Reviewed-on: https://go-review.googlesource.com/c/146657
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
David Tolpin 2018-11-27 00:17:32 +00:00 committed by Robert Griesemer
parent 0b79dde112
commit 7d7e839a76
2 changed files with 33 additions and 1 deletions

View File

@ -1537,7 +1537,7 @@ func (p *printer) genDecl(d *ast.GenDecl) {
p.setComment(d.Doc)
p.print(d.Pos(), d.Tok, blank)
if d.Lparen.IsValid() {
if d.Lparen.IsValid() || len(d.Specs) > 1 {
// group of parenthesized declarations
p.print(d.Lparen, token.LPAREN)
if n := len(d.Specs); n > 0 {

View File

@ -736,3 +736,35 @@ func TestIssue11151(t *testing.T) {
t.Errorf("%v\norig: %q\ngot : %q", err, src, got)
}
}
// If a declaration has multiple specifications, a parenthesized
// declaration must be printed even if Lparen is token.NoPos.
func TestParenthesizedDecl(t *testing.T) {
// a package with multiple specs in a single declaration
const src = "package p; var ( a float64; b int )"
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "", src, 0)
// print the original package
var buf bytes.Buffer
err = Fprint(&buf, fset, f)
if err != nil {
t.Fatal(err)
}
original := buf.String()
// now remove parentheses from the declaration
for i := 0; i != len(f.Decls); i++ {
f.Decls[i].(*ast.GenDecl).Lparen = token.NoPos
}
buf.Reset()
err = Fprint(&buf, fset, f)
if err != nil {
t.Fatal(err)
}
noparen := buf.String()
if noparen != original {
t.Errorf("got %q, want %q", noparen, original)
}
}