56 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package processors
 | |
| 
 | |
| import (
 | |
| 	"github.com/golangci/golangci-lint/pkg/config"
 | |
| 	"github.com/golangci/golangci-lint/pkg/logutils"
 | |
| 	"github.com/golangci/golangci-lint/pkg/result"
 | |
| )
 | |
| 
 | |
| var _ Processor = (*MaxFromLinter)(nil)
 | |
| 
 | |
| type MaxFromLinter struct {
 | |
| 	linterCounter map[string]int
 | |
| 	limit         int
 | |
| 	log           logutils.Log
 | |
| 	cfg           *config.Config
 | |
| }
 | |
| 
 | |
| func NewMaxFromLinter(limit int, log logutils.Log, cfg *config.Config) *MaxFromLinter {
 | |
| 	return &MaxFromLinter{
 | |
| 		linterCounter: map[string]int{},
 | |
| 		limit:         limit,
 | |
| 		log:           log,
 | |
| 		cfg:           cfg,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (*MaxFromLinter) Name() string {
 | |
| 	return "max_from_linter"
 | |
| }
 | |
| 
 | |
| func (p *MaxFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
 | |
| 	if p.limit <= 0 { // no limit
 | |
| 		return issues, nil
 | |
| 	}
 | |
| 
 | |
| 	return filterIssues(issues, func(issue *result.Issue) bool {
 | |
| 		if issue.Replacement != nil && p.cfg.Issues.NeedFix {
 | |
| 			// we need to fix all issues at once => we need to return all of them
 | |
| 			return true
 | |
| 		}
 | |
| 
 | |
| 		p.linterCounter[issue.FromLinter]++ // always inc for stat
 | |
| 
 | |
| 		return p.linterCounter[issue.FromLinter] <= p.limit
 | |
| 	}), nil
 | |
| }
 | |
| 
 | |
| func (p *MaxFromLinter) Finish() {
 | |
| 	walkStringToIntMapSortedByValue(p.linterCounter, func(linter string, count int) {
 | |
| 		if count > p.limit {
 | |
| 			p.log.Infof("%d/%d issues from linter %s were hidden, use --max-issues-per-linter",
 | |
| 				count-p.limit, count, linter)
 | |
| 		}
 | |
| 	})
 | |
| }
 | 
