74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package processors
|
|
|
|
import (
|
|
"github.com/golangci/golangci-lint/pkg/config"
|
|
"github.com/golangci/golangci-lint/pkg/result"
|
|
)
|
|
|
|
var _ Processor = (*MaxPerFileFromLinter)(nil)
|
|
|
|
type MaxPerFileFromLinter struct {
|
|
fileLinterCounter fileLinterCounter
|
|
maxPerFileFromLinterConfig map[string]int
|
|
}
|
|
|
|
func NewMaxPerFileFromLinter(cfg *config.Config) *MaxPerFileFromLinter {
|
|
maxPerFileFromLinterConfig := map[string]int{}
|
|
|
|
if !cfg.Issues.NeedFix {
|
|
// if we don't fix we do this limiting to not annoy user;
|
|
// otherwise we need to fix all issues in the file at once
|
|
maxPerFileFromLinterConfig["gofmt"] = 1
|
|
maxPerFileFromLinterConfig["goimports"] = 1
|
|
}
|
|
|
|
return &MaxPerFileFromLinter{
|
|
fileLinterCounter: fileLinterCounter{},
|
|
maxPerFileFromLinterConfig: maxPerFileFromLinterConfig,
|
|
}
|
|
}
|
|
|
|
func (*MaxPerFileFromLinter) Name() string {
|
|
return "max_per_file_from_linter"
|
|
}
|
|
|
|
func (p *MaxPerFileFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
|
|
return filterIssues(issues, func(issue *result.Issue) bool {
|
|
limit := p.maxPerFileFromLinterConfig[issue.FromLinter]
|
|
if limit == 0 {
|
|
return true
|
|
}
|
|
|
|
if p.fileLinterCounter.GetCount(issue) >= limit {
|
|
return false
|
|
}
|
|
|
|
p.fileLinterCounter.Increment(issue)
|
|
|
|
return true
|
|
}), nil
|
|
}
|
|
|
|
func (*MaxPerFileFromLinter) Finish() {}
|
|
|
|
type fileLinterCounter map[string]map[string]int
|
|
|
|
func (f fileLinterCounter) GetCount(issue *result.Issue) int {
|
|
return f.getCounter(issue)[issue.FromLinter]
|
|
}
|
|
|
|
func (f fileLinterCounter) Increment(issue *result.Issue) {
|
|
f.getCounter(issue)[issue.FromLinter]++
|
|
}
|
|
|
|
func (f fileLinterCounter) getCounter(issue *result.Issue) map[string]int {
|
|
lc := f[issue.FilePath()]
|
|
|
|
if lc == nil {
|
|
lc = map[string]int{}
|
|
f[issue.FilePath()] = lc
|
|
}
|
|
|
|
return lc
|
|
}
|