github.com/zxy12/go_duplicate_112_new@v0.0.0-20200807091221-747231827200/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/modload" 12 "cmd/go/internal/work" 13 "path/filepath" 14 ) 15 16 var CmdVet = &base.Command{ 17 Run: runVet, 18 CustomFlags: true, 19 UsageLine: "go vet [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages]", 20 Short: "report likely mistakes in packages", 21 Long: ` 22 Vet runs the Go vet command on the packages named by the import paths. 23 24 For more about vet and its flags, see 'go doc cmd/vet'. 25 For more about specifying packages, see 'go help packages'. 26 For a list of checkers and their flags, see 'go tool vet help'. 27 For details of a specific checker such as 'printf', see 'go tool vet help printf'. 28 29 The -n flag prints commands that would be executed. 30 The -x flag prints commands as they are executed. 31 32 The -vettool=prog flag selects a different analysis tool with alternative 33 or additional checks. 34 For example, the 'shadow' analyzer can be built and run using these commands: 35 36 go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow 37 go vet -vettool=$(which shadow) 38 39 The build flags supported by go vet are those that control package resolution 40 and execution, such as -n, -x, -v, -tags, and -toolexec. 41 For more about these flags, see 'go help build'. 42 43 See also: go fmt, go fix. 44 `, 45 } 46 47 func runVet(cmd *base.Command, args []string) { 48 modload.LoadTests = true 49 50 vetFlags, pkgArgs := vetFlags(vetUsage, args) 51 52 work.BuildInit() 53 work.VetFlags = vetFlags 54 if vetTool != "" { 55 var err error 56 work.VetTool, err = filepath.Abs(vetTool) 57 if err != nil { 58 base.Fatalf("%v", err) 59 } 60 } 61 62 pkgs := load.PackagesForBuild(pkgArgs) 63 if len(pkgs) == 0 { 64 base.Fatalf("no packages to vet") 65 } 66 67 var b work.Builder 68 b.Init() 69 70 root := &work.Action{Mode: "go vet"} 71 for _, p := range pkgs { 72 _, ptest, pxtest, err := load.TestPackagesFor(p, nil) 73 if err != nil { 74 base.Errorf("%v", err) 75 continue 76 } 77 if len(ptest.GoFiles) == 0 && len(ptest.CgoFiles) == 0 && pxtest == nil { 78 base.Errorf("go vet %s: no Go files in %s", p.ImportPath, p.Dir) 79 continue 80 } 81 if len(ptest.GoFiles) > 0 || len(ptest.CgoFiles) > 0 { 82 root.Deps = append(root.Deps, b.VetAction(work.ModeBuild, work.ModeBuild, ptest)) 83 } 84 if pxtest != nil { 85 root.Deps = append(root.Deps, b.VetAction(work.ModeBuild, work.ModeBuild, pxtest)) 86 } 87 } 88 b.Do(root) 89 }