@@ -227,312 +227,6 @@ func runOnFile(pass *analysis.Pass, f *ast.File, checks []*gocriticlinter.Checke
227
227
}
228
228
}
229
229
230
- type goCriticChecks [T any ] map [string ]T
231
-
232
- func (m goCriticChecks [T ]) has (name string ) bool {
233
- _ , ok := m [name ]
234
- return ok
235
- }
236
-
237
- type settingsWrapper struct {
238
- * config.GoCriticSettings
239
-
240
- logger logutils.Log
241
-
242
- allCheckers []* gocriticlinter.CheckerInfo
243
-
244
- allChecks goCriticChecks [struct {}]
245
- allChecksByTag goCriticChecks [[]string ]
246
- allTagsSorted []string
247
- inferredEnabledChecks goCriticChecks [struct {}]
248
-
249
- // *LowerCased fields are used for GoCriticSettings.SettingsPerCheck validation only.
250
-
251
- allChecksLowerCased goCriticChecks [struct {}]
252
- inferredEnabledChecksLowerCased goCriticChecks [struct {}]
253
- }
254
-
255
- func newSettingsWrapper (settings * config.GoCriticSettings , logger logutils.Log ) * settingsWrapper {
256
- allCheckers := gocriticlinter .GetCheckersInfo ()
257
-
258
- allChecks := make (goCriticChecks [struct {}], len (allCheckers ))
259
- allChecksLowerCased := make (goCriticChecks [struct {}], len (allCheckers ))
260
- allChecksByTag := make (goCriticChecks [[]string ])
261
- for _ , checker := range allCheckers {
262
- allChecks [checker .Name ] = struct {}{}
263
- allChecksLowerCased [strings .ToLower (checker .Name )] = struct {}{}
264
-
265
- for _ , tag := range checker .Tags {
266
- allChecksByTag [tag ] = append (allChecksByTag [tag ], checker .Name )
267
- }
268
- }
269
-
270
- allTagsSorted := slices .Sorted (maps .Keys (allChecksByTag ))
271
-
272
- return & settingsWrapper {
273
- GoCriticSettings : settings ,
274
- logger : logger ,
275
- allCheckers : allCheckers ,
276
- allChecks : allChecks ,
277
- allChecksLowerCased : allChecksLowerCased ,
278
- allChecksByTag : allChecksByTag ,
279
- allTagsSorted : allTagsSorted ,
280
- inferredEnabledChecks : make (goCriticChecks [struct {}]),
281
- inferredEnabledChecksLowerCased : make (goCriticChecks [struct {}]),
282
- }
283
- }
284
-
285
- func (s * settingsWrapper ) IsCheckEnabled (name string ) bool {
286
- return s .inferredEnabledChecks .has (name )
287
- }
288
-
289
- func (s * settingsWrapper ) GetLowerCasedParams () map [string ]config.GoCriticCheckSettings {
290
- return normalizeMap (s .SettingsPerCheck )
291
- }
292
-
293
- // InferEnabledChecks tries to be consistent with (lintersdb.Manager).build.
294
- func (s * settingsWrapper ) InferEnabledChecks () {
295
- s .debugChecksInitialState ()
296
-
297
- enabledByDefaultChecks , disabledByDefaultChecks := s .buildEnabledAndDisabledByDefaultChecks ()
298
-
299
- debugChecksListf (enabledByDefaultChecks , "Enabled by default" )
300
- debugChecksListf (disabledByDefaultChecks , "Disabled by default" )
301
-
302
- enabledChecks := make (goCriticChecks [struct {}])
303
-
304
- if s .EnableAll {
305
- enabledChecks = make (goCriticChecks [struct {}], len (s .allCheckers ))
306
- for _ , info := range s .allCheckers {
307
- enabledChecks [info .Name ] = struct {}{}
308
- }
309
- } else if ! s .DisableAll {
310
- // enable-all/disable-all revokes the default settings.
311
- enabledChecks = make (goCriticChecks [struct {}], len (enabledByDefaultChecks ))
312
- for _ , check := range enabledByDefaultChecks {
313
- enabledChecks [check ] = struct {}{}
314
- }
315
- }
316
-
317
- if len (s .EnabledTags ) != 0 {
318
- enabledFromTags := s .expandTagsToChecks (s .EnabledTags )
319
-
320
- debugChecksListf (enabledFromTags , "Enabled by config tags %s" , s .EnabledTags )
321
-
322
- for _ , check := range enabledFromTags {
323
- enabledChecks [check ] = struct {}{}
324
- }
325
- }
326
-
327
- if len (s .EnabledChecks ) != 0 {
328
- debugChecksListf (s .EnabledChecks , "Enabled by config" )
329
-
330
- for _ , check := range s .EnabledChecks {
331
- if enabledChecks .has (check ) {
332
- s .logger .Warnf ("%s: no need to enable check %q: it's already enabled" , linterName , check )
333
- continue
334
- }
335
- enabledChecks [check ] = struct {}{}
336
- }
337
- }
338
-
339
- if len (s .DisabledTags ) != 0 {
340
- disabledFromTags := s .expandTagsToChecks (s .DisabledTags )
341
-
342
- debugChecksListf (disabledFromTags , "Disabled by config tags %s" , s .DisabledTags )
343
-
344
- for _ , check := range disabledFromTags {
345
- delete (enabledChecks , check )
346
- }
347
- }
348
-
349
- if len (s .DisabledChecks ) != 0 {
350
- debugChecksListf (s .DisabledChecks , "Disabled by config" )
351
-
352
- for _ , check := range s .DisabledChecks {
353
- if ! enabledChecks .has (check ) {
354
- s .logger .Warnf ("%s: no need to disable check %q: it's already disabled" , linterName , check )
355
- continue
356
- }
357
- delete (enabledChecks , check )
358
- }
359
- }
360
-
361
- s .inferredEnabledChecks = enabledChecks
362
- s .inferredEnabledChecksLowerCased = normalizeMap (s .inferredEnabledChecks )
363
-
364
- s .debugChecksFinalState ()
365
- }
366
-
367
- func (s * settingsWrapper ) buildEnabledAndDisabledByDefaultChecks () (enabled , disabled []string ) {
368
- for _ , info := range s .allCheckers {
369
- if enabledByDef := isEnabledByDefaultGoCriticChecker (info ); enabledByDef {
370
- enabled = append (enabled , info .Name )
371
- } else {
372
- disabled = append (disabled , info .Name )
373
- }
374
- }
375
- return enabled , disabled
376
- }
377
-
378
- func (s * settingsWrapper ) expandTagsToChecks (tags []string ) []string {
379
- var checks []string
380
- for _ , tag := range tags {
381
- checks = append (checks , s .allChecksByTag [tag ]... )
382
- }
383
- return checks
384
- }
385
-
386
- func (s * settingsWrapper ) debugChecksInitialState () {
387
- if ! isDebug {
388
- return
389
- }
390
-
391
- debugf ("All gocritic existing tags and checks:" )
392
- for _ , tag := range s .allTagsSorted {
393
- debugChecksListf (s .allChecksByTag [tag ], " tag %q" , tag )
394
- }
395
- }
396
-
397
- func (s * settingsWrapper ) debugChecksFinalState () {
398
- if ! isDebug {
399
- return
400
- }
401
-
402
- var enabledChecks []string
403
- var disabledChecks []string
404
-
405
- for _ , checker := range s .allCheckers {
406
- check := checker .Name
407
- if s .inferredEnabledChecks .has (check ) {
408
- enabledChecks = append (enabledChecks , check )
409
- } else {
410
- disabledChecks = append (disabledChecks , check )
411
- }
412
- }
413
-
414
- debugChecksListf (enabledChecks , "Final used" )
415
-
416
- if len (disabledChecks ) == 0 {
417
- debugf ("All checks are enabled" )
418
- } else {
419
- debugChecksListf (disabledChecks , "Final not used" )
420
- }
421
- }
422
-
423
- // Validate tries to be consistent with (lintersdb.Validator).validateEnabledDisabledLintersConfig.
424
- func (s * settingsWrapper ) Validate () error {
425
- for _ , v := range []func () error {
426
- s .validateOptionsCombinations ,
427
- s .validateCheckerTags ,
428
- s .validateCheckerNames ,
429
- s .validateDisabledAndEnabledAtOneMoment ,
430
- s .validateAtLeastOneCheckerEnabled ,
431
- } {
432
- if err := v (); err != nil {
433
- return err
434
- }
435
- }
436
- return nil
437
- }
438
-
439
- func (s * settingsWrapper ) validateOptionsCombinations () error {
440
- if s .EnableAll {
441
- if s .DisableAll {
442
- return errors .New ("enable-all and disable-all options must not be combined" )
443
- }
444
-
445
- if len (s .EnabledTags ) != 0 {
446
- return errors .New ("enable-all and enabled-tags options must not be combined" )
447
- }
448
-
449
- if len (s .EnabledChecks ) != 0 {
450
- return errors .New ("enable-all and enabled-checks options must not be combined" )
451
- }
452
- }
453
-
454
- if s .DisableAll {
455
- if len (s .DisabledTags ) != 0 {
456
- return errors .New ("disable-all and disabled-tags options must not be combined" )
457
- }
458
-
459
- if len (s .DisabledChecks ) != 0 {
460
- return errors .New ("disable-all and disabled-checks options must not be combined" )
461
- }
462
-
463
- if len (s .EnabledTags ) == 0 && len (s .EnabledChecks ) == 0 {
464
- return errors .New ("all checks were disabled, but no one check was enabled: at least one must be enabled" )
465
- }
466
- }
467
-
468
- return nil
469
- }
470
-
471
- func (s * settingsWrapper ) validateCheckerTags () error {
472
- for _ , tag := range s .EnabledTags {
473
- if ! s .allChecksByTag .has (tag ) {
474
- return fmt .Errorf ("enabled tag %q doesn't exist, see %s's documentation" , tag , linterName )
475
- }
476
- }
477
-
478
- for _ , tag := range s .DisabledTags {
479
- if ! s .allChecksByTag .has (tag ) {
480
- return fmt .Errorf ("disabled tag %q doesn't exist, see %s's documentation" , tag , linterName )
481
- }
482
- }
483
-
484
- return nil
485
- }
486
-
487
- func (s * settingsWrapper ) validateCheckerNames () error {
488
- for _ , check := range s .EnabledChecks {
489
- if ! s .allChecks .has (check ) {
490
- return fmt .Errorf ("enabled check %q doesn't exist, see %s's documentation" , check , linterName )
491
- }
492
- }
493
-
494
- for _ , check := range s .DisabledChecks {
495
- if ! s .allChecks .has (check ) {
496
- return fmt .Errorf ("disabled check %q doesn't exist, see %s documentation" , check , linterName )
497
- }
498
- }
499
-
500
- for check := range s .SettingsPerCheck {
501
- lcName := strings .ToLower (check )
502
- if ! s .allChecksLowerCased .has (lcName ) {
503
- return fmt .Errorf ("invalid check settings: check %q doesn't exist, see %s documentation" , check , linterName )
504
- }
505
- if ! s .inferredEnabledChecksLowerCased .has (lcName ) {
506
- s .logger .Warnf ("%s: settings were provided for disabled check %q" , check , linterName )
507
- }
508
- }
509
-
510
- return nil
511
- }
512
-
513
- func (s * settingsWrapper ) validateDisabledAndEnabledAtOneMoment () error {
514
- for _ , tag := range s .DisabledTags {
515
- if slices .Contains (s .EnabledTags , tag ) {
516
- return fmt .Errorf ("tag %q disabled and enabled at one moment" , tag )
517
- }
518
- }
519
-
520
- for _ , check := range s .DisabledChecks {
521
- if slices .Contains (s .EnabledChecks , check ) {
522
- return fmt .Errorf ("check %q disabled and enabled at one moment" , check )
523
- }
524
- }
525
-
526
- return nil
527
- }
528
-
529
- func (s * settingsWrapper ) validateAtLeastOneCheckerEnabled () error {
530
- if len (s .inferredEnabledChecks ) == 0 {
531
- return errors .New ("eventually all checks were disabled: at least one must be enabled" )
532
- }
533
- return nil
534
- }
535
-
536
230
func normalizeMap [ValueT any ](in map [string ]ValueT ) map [string ]ValueT {
537
231
ret := make (map [string ]ValueT , len (in ))
538
232
for k , v := range in {
@@ -548,13 +242,3 @@ func isEnabledByDefaultGoCriticChecker(info *gocriticlinter.CheckerInfo) bool {
548
242
! info .HasTag (gocriticlinter .PerformanceTag ) &&
549
243
! info .HasTag (gocriticlinter .SecurityTag )
550
244
}
551
-
552
- func debugChecksListf (checks []string , format string , args ... any ) {
553
- if ! isDebug {
554
- return
555
- }
556
-
557
- v := slices .Sorted (slices .Values (checks ))
558
-
559
- debugf ("%s checks (%d): %s" , fmt .Sprintf (format , args ... ), len (checks ), strings .Join (v , ", " ))
560
- }
0 commit comments