@@ -11,6 +11,7 @@ import (
1111 "golang.org/x/tools/go/analysis/passes/asmdecl"
1212 "golang.org/x/tools/go/analysis/passes/assign"
1313 "golang.org/x/tools/go/analysis/passes/atomic"
14+ "golang.org/x/tools/go/analysis/passes/atomicalign"
1415 "golang.org/x/tools/go/analysis/passes/bools"
1516 "golang.org/x/tools/go/analysis/passes/buildtag"
1617 "golang.org/x/tools/go/analysis/passes/cgocall"
@@ -33,9 +34,37 @@ import (
3334 "golang.org/x/tools/go/analysis/passes/unusedresult"
3435)
3536
36- func NewGovet (cfg * config.GovetSettings ) * goanalysis.Linter {
37- analyzers := []* analysis.Analyzer {
38- // the traditional vet suite:
37+ func getAllAnalyzers () []* analysis.Analyzer {
38+ return []* analysis.Analyzer {
39+ asmdecl .Analyzer ,
40+ assign .Analyzer ,
41+ atomic .Analyzer ,
42+ atomicalign .Analyzer ,
43+ bools .Analyzer ,
44+ buildtag .Analyzer ,
45+ cgocall .Analyzer ,
46+ composite .Analyzer ,
47+ copylock .Analyzer ,
48+ errorsas .Analyzer ,
49+ httpresponse .Analyzer ,
50+ loopclosure .Analyzer ,
51+ lostcancel .Analyzer ,
52+ nilfunc .Analyzer ,
53+ printf .Analyzer ,
54+ shadow .Analyzer ,
55+ shift .Analyzer ,
56+ stdmethods .Analyzer ,
57+ structtag .Analyzer ,
58+ tests .Analyzer ,
59+ unmarshal .Analyzer ,
60+ unreachable .Analyzer ,
61+ unsafeptr .Analyzer ,
62+ unusedresult .Analyzer ,
63+ }
64+ }
65+
66+ func getDefaultAnalyzers () []* analysis.Analyzer {
67+ return []* analysis.Analyzer {
3968 asmdecl .Analyzer ,
4069 assign .Analyzer ,
4170 atomic .Analyzer ,
@@ -59,20 +88,64 @@ func NewGovet(cfg *config.GovetSettings) *goanalysis.Linter {
5988 unsafeptr .Analyzer ,
6089 unusedresult .Analyzer ,
6190 }
91+ }
92+
93+ func isAnalyzerEnabled (name string , cfg * config.GovetSettings , defaultAnalyzers []* analysis.Analyzer ) bool {
94+ if cfg .EnableAll {
95+ return true
96+ }
97+ // Raw for loops should be OK on small slice lengths.
98+ for _ , n := range cfg .Enable {
99+ if n == name {
100+ return true
101+ }
102+ }
103+ for _ , n := range cfg .Disable {
104+ if n == name {
105+ return true
106+ }
107+ }
108+ if cfg .DisableAll {
109+ return false
110+ }
111+ for _ , a := range defaultAnalyzers {
112+ if a .Name == name {
113+ return true
114+ }
115+ }
116+ return false
117+ }
118+
119+ func analyzersFromConfig (cfg * config.GovetSettings ) []* analysis.Analyzer {
120+ if cfg == nil {
121+ return getDefaultAnalyzers ()
122+ }
123+ if cfg .CheckShadowing {
124+ // Keeping for backward compatibility.
125+ cfg .Enable = append (cfg .Enable , shadow .Analyzer .Name )
126+ }
127+
128+ var enabledAnalyzers []* analysis.Analyzer
129+ defaultAnalyzers := getDefaultAnalyzers ()
130+ for _ , a := range getAllAnalyzers () {
131+ if isAnalyzerEnabled (a .Name , cfg , defaultAnalyzers ) {
132+ enabledAnalyzers = append (enabledAnalyzers , a )
133+ }
134+ }
135+
136+ return enabledAnalyzers
137+ }
62138
139+ func NewGovet (cfg * config.GovetSettings ) * goanalysis.Linter {
63140 var settings map [string ]map [string ]interface {}
64141 if cfg != nil {
65- if cfg .CheckShadowing {
66- analyzers = append (analyzers , shadow .Analyzer )
67- }
68142 settings = cfg .Settings
69143 }
70-
71144 return goanalysis .NewLinter (
72145 "govet" ,
73146 "Vet examines Go source code and reports suspicious constructs, " +
74147 "such as Printf calls whose arguments do not align with the format string" ,
75- analyzers ,
148+ analyzersFromConfig ( cfg ) ,
76149 settings ,
77150 )
78151}
0 commit comments