@@ -32,13 +32,13 @@ var (
32
32
isGoCriticDebug = logutils .HaveDebugTag (logutils .DebugKeyGoCritic )
33
33
)
34
34
35
- func NewGoCritic (settings * config.GoCriticSettings , lintConfigDir string ) * goanalysis.Linter {
35
+ func NewGoCritic (settings * config.GoCriticSettings , lintConfigDirGetter func () string ) * goanalysis.Linter {
36
36
var mu sync.Mutex
37
37
var resIssues []goanalysis.Issue
38
38
39
39
wrapper := & goCriticWrapper {
40
- lintConfigDir : lintConfigDir ,
41
- sizes : types .SizesFor ("gc" , runtime .GOARCH ),
40
+ lintConfigDirGetter : lintConfigDirGetter ,
41
+ sizes : types .SizesFor ("gc" , runtime .GOARCH ),
42
42
}
43
43
44
44
analyzer := & analysis.Analyzer {
@@ -80,10 +80,10 @@ Dynamic rules are written declaratively with AST patterns, filters, report messa
80
80
}
81
81
82
82
type goCriticWrapper struct {
83
- settingsWrapper * goCriticSettingsWrapper
84
- lintConfigDir string
85
- sizes types.Sizes
86
- once sync.Once
83
+ settingsWrapper * goCriticSettingsWrapper
84
+ lintConfigDirGetter func () string
85
+ sizes types.Sizes
86
+ once sync.Once
87
87
}
88
88
89
89
func (w * goCriticWrapper ) init (settings * config.GoCriticSettings , logger logutils.Log ) {
@@ -136,15 +136,15 @@ func (w *goCriticWrapper) run(pass *analysis.Pass) ([]goanalysis.Issue, error) {
136
136
}
137
137
138
138
func (w * goCriticWrapper ) buildEnabledCheckers (linterCtx * gocriticlinter.Context ) ([]* gocriticlinter.Checker , error ) {
139
- allParams := w .settingsWrapper .GetLowerCasedParams ()
139
+ allLowerCasedParams := w .settingsWrapper .GetLowerCasedParams ()
140
140
141
141
var enabledCheckers []* gocriticlinter.Checker
142
142
for _ , info := range gocriticlinter .GetCheckersInfo () {
143
143
if ! w .settingsWrapper .IsCheckEnabled (info .Name ) {
144
144
continue
145
145
}
146
146
147
- if err := w .configureCheckerInfo (info , allParams ); err != nil {
147
+ if err := w .configureCheckerInfo (info , allLowerCasedParams ); err != nil {
148
148
return nil , err
149
149
}
150
150
@@ -205,13 +205,17 @@ func runGocriticOnFile(linterCtx *gocriticlinter.Context, f *ast.File, checks []
205
205
return res
206
206
}
207
207
208
- func (w * goCriticWrapper ) configureCheckerInfo (info * gocriticlinter.CheckerInfo , allParams map [string ]config.GoCriticCheckSettings ) error {
209
- params := allParams [strings .ToLower (info .Name )]
208
+ func (w * goCriticWrapper ) configureCheckerInfo (
209
+ info * gocriticlinter.CheckerInfo ,
210
+ allLowerCasedParams map [string ]config.GoCriticCheckSettings ,
211
+ ) error {
212
+ params := allLowerCasedParams [strings .ToLower (info .Name )]
210
213
if params == nil { // no config for this checker
211
214
return nil
212
215
}
213
216
214
- infoParams := normalizeCheckerInfoParams (info )
217
+ // NOTE(ldez): lowercase info param keys here because golangci-lint's config parser lowercases all strings.
218
+ infoParams := normalizeMap (info .Params )
215
219
for k , p := range params {
216
220
v , ok := infoParams [k ]
217
221
if ok {
@@ -235,13 +239,11 @@ func (w *goCriticWrapper) configureCheckerInfo(info *gocriticlinter.CheckerInfo,
235
239
return nil
236
240
}
237
241
238
- func normalizeCheckerInfoParams (info * gocriticlinter.CheckerInfo ) gocriticlinter.CheckerParams {
239
- // lowercase info param keys here because golangci-lint's config parser lowercases all strings
240
- ret := gocriticlinter.CheckerParams {}
241
- for k , v := range info .Params {
242
+ func normalizeMap [ValueT any ](in map [string ]ValueT ) map [string ]ValueT {
243
+ ret := make (map [string ]ValueT , len (in ))
244
+ for k , v := range in {
242
245
ret [strings .ToLower (k )] = v
243
246
}
244
-
245
247
return ret
246
248
}
247
249
@@ -259,7 +261,7 @@ func (w *goCriticWrapper) normalizeCheckerParamsValue(p any) any {
259
261
return rv .Bool ()
260
262
case reflect .String :
261
263
// Perform variable substitution.
262
- return strings .ReplaceAll (rv .String (), "${configDir}" , w .lintConfigDir )
264
+ return strings .ReplaceAll (rv .String (), "${configDir}" , w .lintConfigDirGetter () )
263
265
default :
264
266
return p
265
267
}
@@ -270,54 +272,50 @@ type goCriticSettingsWrapper struct {
270
272
271
273
logger logutils.Log
272
274
273
- allCheckers []* gocriticlinter.CheckerInfo
274
- allCheckersByName map [string ]* gocriticlinter.CheckerInfo
275
+ allCheckers []* gocriticlinter.CheckerInfo
275
276
276
- allTagsSorted []string
277
- allChecksByTag map [string ][]string
277
+ allChecks map [string ]struct {}
278
+ allChecksLowerCased map [string ]struct {}
279
+ allChecksByTag map [string ][]string
280
+ allTagsSorted []string
278
281
279
- inferredEnabledChecks map [string ]struct {}
282
+ inferredEnabledChecks map [string ]struct {}
283
+ inferredEnabledLowerCasedChecks map [string ]struct {}
280
284
}
281
285
282
286
func newGoCriticSettingsWrapper (settings * config.GoCriticSettings , logger logutils.Log ) * goCriticSettingsWrapper {
283
287
allCheckers := gocriticlinter .GetCheckersInfo ()
284
- allCheckersByName := make (map [string ]* gocriticlinter.CheckerInfo , len (allCheckers ))
285
- for _ , checkInfo := range allCheckers {
286
- allCheckersByName [checkInfo .Name ] = checkInfo
287
- }
288
288
289
+ allChecks := make (map [string ]struct {}, len (allCheckers ))
290
+ allChecksLowerCased := make (map [string ]struct {}, len (allCheckers ))
289
291
allChecksByTag := make (map [string ][]string )
290
292
for _ , checker := range allCheckers {
293
+ allChecks [checker .Name ] = struct {}{}
294
+ allChecksLowerCased [strings .ToLower (checker .Name )] = struct {}{}
295
+
291
296
for _ , tag := range checker .Tags {
292
297
allChecksByTag [tag ] = append (allChecksByTag [tag ], checker .Name )
293
298
}
294
299
}
295
300
296
- allTagsSorted := make ([]string , 0 , len (allChecksByTag ))
297
- for t := range allChecksByTag {
298
- allTagsSorted = append (allTagsSorted , t )
299
- }
301
+ allTagsSorted := maps .Keys (allChecksByTag )
300
302
sort .Strings (allTagsSorted )
301
303
302
304
return & goCriticSettingsWrapper {
303
- GoCriticSettings : settings ,
304
- logger : logger ,
305
- allCheckers : allCheckers ,
306
- allCheckersByName : allCheckersByName ,
307
- allTagsSorted : allTagsSorted ,
308
- allChecksByTag : allChecksByTag ,
309
- inferredEnabledChecks : make (map [string ]struct {}),
305
+ GoCriticSettings : settings ,
306
+ logger : logger ,
307
+ allCheckers : allCheckers ,
308
+ allChecks : allChecks ,
309
+ allChecksLowerCased : allChecksLowerCased ,
310
+ allChecksByTag : allChecksByTag ,
311
+ allTagsSorted : allTagsSorted ,
312
+ inferredEnabledChecks : make (map [string ]struct {}),
313
+ inferredEnabledLowerCasedChecks : make (map [string ]struct {}),
310
314
}
311
315
}
312
316
313
317
func (s * goCriticSettingsWrapper ) GetLowerCasedParams () map [string ]config.GoCriticCheckSettings {
314
- ret := make (map [string ]config.GoCriticCheckSettings , len (s .SettingsPerCheck ))
315
-
316
- for checker , params := range s .SettingsPerCheck {
317
- ret [strings .ToLower (checker )] = params
318
- }
319
-
320
- return ret
318
+ return normalizeMap (s .SettingsPerCheck )
321
319
}
322
320
323
321
// InferEnabledChecks tries to be consistent with (lintersdb.EnabledSet).build.
@@ -386,10 +384,11 @@ func (s *goCriticSettingsWrapper) InferEnabledChecks() {
386
384
}
387
385
388
386
s .inferredEnabledChecks = enabledChecks
387
+ s .inferredEnabledLowerCasedChecks = normalizeMap (s .inferredEnabledChecks )
389
388
s .debugChecksFinalState ()
390
389
}
391
390
392
- func (s * goCriticSettingsWrapper ) buildEnabledAndDisabledByDefaultChecks () (enabled [] string , disabled []string ) {
391
+ func (s * goCriticSettingsWrapper ) buildEnabledAndDisabledByDefaultChecks () (enabled , disabled []string ) {
393
392
for _ , info := range s .allCheckers {
394
393
if enable := isEnabledByDefaultGoCriticChecker (info ); enable {
395
394
enabled = append (enabled , info .Name )
@@ -549,10 +548,11 @@ func (s *goCriticSettingsWrapper) validateCheckerNames() error {
549
548
}
550
549
551
550
for name := range s .SettingsPerCheck {
552
- if ! s .isKnownCheck (name ) {
553
- return fmt .Errorf ("invalid settings, check %q doesn't exist, see %s documentation" , name , goCriticName )
551
+ lcName := strings .ToLower (name )
552
+ if ! s .isKnownLowerCasedCheck (lcName ) {
553
+ return fmt .Errorf ("invalid check settings: check %q doesn't exist, see %s documentation" , name , goCriticName )
554
554
}
555
- if ! s .IsCheckEnabled ( name ) {
555
+ if ! s .isLowerCasedCheckEnabled ( lcName ) {
556
556
s .logger .Warnf ("%s: settings were provided for disabled check %q" , goCriticName , name )
557
557
}
558
558
}
@@ -561,7 +561,12 @@ func (s *goCriticSettingsWrapper) validateCheckerNames() error {
561
561
}
562
562
563
563
func (s * goCriticSettingsWrapper ) isKnownCheck (name string ) bool {
564
- _ , ok := s .allCheckersByName [name ]
564
+ _ , ok := s .allChecks [name ]
565
+ return ok
566
+ }
567
+
568
+ func (s * goCriticSettingsWrapper ) isKnownLowerCasedCheck (name string ) bool {
569
+ _ , ok := s .allChecksLowerCased [name ]
565
570
return ok
566
571
}
567
572
@@ -588,6 +593,11 @@ func (s *goCriticSettingsWrapper) validateAtLeastOneCheckerEnabled() error {
588
593
return nil
589
594
}
590
595
596
+ func (s * goCriticSettingsWrapper ) isLowerCasedCheckEnabled (name string ) bool {
597
+ _ , ok := s .inferredEnabledLowerCasedChecks [name ]
598
+ return ok
599
+ }
600
+
591
601
func (s * goCriticSettingsWrapper ) IsCheckEnabled (name string ) bool {
592
602
_ , ok := s .inferredEnabledChecks [name ]
593
603
return ok
0 commit comments