mirror of
https://github.com/golang/go
synced 2024-11-23 18:50:05 -07:00
cmd/doc: continue to search when package import fails
Keep searching for a package that is both findable and importable. The current code would always guarantee that a package was findable but exited if it was not importable. Fixes #25478 Change-Id: I237b7dfafb930cae02538c4a2e4d5ce0c1058478 Reviewed-on: https://go-review.googlesource.com/114295 Reviewed-by: Bryan C. Mills <bcmills@google.com> Reviewed-by: Rob Pike <r@golang.org> Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
f864d89ef7
commit
d0d47bb94f
@ -26,7 +26,7 @@ func TestMain(m *testing.M) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
dirsInit(testdataDir)
|
||||
dirsInit(testdataDir, filepath.Join(testdataDir, "nested"), filepath.Join(testdataDir, "nested", "nested"))
|
||||
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
@ -510,6 +510,24 @@ var tests = []test{
|
||||
"\\)\n+const", // This will appear if the const decl appears twice.
|
||||
},
|
||||
},
|
||||
{
|
||||
"non-imported: pkg.sym",
|
||||
[]string{"nested.Foo"},
|
||||
[]string{"Foo struct"},
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"non-imported: pkg only",
|
||||
[]string{"nested"},
|
||||
[]string{"Foo struct"},
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"non-imported: pkg sym",
|
||||
[]string{"nested", "Foo"},
|
||||
[]string{"Foo struct"},
|
||||
nil,
|
||||
},
|
||||
}
|
||||
|
||||
func TestDoc(t *testing.T) {
|
||||
|
@ -189,11 +189,16 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
|
||||
// Done below.
|
||||
case 2:
|
||||
// Package must be findable and importable.
|
||||
packagePath, ok := findPackage(arg)
|
||||
for {
|
||||
packagePath, ok := findNextPackage(arg)
|
||||
if !ok {
|
||||
return nil, args[0], args[1], false
|
||||
break
|
||||
}
|
||||
return importDir(packagePath), arg, args[1], true
|
||||
if pkg, err := build.ImportDir(packagePath, build.ImportComment); err == nil {
|
||||
return pkg, arg, args[1], true
|
||||
}
|
||||
}
|
||||
return nil, args[0], args[1], false
|
||||
}
|
||||
// Usual case: one argument.
|
||||
// If it contains slashes, it begins with a package path.
|
||||
@ -241,9 +246,15 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
|
||||
}
|
||||
// See if we have the basename or tail of a package, as in json for encoding/json
|
||||
// or ivy/value for robpike.io/ivy/value.
|
||||
path, ok := findPackage(arg[0:period])
|
||||
if ok {
|
||||
return importDir(path), arg[0:period], symbol, true
|
||||
pkgName := arg[:period]
|
||||
for {
|
||||
path, ok := findNextPackage(pkgName)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
if pkg, err = build.ImportDir(path, build.ImportComment); err == nil {
|
||||
return pkg, arg[0:period], symbol, true
|
||||
}
|
||||
}
|
||||
dirs.Reset() // Next iteration of for loop must scan all the directories again.
|
||||
}
|
||||
@ -338,9 +349,9 @@ func isUpper(name string) bool {
|
||||
return unicode.IsUpper(ch)
|
||||
}
|
||||
|
||||
// findPackage returns the full file name path that first matches the
|
||||
// findNextPackage returns the next full file name path that matches the
|
||||
// (perhaps partial) package path pkg. The boolean reports if any match was found.
|
||||
func findPackage(pkg string) (string, bool) {
|
||||
func findNextPackage(pkg string) (string, bool) {
|
||||
if pkg == "" || isUpper(pkg) { // Upper case symbol cannot be a package name.
|
||||
return "", false
|
||||
}
|
||||
|
4
src/cmd/doc/testdata/nested/ignore.go
vendored
Normal file
4
src/cmd/doc/testdata/nested/ignore.go
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
// +build ignore
|
||||
|
||||
// Ignored package
|
||||
package nested
|
4
src/cmd/doc/testdata/nested/nested/real.go
vendored
Normal file
4
src/cmd/doc/testdata/nested/nested/real.go
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
package nested
|
||||
|
||||
type Foo struct {
|
||||
}
|
Loading…
Reference in New Issue
Block a user