github.com/vanstinator/golangci-lint@v0.0.0-20240223191551-cc572f00d9d1/pkg/result/processors/severity_rules.go (about) 1 package processors 2 3 import ( 4 "regexp" 5 6 "github.com/vanstinator/golangci-lint/pkg/fsutils" 7 "github.com/vanstinator/golangci-lint/pkg/logutils" 8 "github.com/vanstinator/golangci-lint/pkg/result" 9 ) 10 11 type severityRule struct { 12 baseRule 13 severity string 14 } 15 16 type SeverityRule struct { 17 BaseRule 18 Severity string 19 } 20 21 type SeverityRules struct { 22 defaultSeverity string 23 rules []severityRule 24 files *fsutils.Files 25 log logutils.Log 26 } 27 28 func NewSeverityRules(defaultSeverity string, rules []SeverityRule, files *fsutils.Files, log logutils.Log) *SeverityRules { 29 r := &SeverityRules{ 30 files: files, 31 log: log, 32 defaultSeverity: defaultSeverity, 33 } 34 r.rules = createSeverityRules(rules, "(?i)") 35 36 return r 37 } 38 39 func createSeverityRules(rules []SeverityRule, prefix string) []severityRule { 40 parsedRules := make([]severityRule, 0, len(rules)) 41 for _, rule := range rules { 42 parsedRule := severityRule{} 43 parsedRule.linters = rule.Linters 44 parsedRule.severity = rule.Severity 45 if rule.Text != "" { 46 parsedRule.text = regexp.MustCompile(prefix + rule.Text) 47 } 48 if rule.Source != "" { 49 parsedRule.source = regexp.MustCompile(prefix + rule.Source) 50 } 51 if rule.Path != "" { 52 path := fsutils.NormalizePathInRegex(rule.Path) 53 parsedRule.path = regexp.MustCompile(path) 54 } 55 if rule.PathExcept != "" { 56 pathExcept := fsutils.NormalizePathInRegex(rule.PathExcept) 57 parsedRule.pathExcept = regexp.MustCompile(pathExcept) 58 } 59 parsedRules = append(parsedRules, parsedRule) 60 } 61 return parsedRules 62 } 63 64 func (p SeverityRules) Process(issues []result.Issue) ([]result.Issue, error) { 65 if len(p.rules) == 0 && p.defaultSeverity == "" { 66 return issues, nil 67 } 68 return transformIssues(issues, func(i *result.Issue) *result.Issue { 69 for _, rule := range p.rules { 70 rule := rule 71 72 ruleSeverity := p.defaultSeverity 73 if rule.severity != "" { 74 ruleSeverity = rule.severity 75 } 76 77 if rule.match(i, p.files, p.log) { 78 i.Severity = ruleSeverity 79 return i 80 } 81 } 82 i.Severity = p.defaultSeverity 83 return i 84 }), nil 85 } 86 87 func (SeverityRules) Name() string { return "severity-rules" } 88 func (SeverityRules) Finish() {} 89 90 var _ Processor = SeverityRules{} 91 92 type SeverityRulesCaseSensitive struct { 93 *SeverityRules 94 } 95 96 func NewSeverityRulesCaseSensitive(defaultSeverity string, rules []SeverityRule, 97 files *fsutils.Files, log logutils.Log) *SeverityRulesCaseSensitive { 98 r := &SeverityRules{ 99 files: files, 100 log: log, 101 defaultSeverity: defaultSeverity, 102 } 103 r.rules = createSeverityRules(rules, "") 104 105 return &SeverityRulesCaseSensitive{r} 106 } 107 108 func (SeverityRulesCaseSensitive) Name() string { return "severity-rules-case-sensitive" }