1
0
mirror of https://github.com/golang/go synced 2024-11-22 05:44:41 -07:00

go/printer: revert "do not treat comments inside a ast.Decl as godoc"

This reverts commit CL 609077.

Reason for revert: it turned out to also introduce a change to the
formatting as described in issue #69382, which wasn't intended.

For #69382.

Change-Id: Id8f36e5503e63e7586c8afe7c7d3dc25fd56ed94
Reviewed-on: https://go-review.googlesource.com/c/go/+/612137
Reviewed-by: Christian Höppner <hoeppi@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
Dmitri Shuralyov 2024-09-10 17:51:53 +00:00 committed by Christian Höppner
parent 90391c2e8a
commit ad6ee21bbf
3 changed files with 2 additions and 201 deletions

View File

@ -1737,9 +1737,6 @@ func (p *printer) genDecl(d *ast.GenDecl) {
p.setPos(d.Pos()) p.setPos(d.Pos())
p.print(d.Tok, blank) p.print(d.Tok, blank)
defer func(d bool) { p.inDecl = d }(p.inDecl)
p.inDecl = true
if d.Lparen.IsValid() || len(d.Specs) != 1 { if d.Lparen.IsValid() || len(d.Specs) != 1 {
// group of parenthesized declarations // group of parenthesized declarations
p.setPos(d.Lparen) p.setPos(d.Lparen)
@ -1924,10 +1921,6 @@ func (p *printer) funcDecl(d *ast.FuncDecl) {
p.setComment(d.Doc) p.setComment(d.Doc)
p.setPos(d.Pos()) p.setPos(d.Pos())
p.print(token.FUNC, blank) p.print(token.FUNC, blank)
defer func(d bool) { p.inDecl = d }(p.inDecl)
p.inDecl = true
// We have to save startCol only after emitting FUNC; otherwise it can be on a // We have to save startCol only after emitting FUNC; otherwise it can be on a
// different line (all whitespace preceding the FUNC is emitted only when the // different line (all whitespace preceding the FUNC is emitted only when the
// FUNC is emitted). // FUNC is emitted).

View File

@ -63,7 +63,6 @@ type printer struct {
mode pmode // current printer mode mode pmode // current printer mode
endAlignment bool // if set, terminate alignment immediately endAlignment bool // if set, terminate alignment immediately
impliedSemi bool // if set, a linebreak implies a semicolon impliedSemi bool // if set, a linebreak implies a semicolon
inDecl bool // if set, printer is inside declaration (after first token)
lastTok token.Token // last token printed (token.ILLEGAL if it's whitespace) lastTok token.Token // last token printed (token.ILLEGAL if it's whitespace)
prevOpen token.Token // previous non-brace "open" token (, [, or token.ILLEGAL prevOpen token.Token // previous non-brace "open" token (, [, or token.ILLEGAL
wsbuf []whiteSpace // delayed white space wsbuf []whiteSpace // delayed white space
@ -740,9 +739,8 @@ func (p *printer) intersperseComments(next token.Position, tok token.Token) (wro
for p.commentBefore(next) { for p.commentBefore(next) {
list := p.comment.List list := p.comment.List
changed := false changed := false
if !p.inDecl && if p.lastTok != token.IMPORT && // do not rewrite cgo's import "C" comments
p.lastTok != token.IMPORT && // do not rewrite cgo's import "C" comments p.posFor(p.comment.Pos()).Column == 1 &&
p.posFor(p.comment.Pos()).Line != p.last.Line &&
p.posFor(p.comment.End()+1) == next { p.posFor(p.comment.End()+1) == next {
// Unindented comment abutting next token position: // Unindented comment abutting next token position:
// a top-level doc comment. // a top-level doc comment.

View File

@ -16,7 +16,6 @@ import (
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"testing" "testing"
"time" "time"
) )
@ -864,192 +863,3 @@ func TestEmptyDecl(t *testing.T) { // issue 63566
} }
} }
} }
func TestDocFormat(t *testing.T) {
cases := []struct {
src string
want string
}{
{
src: `package main
func main() {
//
//go:directive
// test
//
}
`,
want: `package main
func main() {
//
//go:directive
// test
//
}
`,
},
{
src: `package main
func main() {
//go:directive
// test
type a struct{}
//go:directive
// test
test()
}
`,
want: `package main
func main() {
//go:directive
// test
type a struct{}
//go:directive
// test
test()
}
`,
},
{
src: `package main
func main() {
//go:directive
// test
type a struct{}
}
`,
want: `package main
func main() {
//go:directive
// test
type a struct{}
}
`,
},
{
src: `package main
func a() {
//line a:5:1
//
}
`,
want: `package main
func a() {
//line a:5:1
//
}
`,
},
{
src: `package main
// test comment
//go:directive2
// test comment
func main() {
}
`,
want: `package main
// test comment
// test comment
//
//go:directive2
func main() {
}
`,
},
{
src: `package main
// test comment
//go:directive2
// test comment
func main() {
}
`,
want: `package main
// test comment
// test comment
//
//go:directive2
func main() {
}
`,
},
{
src: `package main
/* test
*/ // test comment
//go:directive2
// test comment
func main() {
}
`,
want: `package main
/* test
*/ // test comment
//go:directive2
// test comment
func main() {
}
`,
},
{
src: `package main //comment
var a int = 4 //comment
func a() {
}
`,
want: `package main //comment
var a int = 4 //comment
func a() {
}
`,
},
// Edge case found by a fuzzer, not a real-world example.
{
src: "package A\n\nimport(\"\f\"\n//\n\"\")",
want: "package A\n\nimport (\n\t\"\f\" //\n\t\"\"\n)\n",
},
{
src: "package A\n\nimport(`\f`\n//\n\"\")",
want: "package A\n\nimport (\n\t`\f` //\n\t\"\"\n)\n",
},
}
for _, tt := range cases {
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "test.go", tt.src, parser.ParseComments|parser.SkipObjectResolution)
if err != nil {
t.Fatal(err)
}
var buf strings.Builder
cfg := Config{Tabwidth: 8, Mode: UseSpaces | TabIndent}
if err := cfg.Fprint(&buf, fset, f); err != nil {
t.Fatal(err)
}
got := buf.String()
if got != tt.want {
t.Errorf("source\n%v\nformatted as:\n%v\nwant formatted as:\n%v", tt.src, got, tt.want)
}
}
}