github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/src/cmd/go/internal/vet/vet.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package vet implements the ``go vet'' command. 6 package vet 7 8 import ( 9 "cmd/go/internal/base" 10 "cmd/go/internal/load" 11 "cmd/go/internal/work" 12 "path/filepath" 13 ) 14 15 var CmdVet = &base.Command{ 16 Run: runVet, 17 CustomFlags: true, 18 UsageLine: "vet [-n] [-x] [build flags] [vet flags] [packages]", 19 Short: "report likely mistakes in packages", 20 Long: ` 21 Vet runs the Go vet command on the packages named by the import paths. 22 23 For more about vet and its flags, see 'go doc cmd/vet'. 24 For more about specifying packages, see 'go help packages'. 25 26 The -n flag prints commands that would be executed. 27 The -x flag prints commands as they are executed. 28 29 The build flags supported by go vet are those that control package resolution 30 and execution, such as -n, -x, -v, -tags, and -toolexec. 31 For more about these flags, see 'go help build'. 32 33 See also: go fmt, go fix. 34 `, 35 } 36 37 func runVet(cmd *base.Command, args []string) { 38 vetFlags, pkgArgs := vetFlags(args) 39 40 work.BuildInit() 41 work.VetFlags = vetFlags 42 if vetTool != "" { 43 var err error 44 work.VetTool, err = filepath.Abs(vetTool) 45 if err != nil { 46 base.Fatalf("%v", err) 47 } 48 } 49 50 pkgs := load.PackagesForBuild(pkgArgs) 51 if len(pkgs) == 0 { 52 base.Fatalf("no packages to vet") 53 } 54 55 var b work.Builder 56 b.Init() 57 58 root := &work.Action{Mode: "go vet"} 59 for _, p := range pkgs { 60 ptest, pxtest, err := load.TestPackagesFor(p, false) 61 if err != nil { 62 base.Errorf("%v", err) 63 continue 64 } 65 if len(ptest.GoFiles) == 0 && pxtest == nil { 66 base.Errorf("go vet %s: no Go files in %s", p.ImportPath, p.Dir) 67 continue 68 } 69 if len(ptest.GoFiles) > 0 { 70 root.Deps = append(root.Deps, b.VetAction(work.ModeBuild, work.ModeBuild, ptest)) 71 } 72 if pxtest != nil { 73 root.Deps = append(root.Deps, b.VetAction(work.ModeBuild, work.ModeBuild, pxtest)) 74 } 75 } 76 b.Do(root) 77 }