github.com/alecthomas/golangci-lint@v1.4.2-0.20180609094924-581a3564ff68/pkg/result/processors/max_same_issues.go (about)

     1  package processors
     2  
     3  import (
     4  	"sort"
     5  
     6  	"github.com/golangci/golangci-lint/pkg/result"
     7  	"github.com/sirupsen/logrus"
     8  )
     9  
    10  type textToCountMap map[string]int
    11  
    12  type MaxSameIssues struct {
    13  	tc    textToCountMap
    14  	limit int
    15  }
    16  
    17  var _ Processor = &MaxSameIssues{}
    18  
    19  func NewMaxSameIssues(limit int) *MaxSameIssues {
    20  	return &MaxSameIssues{
    21  		tc:    textToCountMap{},
    22  		limit: limit,
    23  	}
    24  }
    25  
    26  func (MaxSameIssues) Name() string {
    27  	return "max_same_issues"
    28  }
    29  
    30  func (p *MaxSameIssues) Process(issues []result.Issue) ([]result.Issue, error) {
    31  	if p.limit <= 0 { // no limit
    32  		return issues, nil
    33  	}
    34  
    35  	return filterIssues(issues, func(i *result.Issue) bool {
    36  		p.tc[i.Text]++ // always inc for stat
    37  		return p.tc[i.Text] <= p.limit
    38  	}), nil
    39  }
    40  
    41  func (p MaxSameIssues) Finish() {
    42  	walkStringToIntMapSortedByValue(p.tc, func(text string, count int) {
    43  		if count > p.limit {
    44  			logrus.Infof("%d/%d issues with text %q were hidden, use --max-same-issues",
    45  				count-p.limit, count, text)
    46  		}
    47  	})
    48  }
    49  
    50  type kv struct {
    51  	Key   string
    52  	Value int
    53  }
    54  
    55  func walkStringToIntMapSortedByValue(m map[string]int, walk func(k string, v int)) {
    56  	var ss []kv
    57  	for k, v := range m {
    58  		ss = append(ss, kv{k, v})
    59  	}
    60  
    61  	sort.Slice(ss, func(i, j int) bool {
    62  		return ss[i].Value > ss[j].Value
    63  	})
    64  
    65  	for _, kv := range ss {
    66  		walk(kv.Key, kv.Value)
    67  	}
    68  }