From 060669a68938a450235ca3c721e4095c9f320503 Mon Sep 17 00:00:00 2001 From: Ivan Trubach Date: Mon, 2 Sep 2019 13:57:09 +0000 Subject: [PATCH] cmd/doc: make -src mode deterministic MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit These changes make cmd/doc -src deterministic, or, more precisely, go/ast.MergePackageFiles, which is used by cmd/doc. So far the order of comments depended on the package file map iteration order. cmd/doc with -src flag has been inserting and omitting random comments ever since the addition of -src flag. After investigating the code path with the debugger, I’ve noticed that ast.File.Comments slice order changes between invocations of the command. The bug was introduced in 3e24f2d, which ironically claimed to “fix formatting of -src output”. The commit implemented the collection of comments by iterating over the map and c7cdce1 “godoc: make ?m=src mode deterministic” did’t actually make go/ast.MergePackageFiles deterministic. I’ve found this issue after running “go doc -src sync.WaitGroup.Wait”. There are likely other packages and functions affected, but the bug should be somewhat reproducible across all Go versions. Change-Id: Iae223e99550c0a3b54005c5cde36f909e655b66b GitHub-Last-Rev: c49532f79fcd7529d7ad1a369c467abc59d4df0a GitHub-Pull-Request: golang/go#33553 Reviewed-on: https://go-review.googlesource.com/c/go/+/189477 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/ast/filter.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/go/ast/filter.go b/src/go/ast/filter.go index 32352cb92c..c398e6e603 100644 --- a/src/go/ast/filter.go +++ b/src/go/ast/filter.go @@ -474,7 +474,9 @@ func MergePackageFiles(pkg *Package, mode MergeMode) *File { } } } else { - for _, f := range pkg.Files { + // Iterate over filenames for deterministic order. + for _, filename := range filenames { + f := pkg.Files[filename] imports = append(imports, f.Imports...) } } @@ -484,7 +486,8 @@ func MergePackageFiles(pkg *Package, mode MergeMode) *File { if mode&FilterUnassociatedComments == 0 { comments = make([]*CommentGroup, ncomments) i := 0 - for _, f := range pkg.Files { + for _, filename := range filenames { + f := pkg.Files[filename] i += copy(comments[i:], f.Comments) } } -- 2.50.0