]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/doc: don't print a declaration twice
authorRob Pike <r@golang.org>
Mon, 20 Nov 2017 03:12:43 +0000 (14:12 +1100)
committerRob Pike <r@golang.org>
Mon, 20 Nov 2017 05:08:37 +0000 (05:08 +0000)
That can occur if we have -u set and there is an upper- and lower-case
name of the same spelling in a single declaration.

A rare corner case but easy to fix.

Fix by remembering what we've printed.

Fixes #21797.

Change-Id: Ie0b681ae8c277fa16e9635ba594c1dff272b8aeb
Reviewed-on: https://go-review.googlesource.com/78715
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/doc/doc_test.go
src/cmd/doc/pkg.go
src/cmd/doc/testdata/pkg.go

index 0df53a3630350e38eb3983c543adb67884c9a8de..ee7c430cbd9a60e87721f5c30f5c2a897e38f5da 100644 (file)
@@ -445,6 +445,19 @@ var tests = []test{
                        `CaseMatch`,
                },
        },
+
+       // No dups with -u. Issue 21797.
+       {
+               "case matching on, no dups",
+               []string{"-u", p, `duplicate`},
+               []string{
+                       `Duplicate`,
+                       `duplicate`,
+               },
+               []string{
+                       "\\)\n+const", // This will appear if the const decl appears twice.
+               },
+       },
 }
 
 func TestDoc(t *testing.T) {
index 5a14d6e7cf5e4b3f767389344433731fe3af37ba..99a00c563260ea1e6671ad17d0fc6e391a9be59c 100644 (file)
@@ -594,6 +594,11 @@ func (pkg *Package) symbolDoc(symbol string) bool {
        // Constants and variables behave the same.
        values := pkg.findValues(symbol, pkg.doc.Consts)
        values = append(values, pkg.findValues(symbol, pkg.doc.Vars)...)
+       // A declaration like
+       //      const ( c = 1; C = 2 )
+       // could be printed twice if the -u flag is set, as it matches twice.
+       // So we remember which declarations we've printed to avoid duplication.
+       printed := make(map[*ast.GenDecl]bool)
        for _, value := range values {
                // Print each spec only if there is at least one exported symbol in it.
                // (See issue 11008.)
@@ -628,7 +633,7 @@ func (pkg *Package) symbolDoc(symbol string) bool {
                                }
                        }
                }
-               if len(specs) == 0 {
+               if len(specs) == 0 || printed[value.Decl] {
                        continue
                }
                value.Decl.Specs = specs
@@ -636,6 +641,7 @@ func (pkg *Package) symbolDoc(symbol string) bool {
                        pkg.packageClause(true)
                }
                pkg.emit(value.Doc, value.Decl)
+               printed[value.Decl] = true
                found = true
        }
        // Types.
index 99755b11c56e571dd64f849a3e9260b2921598c2..d0995bbf7d2b8d812fca74813bec9cf250bd82f0 100644 (file)
@@ -193,3 +193,8 @@ var LongLine = newLongLine(
 type T2 int
 
 type T1 = T2
+
+const (
+       Duplicate = iota
+       duplicate
+)