From f891b7c3425621d0ec3771144182507c90a80cff Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 30 Oct 2019 23:52:04 -0400 Subject: [PATCH] cmd/doc: avoid calling token.IsExported on non-tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Rob Pike Reviewed-by: Daniel Martí --- src/cmd/doc/main.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/cmd/doc/main.go b/src/cmd/doc/main.go index 0f817b612ba..43144d9f221 100644 --- a/src/cmd/doc/main.go +++ b/src/cmd/doc/main.go @@ -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 {