main.go (4371B)
1 // review-vet is the analysis tool review hands to go vet with -vettool: the 2 // analysers vet runs by default, and the ones from golang.org/x/tools it 3 // leaves out — nilness, shadow, unusedwrite, the checks on sort, reflect and 4 // atomic misuse, and the modernize suite. Build it and put it on the path: 5 // 6 // go build -o ~/go/bin/review-vet ./sidecar/govet 7 // 8 // Without it, review runs vet's default set. 9 package main 10 11 import ( 12 "golang.org/x/tools/go/analysis" 13 "golang.org/x/tools/go/analysis/multichecker" 14 "golang.org/x/tools/go/analysis/passes/appends" 15 "golang.org/x/tools/go/analysis/passes/asmdecl" 16 "golang.org/x/tools/go/analysis/passes/assign" 17 "golang.org/x/tools/go/analysis/passes/atomic" 18 "golang.org/x/tools/go/analysis/passes/atomicalign" 19 "golang.org/x/tools/go/analysis/passes/bools" 20 "golang.org/x/tools/go/analysis/passes/buildtag" 21 "golang.org/x/tools/go/analysis/passes/cgocall" 22 "golang.org/x/tools/go/analysis/passes/composite" 23 "golang.org/x/tools/go/analysis/passes/copylock" 24 "golang.org/x/tools/go/analysis/passes/deepequalerrors" 25 "golang.org/x/tools/go/analysis/passes/defers" 26 "golang.org/x/tools/go/analysis/passes/directive" 27 "golang.org/x/tools/go/analysis/passes/errorsas" 28 "golang.org/x/tools/go/analysis/passes/framepointer" 29 "golang.org/x/tools/go/analysis/passes/hostport" 30 "golang.org/x/tools/go/analysis/passes/httpmux" 31 "golang.org/x/tools/go/analysis/passes/httpresponse" 32 "golang.org/x/tools/go/analysis/passes/ifaceassert" 33 "golang.org/x/tools/go/analysis/passes/loopclosure" 34 "golang.org/x/tools/go/analysis/passes/lostcancel" 35 "golang.org/x/tools/go/analysis/passes/modernize" 36 "golang.org/x/tools/go/analysis/passes/nilfunc" 37 "golang.org/x/tools/go/analysis/passes/nilness" 38 "golang.org/x/tools/go/analysis/passes/printf" 39 "golang.org/x/tools/go/analysis/passes/reflectvaluecompare" 40 "golang.org/x/tools/go/analysis/passes/scannererr" 41 "golang.org/x/tools/go/analysis/passes/shadow" 42 "golang.org/x/tools/go/analysis/passes/shift" 43 "golang.org/x/tools/go/analysis/passes/sigchanyzer" 44 "golang.org/x/tools/go/analysis/passes/slog" 45 "golang.org/x/tools/go/analysis/passes/sortslice" 46 "golang.org/x/tools/go/analysis/passes/sqlrowserr" 47 "golang.org/x/tools/go/analysis/passes/stdmethods" 48 "golang.org/x/tools/go/analysis/passes/stdversion" 49 "golang.org/x/tools/go/analysis/passes/stringintconv" 50 "golang.org/x/tools/go/analysis/passes/structtag" 51 "golang.org/x/tools/go/analysis/passes/testinggoroutine" 52 "golang.org/x/tools/go/analysis/passes/tests" 53 "golang.org/x/tools/go/analysis/passes/timeformat" 54 "golang.org/x/tools/go/analysis/passes/unmarshal" 55 "golang.org/x/tools/go/analysis/passes/unreachable" 56 "golang.org/x/tools/go/analysis/passes/unsafeptr" 57 "golang.org/x/tools/go/analysis/passes/unusedresult" 58 "golang.org/x/tools/go/analysis/passes/unusedwrite" 59 "golang.org/x/tools/go/analysis/passes/waitgroup" 60 ) 61 62 func main() { 63 // Vet's own set first, as vet runs it. 64 analyzers := []*analysis.Analyzer{ 65 appends.Analyzer, asmdecl.Analyzer, assign.Analyzer, atomic.Analyzer, bools.Analyzer, 66 buildtag.Analyzer, cgocall.Analyzer, composite.Analyzer, copylock.Analyzer, defers.Analyzer, 67 directive.Analyzer, errorsas.Analyzer, framepointer.Analyzer, hostport.Analyzer, 68 httpresponse.Analyzer, ifaceassert.Analyzer, loopclosure.Analyzer, lostcancel.Analyzer, 69 nilfunc.Analyzer, printf.Analyzer, shift.Analyzer, sigchanyzer.Analyzer, slog.Analyzer, 70 stdmethods.Analyzer, stdversion.Analyzer, stringintconv.Analyzer, structtag.Analyzer, 71 testinggoroutine.Analyzer, tests.Analyzer, timeformat.Analyzer, unmarshal.Analyzer, 72 unreachable.Analyzer, unsafeptr.Analyzer, unusedresult.Analyzer, waitgroup.Analyzer, 73 } 74 // The ones vet leaves out. nilness needs SSA and finds nil dereferences 75 // and impossible comparisons; the sort, reflect, sql and bufio checks 76 // find misuse the type checker allows; shadow and unusedwrite are 77 // judgement calls, reported as such. 78 analyzers = append(analyzers, 79 nilness.Analyzer, atomicalign.Analyzer, deepequalerrors.Analyzer, httpmux.Analyzer, 80 reflectvaluecompare.Analyzer, scannererr.Analyzer, sortslice.Analyzer, sqlrowserr.Analyzer, 81 shadow.Analyzer, unusedwrite.Analyzer, 82 ) 83 // modernize reports an older idiom where a newer one exists: taste, and 84 // review reports it as a note. 85 analyzers = append(analyzers, modernize.Suite...) 86 multichecker.Main(analyzers...) 87 }