]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/doc: avoid calling token.IsExported on non-tokens
authorBryan C. Mills <bcmills@google.com>
Thu, 31 Oct 2019 03:52:04 +0000 (23:52 -0400)
committerBryan C. Mills <bcmills@google.com>
Wed, 6 Nov 2019 14:33:39 +0000 (14:33 +0000)
token.IsExported expects to be passed a token, and does not check for
non-token arguments such as "C:\workdir\go\src\text".

While we're at it, clean up a few other parts of the code that
are assuming a package path where a directory may be passed instead.
There are probably others lurking around here, but I believe this
change is sufficient to get past the test failures on the
windows-amd64-longtest builder.

Fixes #35236

Change-Id: Ic79fa035531ca0777f64b1446c2f9237397b1bdf
Reviewed-on: https://go-review.googlesource.com/c/go/+/204442
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
src/cmd/doc/main.go

index 0f817b612ba210ce0ab76206f1b609a5bb34ac8a..43144d9f221527565d81ecdff3b9a776a11e6744 100644 (file)
@@ -227,19 +227,28 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
                return nil, args[0], args[1], false
        }
        // Usual case: one argument.
-       // If it contains slashes, it begins with a package path.
+       // If it contains slashes, it begins with either a package path
+       // or an absolute directory.
        // First, is it a complete package path as it is? If so, we are done.
        // This avoids confusion over package paths that have other
        // package paths as their prefix.
-       pkg, importErr := build.Import(arg, wd, build.ImportComment)
-       if importErr == nil {
-               return pkg, arg, "", false
+       var importErr error
+       if filepath.IsAbs(arg) {
+               pkg, importErr = build.ImportDir(arg, build.ImportComment)
+               if importErr == nil {
+                       return pkg, arg, "", false
+               }
+       } else {
+               pkg, importErr = build.Import(arg, wd, build.ImportComment)
+               if importErr == nil {
+                       return pkg, arg, "", false
+               }
        }
-       // Another disambiguator: If the symbol starts with an upper
+       // Another disambiguator: If the argument starts with an upper
        // case letter, it can only be a symbol in the current directory.
        // Kills the problem caused by case-insensitive file systems
        // matching an upper case name as a package name.
-       if token.IsExported(arg) {
+       if !strings.ContainsAny(arg, `/\`) && token.IsExported(arg) {
                pkg, err := build.ImportDir(".", build.ImportComment)
                if err == nil {
                        return pkg, "", arg, false
@@ -373,9 +382,6 @@ func isExported(name string) bool {
 // 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 findNextPackage(pkg string) (string, bool) {
-       if pkg == "" || token.IsExported(pkg) { // Upper case symbol cannot be a package name.
-               return "", false
-       }
        if filepath.IsAbs(pkg) {
                if dirs.offset == 0 {
                        dirs.offset = -1
@@ -383,6 +389,9 @@ func findNextPackage(pkg string) (string, bool) {
                }
                return "", false
        }
+       if pkg == "" || token.IsExported(pkg) { // Upper case symbol cannot be a package name.
+               return "", false
+       }
        pkg = path.Clean(pkg)
        pkgSuffix := "/" + pkg
        for {