Commit d0d47bb9 authored by Michael Fraenkel's avatar Michael Fraenkel Committed by Rob Pike

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/114295Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
Reviewed-by: default avatarRob Pike <r@golang.org>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent f864d89e
......@@ -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)
if !ok {
return nil, args[0], args[1], false
for {
packagePath, ok := findNextPackage(arg)
if !ok {
break
}
if pkg, err := build.ImportDir(packagePath, build.ImportComment); err == nil {
return pkg, arg, args[1], true
}
}
return importDir(packagePath), 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
}
......
// +build ignore
// Ignored package
package nested
package nested
type Foo struct {
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment