Commit e3442b4e authored by Rob Pike's avatar Rob Pike

cmd/doc: search for packages in the two-arg case

When given one argument, as in

	go doc binary.BigEndian

doc would search for the package, but when given two, as in

	go doc binary BigEndian

it would not. Fix the inconsistency.

Fixes #18697
Fixes #18664

Change-Id: Ib59dc483e8d4f91e6061c77a5ec24d0a50e115f0
Reviewed-on: https://go-review.googlesource.com/59413Reviewed-by: 's avatarAliaksandr Valialkin <valyala@gmail.com>
Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
parent 053840dc
...@@ -541,6 +541,36 @@ func TestMultiplePackages(t *testing.T) { ...@@ -541,6 +541,36 @@ func TestMultiplePackages(t *testing.T) {
} }
} }
// Test the code to look up packages when given two args. First test case is
// go doc binary BigEndian
// This needs to find encoding/binary.BigEndian, which means
// finding the package encoding/binary given only "binary".
// Second case is
// go doc rand Float64
// which again needs to find math/rand and not give up after crypto/rand,
// which has no such function.
func TestTwoArgLookup(t *testing.T) {
if testing.Short() {
t.Skip("scanning file system takes too long")
}
maybeSkip(t)
var b bytes.Buffer // We don't care about the output.
{
var flagSet flag.FlagSet
err := do(&b, &flagSet, []string{"binary", "BigEndian"})
if err != nil {
t.Errorf("unexpected error %q from binary BigEndian", err)
}
}
{
var flagSet flag.FlagSet
err := do(&b, &flagSet, []string{"rand", "Float64"})
if err != nil {
t.Errorf("unexpected error %q from rand Float64", err)
}
}
}
type trimTest struct { type trimTest struct {
path string path string
prefix string prefix string
......
...@@ -176,12 +176,12 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo ...@@ -176,12 +176,12 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
case 1: case 1:
// Done below. // Done below.
case 2: case 2:
// Package must be importable. // Package must be findable and importable.
pkg, err := build.Import(args[0], "", build.ImportComment) packagePath, ok := findPackage(args[0])
if err != nil { if !ok {
log.Fatalf("%s", err) log.Fatalf("no such package: %s", args[0])
} }
return pkg, args[0], args[1], false return importDir(packagePath), args[0], args[1], true
} }
// Usual case: one argument. // Usual case: one argument.
arg := args[0] arg := args[0]
...@@ -230,7 +230,6 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo ...@@ -230,7 +230,6 @@ 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.
// Launch findPackage as a goroutine so it can return multiple paths if required.
path, ok := findPackage(arg[0:period]) path, ok := findPackage(arg[0:period])
if ok { if ok {
return importDir(path), arg[0:period], symbol, true return importDir(path), arg[0:period], symbol, true
......
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