From 3bacb5166272e7458bc4dfed680f3862a769ff93 Mon Sep 17 00:00:00 2001 From: luoliwoshang <2643523683@qq.com> Date: Fri, 19 Apr 2024 17:18:55 +0800 Subject: [PATCH] update:define FuncId by RenderOption --- internal/godoc/dochtml/dochtml.go | 31 +++++++++++++------------- internal/godoc/dochtml/dochtml_test.go | 9 ++++---- internal/godoc/render.go | 3 ++- internal/gopdoc/z_transform.go | 15 +++++++++++-- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/internal/godoc/dochtml/dochtml.go b/internal/godoc/dochtml/dochtml.go index 0717cb04..5f2ea0ed 100644 --- a/internal/godoc/dochtml/dochtml.go +++ b/internal/godoc/dochtml/dochtml.go @@ -29,7 +29,6 @@ import ( "golang.org/x/pkgsite/internal" "golang.org/x/pkgsite/internal/derrors" "golang.org/x/pkgsite/internal/godoc/dochtml/internal/render" - "golang.org/x/pkgsite/internal/gopdoc" "golang.org/x/text/cases" "golang.org/x/text/language" ) @@ -60,6 +59,7 @@ type RenderOptions struct { FileLinkFunc func(file string) (url string) SourceLinkFunc func(ast.Node) string SinceVersionFunc func(name string) string + FuncIdFunc func(fn *doc.Func, fullName string) (id string) // ModInfo optionally specifies information about the module the package // belongs to in order to render module-related documentation. ModInfo *ModuleInfo @@ -89,7 +89,7 @@ type Parts struct { // // If any of the rendered documentation part HTML sizes exceeds the specified limit, // an error with ErrTooLarge in its chain will be returned. -func Render(ctx context.Context, fset *token.FileSet, p *doc.Package, opt RenderOptions, info *gopdoc.GopInfo) (_ *Parts, err error) { +func Render(ctx context.Context, fset *token.FileSet, p *doc.Package, opt RenderOptions) (_ *Parts, err error) { defer derrors.Wrap(&err, "dochtml.RenderParts") if opt.Limit == 0 { @@ -97,7 +97,7 @@ func Render(ctx context.Context, fset *token.FileSet, p *doc.Package, opt Render opt.Limit = 10 * megabyte } - funcs, data, links := renderInfo(ctx, fset, p, opt, info) + funcs, data, links := renderInfo(ctx, fset, p, opt) p = data.Package if docIsEmpty(p) { return &Parts{}, nil @@ -145,12 +145,13 @@ type item struct { FuncId string // for functions and methods } -func packageToItems(p *doc.Package, exmap map[string][]*example, info *gopdoc.GopInfo) (consts, vars, funcs, types []*item) { +func packageToItems(p *doc.Package, exmap map[string][]*example, opt RenderOptions) (consts, vars, funcs, types []*item) { + consts = valuesToItems(p.Consts) vars = valuesToItems(p.Vars) - funcs = funcsToItems(p.Funcs, "Documentation-functionHeader", "", exmap, info) + funcs = funcsToItems(p.Funcs, "Documentation-functionHeader", "", exmap, opt) for _, t := range p.Types { - types = append(types, typeToItem(t, exmap, info)) + types = append(types, typeToItem(t, exmap, opt)) } return consts, vars, funcs, types } @@ -171,7 +172,7 @@ func valueToItem(v *doc.Value) *item { } } -func funcsToItems(fs []*doc.Func, hclass, typeName string, exmap map[string][]*example, info *gopdoc.GopInfo) []*item { +func funcsToItems(fs []*doc.Func, hclass, typeName string, exmap map[string][]*example, opt RenderOptions) []*item { var r []*item for _, f := range fs { fullName := f.Name @@ -185,10 +186,8 @@ func funcsToItems(fs []*doc.Func, hclass, typeName string, exmap map[string][]*e headerStart += " (" + f.Recv + ")" } funcId := fullName - if info != nil { - if overloadOrder, ok := info.OverloadFuncsOrder[f]; ok && overloadOrder > 0 { - funcId = fmt.Sprintf("%s__%d", fullName, overloadOrder) - } + if opt.FuncIdFunc != nil { + funcId = opt.FuncIdFunc(f, fullName) } i := &item{ Doc: f.Doc, @@ -207,7 +206,7 @@ func funcsToItems(fs []*doc.Func, hclass, typeName string, exmap map[string][]*e return r } -func typeToItem(t *doc.Type, exmap map[string][]*example, info *gopdoc.GopInfo) *item { +func typeToItem(t *doc.Type, exmap map[string][]*example, opt RenderOptions) *item { return &item{ Name: t.Name, FullName: t.Name, @@ -220,8 +219,8 @@ func typeToItem(t *doc.Type, exmap map[string][]*example, info *gopdoc.GopInfo) Examples: exmap[t.Name], Consts: valuesToItems(t.Consts), Vars: valuesToItems(t.Vars), - Funcs: funcsToItems(t.Funcs, "Documentation-typeFuncHeader", "", exmap, info), - Methods: funcsToItems(t.Methods, "Documentation-typeMethodHeader", t.Name, exmap, info), + Funcs: funcsToItems(t.Funcs, "Documentation-typeFuncHeader", "", exmap, opt), + Methods: funcsToItems(t.Methods, "Documentation-typeMethodHeader", t.Name, exmap, opt), } } @@ -235,7 +234,7 @@ func docIsEmpty(p *doc.Package) bool { } // renderInfo returns the functions and data needed to render the doc. -func renderInfo(ctx context.Context, fset *token.FileSet, p *doc.Package, opt RenderOptions, info *gopdoc.GopInfo) (map[string]any, TemplateData, func() []render.Link) { +func renderInfo(ctx context.Context, fset *token.FileSet, p *doc.Package, opt RenderOptions) (map[string]any, TemplateData, func() []render.Link) { // Make a copy to avoid modifying caller's *doc.Package. p2 := *p p = &p2 @@ -303,7 +302,7 @@ func renderInfo(ctx context.Context, fset *token.FileSet, p *doc.Package, opt Re Examples: examples, NoteHeaders: buildNoteHeaders(p.Notes), } - data.Consts, data.Vars, data.Funcs, data.Types = packageToItems(p, examples.Map, info) + data.Consts, data.Vars, data.Funcs, data.Types = packageToItems(p, examples.Map, opt) return funcs, data, r.Links } diff --git a/internal/godoc/dochtml/dochtml_test.go b/internal/godoc/dochtml/dochtml_test.go index 042adac0..3ec5c341 100644 --- a/internal/godoc/dochtml/dochtml_test.go +++ b/internal/godoc/dochtml/dochtml_test.go @@ -50,7 +50,7 @@ func TestRender(t *testing.T) { for _, pkg := range []string{"everydecl", "comments"} { t.Run(pkg, func(t *testing.T) { fset, d := mustLoadPackage(pkg) - parts, err := Render(ctx, fset, d, testRenderOptions, nil) + parts, err := Render(ctx, fset, d, testRenderOptions) if err != nil { t.Fatal(err) } @@ -84,7 +84,7 @@ func TestRender(t *testing.T) { func TestRenderDeprecated(t *testing.T) { t.Helper() fset, d := mustLoadPackage("deprecated") - parts, err := Render(context.Background(), fset, d, testRenderOptions, nil) + parts, err := Render(context.Background(), fset, d, testRenderOptions) if err != nil { t.Fatal(err) } @@ -96,7 +96,8 @@ func TestRenderOverload(t *testing.T) { LoadTemplates(templateFS) fset, d := mustLoadPackage("overload") doc, gopinfo := gopdoc.Transform(d) - parts, err := Render(context.Background(), fset, doc, testRenderOptions, gopinfo) + testRenderOptions.FuncIdFunc = gopinfo.FuncId + parts, err := Render(context.Background(), fset, doc, testRenderOptions) if err != nil { t.Fatal(err) } @@ -123,7 +124,7 @@ func TestExampleRender(t *testing.T) { ctx := context.Background() fset, d := mustLoadPackage("example_test") - parts, err := Render(ctx, fset, d, testRenderOptions, nil) + parts, err := Render(ctx, fset, d, testRenderOptions) if err != nil { t.Fatal(err) } diff --git a/internal/godoc/render.go b/internal/godoc/render.go index f092a100..41d9e19c 100644 --- a/internal/godoc/render.go +++ b/internal/godoc/render.go @@ -232,7 +232,8 @@ func (p *Package) Render(ctx context.Context, innerPath string, } opts := p.renderOptions(innerPath, sourceInfo, modInfo, nameToVersion, bc) - parts, err := dochtml.Render(ctx, p.Fset, d, opts, info) + opts.FuncIdFunc = info.FuncId + parts, err := dochtml.Render(ctx, p.Fset, d, opts) if errors.Is(err, ErrTooLarge) { return &dochtml.Parts{Body: template.MustParseAndExecuteToHTML(DocTooLargeReplacement)}, nil } diff --git a/internal/gopdoc/z_transform.go b/internal/gopdoc/z_transform.go index 38977613..a92e4edd 100644 --- a/internal/gopdoc/z_transform.go +++ b/internal/gopdoc/z_transform.go @@ -17,6 +17,7 @@ package gopdoc import ( + "fmt" "go/ast" "go/doc" "go/token" @@ -48,7 +49,17 @@ type transformCtx struct { } type GopInfo struct { - OverloadFuncsOrder map[*doc.Func]int + overloadFuncsOrder map[*doc.Func]int +} + +func (g *GopInfo) FuncId(fn *doc.Func, fullName string) string { + if g == nil || g.overloadFuncsOrder == nil { + return fullName + } + if overloadOrder, ok := g.overloadFuncsOrder[fn]; ok && overloadOrder > 0 { + return fmt.Sprintf("%s__%d", fullName, overloadOrder) + } + return fullName } func (p *transformCtx) finish(in *doc.Package) { @@ -259,7 +270,7 @@ func Transform(in *doc.Package) (*doc.Package, *GopInfo) { transformTypes(ctx, in.Types) ctx.finish(in) return in, &GopInfo{ - OverloadFuncsOrder: ctx.orders, + overloadFuncsOrder: ctx.orders, } } /* else if in.ImportPath == "builtin" { transformBuiltin(in)