github.com/vanstinator/golangci-lint@v0.0.0-20240223191551-cc572f00d9d1/pkg/result/processors/max_from_linter.go (about)

     1  package processors
     2  
     3  import (
     4  	"github.com/vanstinator/golangci-lint/pkg/config"
     5  	"github.com/vanstinator/golangci-lint/pkg/logutils"
     6  	"github.com/vanstinator/golangci-lint/pkg/result"
     7  )
     8  
     9  type MaxFromLinter struct {
    10  	lc    linterToCountMap
    11  	limit int
    12  	log   logutils.Log
    13  	cfg   *config.Config
    14  }
    15  
    16  var _ Processor = &MaxFromLinter{}
    17  
    18  func NewMaxFromLinter(limit int, log logutils.Log, cfg *config.Config) *MaxFromLinter {
    19  	return &MaxFromLinter{
    20  		lc:    linterToCountMap{},
    21  		limit: limit,
    22  		log:   log,
    23  		cfg:   cfg,
    24  	}
    25  }
    26  
    27  func (p *MaxFromLinter) Name() string {
    28  	return "max_from_linter"
    29  }
    30  
    31  func (p *MaxFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
    32  	if p.limit <= 0 { // no limit
    33  		return issues, nil
    34  	}
    35  
    36  	return filterIssues(issues, func(i *result.Issue) bool {
    37  		if i.Replacement != nil && p.cfg.Issues.NeedFix {
    38  			// we need to fix all issues at once => we need to return all of them
    39  			return true
    40  		}
    41  
    42  		p.lc[i.FromLinter]++ // always inc for stat
    43  		return p.lc[i.FromLinter] <= p.limit
    44  	}), nil
    45  }
    46  
    47  func (p *MaxFromLinter) Finish() {
    48  	walkStringToIntMapSortedByValue(p.lc, func(linter string, count int) {
    49  		if count > p.limit {
    50  			p.log.Infof("%d/%d issues from linter %s were hidden, use --max-issues-per-linter",
    51  				count-p.limit, count, linter)
    52  		}
    53  	})
    54  }