]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/doc: continue to search when package import fails
authorMichael Fraenkel <michael.fraenkel@gmail.com>
Wed, 23 May 2018 21:23:35 +0000 (17:23 -0400)
committerRob Pike <r@golang.org>
Mon, 11 Jun 2018 22:09:14 +0000 (22:09 +0000)
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>

src/cmd/doc/doc_test.go
src/cmd/doc/main.go
src/cmd/doc/testdata/nested/ignore.go [new file with mode: 0644]
src/cmd/doc/testdata/nested/nested/real.go [new file with mode: 0644]

index f1072b5e41fb786fe087f062990f7cdddd9a8666..e68e95f3fb511338b980974ce6e98f60258084e7 100644 (file)
@@ -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) {
index 9f947146a494a647fbacfe028c68bdce4f84261b..bf0c7723f8e02e556feac1c876d61cba0013d777 100644 (file)
@@ -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
        }
diff --git a/src/cmd/doc/testdata/nested/ignore.go b/src/cmd/doc/testdata/nested/ignore.go
new file mode 100644 (file)
index 0000000..c497f1b
--- /dev/null
@@ -0,0 +1,4 @@
+// +build ignore
+
+// Ignored package
+package nested
diff --git a/src/cmd/doc/testdata/nested/nested/real.go b/src/cmd/doc/testdata/nested/nested/real.go
new file mode 100644 (file)
index 0000000..1e55460
--- /dev/null
@@ -0,0 +1,4 @@
+package nested
+
+type Foo struct {
+}