diff --git a/godoc/godoc.go b/godoc/godoc.go index f191a9d989a..0acb49bf75b 100644 --- a/godoc/godoc.go +++ b/godoc/godoc.go @@ -666,6 +666,7 @@ func (p *Presentation) example_htmlFunc(info *PageInfo, funcName string) string play := "" if eg.Play != nil && p.ShowPlayground { var buf bytes.Buffer + eg.Play.Comments = filterOutBuildAnnotations(eg.Play.Comments) if err := format.Node(&buf, info.FSet, eg.Play); err != nil { log.Print(err) } else { @@ -694,6 +695,23 @@ func (p *Presentation) example_htmlFunc(info *PageInfo, funcName string) string return buf.String() } +func filterOutBuildAnnotations(cg []*ast.CommentGroup) []*ast.CommentGroup { + if len(cg) == 0 { + return cg + } + + for i := range cg { + if !strings.HasPrefix(cg[i].Text(), "+build ") { + // Found the first non-build tag, return from here until the end + // of the slice. + return cg[i:] + } + } + + // There weren't any non-build tags, return an empty slice. + return []*ast.CommentGroup{} +} + // example_nameFunc takes an example function name and returns its display // name. For example, "Foo_Bar_quux" becomes "Foo.Bar (Quux)". func (p *Presentation) example_nameFunc(s string) string { diff --git a/godoc/godoc_test.go b/godoc/godoc_test.go index c1d631c157f..33dbe3f619b 100644 --- a/godoc/godoc_test.go +++ b/godoc/godoc_test.go @@ -321,3 +321,50 @@ func TestSrcToPkgLinkFunc(t *testing.T) { } } } + +func TestFilterOutBuildAnnotations(t *testing.T) { + // TODO: simplify this by using a multiline string once we stop + // using go vet from 1.10 on the build dashboard. + // https://golang.org/issue/26627 + src := []byte("// +build !foo\n" + + "// +build !anothertag\n" + + "\n" + + "// non-tag comment\n" + + "\n" + + "package foo\n" + + "\n" + + "func bar() int {\n" + + " return 42\n" + + "}\n") + + fset := token.NewFileSet() + af, err := parser.ParseFile(fset, "foo.go", src, parser.ParseComments) + if err != nil { + t.Fatal(err) + } + + var found bool + for _, cg := range af.Comments { + if strings.HasPrefix(cg.Text(), "+build ") { + found = true + break + } + } + if !found { + t.Errorf("TestFilterOutBuildAnnotations is broken: missing build tag in test input") + } + + found = false + for _, cg := range filterOutBuildAnnotations(af.Comments) { + if strings.HasPrefix(cg.Text(), "+build ") { + t.Errorf("filterOutBuildAnnotations failed to filter build tag") + } + + if strings.Contains(cg.Text(), "non-tag comment") { + found = true + } + } + if !found { + t.Errorf("filterOutBuildAnnotations should not remove non-build tag comment") + } +}