golangci-lint/pkg/result/processors/severity_rules.go
Ryan Currah fa7adcbda9
add ability to set issue severity (#1155)
* add ability to set issue severity for out formats that support it based on severity rules

* fix lint issues

* change log child name

* code climate omit severity if empty

* add tests for severity rules, add support for case sensitive rules, fix lint issues, better doc comments, share processor test

* deduplicated rule logic into a base rule that can be used by multiple rule types, moved severity config to it's own parent key named severity, reduced size of NewRunner function to make it easier to read

* put validate function under base rule struct

* better validation error wording

* add Fingerprint and Description methods to Issue struct, made codeclimate reporter easier to read, checkstyle output is now pretty printed
2020-05-25 08:21:42 -04:00

104 lines
2.5 KiB
Go

package processors
import (
"regexp"
"github.com/golangci/golangci-lint/pkg/fsutils"
"github.com/golangci/golangci-lint/pkg/logutils"
"github.com/golangci/golangci-lint/pkg/result"
)
type severityRule struct {
baseRule
severity string
}
type SeverityRule struct {
BaseRule
Severity string
}
type SeverityRules struct {
defaultSeverity string
rules []severityRule
lineCache *fsutils.LineCache
log logutils.Log
}
func NewSeverityRules(defaultSeverity string, rules []SeverityRule, lineCache *fsutils.LineCache, log logutils.Log) *SeverityRules {
r := &SeverityRules{
lineCache: lineCache,
log: log,
defaultSeverity: defaultSeverity,
}
r.rules = createSeverityRules(rules, "(?i)")
return r
}
func createSeverityRules(rules []SeverityRule, prefix string) []severityRule {
parsedRules := make([]severityRule, 0, len(rules))
for _, rule := range rules {
parsedRule := severityRule{}
parsedRule.linters = rule.Linters
parsedRule.severity = rule.Severity
if rule.Text != "" {
parsedRule.text = regexp.MustCompile(prefix + rule.Text)
}
if rule.Source != "" {
parsedRule.source = regexp.MustCompile(prefix + rule.Source)
}
if rule.Path != "" {
parsedRule.path = regexp.MustCompile(rule.Path)
}
parsedRules = append(parsedRules, parsedRule)
}
return parsedRules
}
func (p SeverityRules) Process(issues []result.Issue) ([]result.Issue, error) {
if len(p.rules) == 0 {
return issues, nil
}
return transformIssues(issues, func(i *result.Issue) *result.Issue {
for _, rule := range p.rules {
rule := rule
ruleSeverity := p.defaultSeverity
if rule.severity != "" {
ruleSeverity = rule.severity
}
if rule.match(i, p.lineCache, p.log) {
i.Severity = ruleSeverity
return i
}
}
i.Severity = p.defaultSeverity
return i
}), nil
}
func (SeverityRules) Name() string { return "severity-rules" }
func (SeverityRules) Finish() {}
var _ Processor = SeverityRules{}
type SeverityRulesCaseSensitive struct {
*SeverityRules
}
func NewSeverityRulesCaseSensitive(defaultSeverity string, rules []SeverityRule,
lineCache *fsutils.LineCache, log logutils.Log) *SeverityRulesCaseSensitive {
r := &SeverityRules{
lineCache: lineCache,
log: log,
defaultSeverity: defaultSeverity,
}
r.rules = createSeverityRules(rules, "")
return &SeverityRulesCaseSensitive{r}
}
func (SeverityRulesCaseSensitive) Name() string { return "severity-rules-case-sensitive" }