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" }