Skip to content

Commit

Permalink
cmd/go/internal/vet: print line numbers appropriately on list errors
Browse files Browse the repository at this point in the history
Fixes golang#36173

For reasons that are unclear to me, this commit:
golang@f1d5ce0
introduces a TestPackagesFor function that strips line numbers from error
messages. This commit introduces a new version of that function for 'go vet'
that always keeps the line numbers.
  • Loading branch information
nicks committed Feb 2, 2020
1 parent 753d56d commit 0e2e7ab
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 1 deletion.
33 changes: 32 additions & 1 deletion src/cmd/go/internal/vet/vet.go
Expand Up @@ -70,7 +70,7 @@ func runVet(cmd *base.Command, args []string) {

root := &work.Action{Mode: "go vet"}
for _, p := range pkgs {
_, ptest, pxtest, err := load.TestPackagesFor(p, nil)
_, ptest, pxtest, err := testPackagesFor(p)
if err != nil {
base.Errorf("%v", err)
continue
Expand All @@ -88,3 +88,34 @@ func runVet(cmd *base.Command, args []string) {
}
b.Do(root)
}

// testPackagesFor is like load.TestPackagesAndErrors but it returns
// an error if the test packages or their dependencies have errors.
// Only test packages without errors are returned.
func testPackagesFor(p *load.Package) (pmain, ptest, pxtest *load.Package, err error) {
pmain, ptest, pxtest = load.TestPackagesAndErrors(p, nil)
for _, p1 := range []*load.Package{ptest, pxtest, pmain} {
if p1 == nil {
// pxtest may be nil
continue
}
if p1.Error != nil {
err = p1.Error
break
}
if len(p1.DepsErrors) > 0 {
err = p1.DepsErrors[0]
break
}
}
if pmain.Error != nil || len(pmain.DepsErrors) > 0 {
pmain = nil
}
if ptest.Error != nil || len(ptest.DepsErrors) > 0 {
ptest = nil
}
if pxtest != nil && (pxtest.Error != nil || len(pxtest.DepsErrors) > 0) {
pxtest = nil
}
return pmain, ptest, pxtest, err
}
19 changes: 19 additions & 0 deletions src/cmd/go/testdata/script/vet_internal.txt
@@ -0,0 +1,19 @@
env GO111MODULE=off

# Issue 36173. Verify that "go vet" prints line numbers on load errors.

! go vet a/a_test.go
stderr 'a_test.go:4:3: use of internal package'

-- a/a.go --
package a

-- a/a_test.go --
package a

import (
_ "a/x/internal/y"
)

-- a/x/internal/y/y.go --
package y

0 comments on commit 0e2e7ab

Please sign in to comment.