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