mirror of
https://github.com/golang/go.git
synced 2026-02-04 01:45:06 +03:00
go/doc: link to struct fields in the same package
This collects up any struct direct field references for linking. It does not attempt to do any validation of embedded field conflicts as in CL 510315. For #61394 Change-Id: I57dc0a0e8a71ce0bcb4e6c0963f459f76a6a6964 Reviewed-on: https://go-review.googlesource.com/c/go/+/729980 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Matloob <matloob@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Matloob <matloob@google.com>
This commit is contained in:
@@ -24,12 +24,12 @@ func TestComment(t *testing.T) {
|
||||
pkg := New(pkgs["pkgdoc"], "testdata/pkgdoc", 0)
|
||||
|
||||
var (
|
||||
input = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link. [rand.Int] and [crand.Reader] are things. [G.M1] and [G.M2] are generic methods. [I.F] is an interface method and [I.V] is a broken link.\n"
|
||||
wantHTML = `<p><a href="#T">T</a> and <a href="#U">U</a> are types, and <a href="#T.M">T.M</a> is a method, but [V] is a broken link. <a href="/math/rand#Int">rand.Int</a> and <a href="/crypto/rand#Reader">crand.Reader</a> are things. <a href="#G.M1">G.M1</a> and <a href="#G.M2">G.M2</a> are generic methods. <a href="#I.F">I.F</a> is an interface method and [I.V] is a broken link.` + "\n"
|
||||
wantOldHTML = "<p>[T] and [U] are <i>types</i>, and [T.M] is a method, but [V] is a broken link. [rand.Int] and [crand.Reader] are things. [G.M1] and [G.M2] are generic methods. [I.F] is an interface method and [I.V] is a broken link.\n"
|
||||
wantMarkdown = "[T](#T) and [U](#U) are types, and [T.M](#T.M) is a method, but \\[V] is a broken link. [rand.Int](/math/rand#Int) and [crand.Reader](/crypto/rand#Reader) are things. [G.M1](#G.M1) and [G.M2](#G.M2) are generic methods. [I.F](#I.F) is an interface method and \\[I.V] is a broken link.\n"
|
||||
wantText = "T and U are types, and T.M is a method, but [V] is a broken link. rand.Int and\ncrand.Reader are things. G.M1 and G.M2 are generic methods. I.F is an interface\nmethod and [I.V] is a broken link.\n"
|
||||
wantOldText = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link.\n[rand.Int] and [crand.Reader] are things. [G.M1] and [G.M2] are generic methods.\n[I.F] is an interface method and [I.V] is a broken link.\n"
|
||||
input = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link. [rand.Int] and [crand.Reader] are things. [G.X] is a field, [G.M1] and [G.M2] are generic methods. [I.F] is an interface method and [I.V] is a broken link.\n"
|
||||
wantHTML = `<p><a href="#T">T</a> and <a href="#U">U</a> are types, and <a href="#T.M">T.M</a> is a method, but [V] is a broken link. <a href="/math/rand#Int">rand.Int</a> and <a href="/crypto/rand#Reader">crand.Reader</a> are things. <a href="#G.X">G.X</a> is a field, <a href="#G.M1">G.M1</a> and <a href="#G.M2">G.M2</a> are generic methods. <a href="#I.F">I.F</a> is an interface method and [I.V] is a broken link.` + "\n"
|
||||
wantOldHTML = "<p>[T] and [U] are <i>types</i>, and [T.M] is a method, but [V] is a broken link. [rand.Int] and [crand.Reader] are things. [G.X] is a field, [G.M1] and [G.M2] are generic methods. [I.F] is an interface method and [I.V] is a broken link.\n"
|
||||
wantMarkdown = "[T](#T) and [U](#U) are types, and [T.M](#T.M) is a method, but \\[V] is a broken link. [rand.Int](/math/rand#Int) and [crand.Reader](/crypto/rand#Reader) are things. [G.X](#G.X) is a field, [G.M1](#G.M1) and [G.M2](#G.M2) are generic methods. [I.F](#I.F) is an interface method and \\[I.V] is a broken link.\n"
|
||||
wantText = "T and U are types, and T.M is a method, but [V] is a broken link. rand.Int and\ncrand.Reader are things. G.X is a field, G.M1 and G.M2 are generic methods.\nI.F is an interface method and [I.V] is a broken link.\n"
|
||||
wantOldText = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link.\n[rand.Int] and [crand.Reader] are things. [G.X] is a field, [G.M1] and [G.M2]\nare generic methods. [I.F] is an interface method and [I.V] is a broken link.\n"
|
||||
wantSynopsis = "T and U are types, and T.M is a method, but [V] is a broken link."
|
||||
wantOldSynopsis = "[T] and [U] are types, and [T.M] is a method, but [V] is a broken link."
|
||||
)
|
||||
|
||||
@@ -168,6 +168,7 @@ func (p *Package) collectTypes(types []*Type) {
|
||||
p.collectFuncs(t.Funcs)
|
||||
p.collectFuncs(t.Methods)
|
||||
p.collectInterfaceMethods(t)
|
||||
p.collectStructFields(t)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +213,24 @@ func (p *Package) collectInterfaceMethods(t *Type) {
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Package) collectStructFields(t *Type) {
|
||||
for _, s := range t.Decl.Specs {
|
||||
spec, ok := s.(*ast.TypeSpec)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
list, isStruct := fields(spec.Type)
|
||||
if !isStruct {
|
||||
continue
|
||||
}
|
||||
for _, field := range list {
|
||||
for _, name := range field.Names {
|
||||
p.syms[t.Name+"."+name.Name] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NewFromFiles computes documentation for a package.
|
||||
//
|
||||
// The package is specified by a list of *ast.Files and corresponding
|
||||
|
||||
2
src/go/doc/testdata/pkgdoc/doc.go
vendored
2
src/go/doc/testdata/pkgdoc/doc.go
vendored
@@ -18,7 +18,7 @@ func (T) M() {}
|
||||
var _ = rand.Int
|
||||
var _ = crand.Reader
|
||||
|
||||
type G[T any] struct{ x T }
|
||||
type G[T any] struct{ X T }
|
||||
|
||||
func (g G[T]) M1() {}
|
||||
func (g *G[T]) M2() {}
|
||||
|
||||
Reference in New Issue
Block a user