1package main 2 3import ( 4 "flag" 5 "go/ast" 6 "log" 7 "os" 8 9 "golang.org/x/tools/go/packages" 10 11 "github.com/ashanbrown/makezero/makezero" 12) 13 14func main() { 15 log.SetFlags(0) // remove log timestamp 16 17 setExitStatus := flag.Bool("set_exit_status", false, 18 "Set exit status to 1 if any issues are found") 19 always := flag.Bool("always", false, 20 "require every make to have zero length regardless of whether append is used") 21 flag.Parse() 22 23 cfg := packages.Config{ 24 Mode: packages.NeedSyntax | packages.NeedName | packages.NeedFiles | packages.NeedTypes | packages.NeedTypesInfo, 25 } 26 pkgs, err := packages.Load(&cfg, os.Args[1:]...) 27 if err != nil { 28 log.Fatalf("Could not load packages: %s", err) 29 } 30 linter := makezero.NewLinter(*always) 31 32 var issues []makezero.Issue // nolint:prealloc // don't know how many there will be 33 for _, p := range pkgs { 34 nodes := make([]ast.Node, 0, len(p.Syntax)) 35 for _, n := range p.Syntax { 36 nodes = append(nodes, n) 37 } 38 newIssues, err := linter.Run(p.Fset, p.TypesInfo, nodes...) 39 if err != nil { 40 log.Fatalf("failed: %s", err) 41 } 42 issues = append(issues, newIssues...) 43 } 44 45 for _, issue := range issues { 46 log.Println(issue) 47 } 48 49 if *setExitStatus && len(issues) > 0 { 50 os.Exit(1) 51 } 52} 53