forked from golangci/golangci-lint
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmax_per_file_from_linter.go
80 lines (62 loc) · 2.16 KB
/
max_per_file_from_linter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package processors
import (
"github.com/golangci/golangci-lint/pkg/config"
"github.com/golangci/golangci-lint/pkg/goformatters/gci"
"github.com/golangci/golangci-lint/pkg/goformatters/gofmt"
"github.com/golangci/golangci-lint/pkg/goformatters/gofumpt"
"github.com/golangci/golangci-lint/pkg/goformatters/goimports"
"github.com/golangci/golangci-lint/pkg/goformatters/golines"
"github.com/golangci/golangci-lint/pkg/result"
)
var _ Processor = (*MaxPerFileFromLinter)(nil)
// MaxPerFileFromLinter limits the number of reports by file and by linter.
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
for _, f := range []string{gofmt.Name, gofumpt.Name, goimports.Name, gci.Name, golines.Name} {
maxPerFileFromLinterConfig[f] = 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 filterIssuesUnsafe(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
}