mirror of
https://github.com/golang/go
synced 2024-11-23 21:40: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 {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
dirsInit(testdataDir)
|
dirsInit(testdataDir, filepath.Join(testdataDir, "nested"), filepath.Join(testdataDir, "nested", "nested"))
|
||||||
|
|
||||||
os.Exit(m.Run())
|
os.Exit(m.Run())
|
||||||
}
|
}
|
||||||
@ -510,6 +510,24 @@ var tests = []test{
|
|||||||
"\\)\n+const", // This will appear if the const decl appears twice.
|
"\\)\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) {
|
func TestDoc(t *testing.T) {
|
||||||
|
@ -189,11 +189,16 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
|
|||||||
// Done below.
|
// Done below.
|
||||||
case 2:
|
case 2:
|
||||||
// Package must be findable and importable.
|
// Package must be findable and importable.
|
||||||
packagePath, ok := findPackage(arg)
|
for {
|
||||||
|
packagePath, ok := findNextPackage(arg)
|
||||||
if !ok {
|
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.
|
// Usual case: one argument.
|
||||||
// If it contains slashes, it begins with a package path.
|
// 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
|
// 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.
|
// or ivy/value for robpike.io/ivy/value.
|
||||||
path, ok := findPackage(arg[0:period])
|
pkgName := arg[:period]
|
||||||
if ok {
|
for {
|
||||||
return importDir(path), arg[0:period], symbol, true
|
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.
|
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)
|
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.
|
// (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.
|
if pkg == "" || isUpper(pkg) { // Upper case symbol cannot be a package name.
|
||||||
return "", false
|
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