github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/result/processors/severity_rules.go (about)

     1  package processors
     2  
     3  import (
     4  	"regexp"
     5  
     6  	"github.com/elek/golangci-lint/pkg/fsutils"
     7  	"github.com/elek/golangci-lint/pkg/logutils"
     8  	"github.com/elek/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  	lineCache       *fsutils.LineCache
    25  	log             logutils.Log
    26  }
    27  
    28  func NewSeverityRules(defaultSeverity string, rules []SeverityRule, lineCache *fsutils.LineCache, log logutils.Log) *SeverityRules {
    29  	r := &SeverityRules{
    30  		lineCache:       lineCache,
    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  			parsedRule.path = regexp.MustCompile(rule.Path)
    53  		}
    54  		parsedRules = append(parsedRules, parsedRule)
    55  	}
    56  	return parsedRules
    57  }
    58  
    59  func (p SeverityRules) Process(issues []result.Issue) ([]result.Issue, error) {
    60  	if len(p.rules) == 0 && p.defaultSeverity == "" {
    61  		return issues, nil
    62  	}
    63  	return transformIssues(issues, func(i *result.Issue) *result.Issue {
    64  		for _, rule := range p.rules {
    65  			rule := rule
    66  
    67  			ruleSeverity := p.defaultSeverity
    68  			if rule.severity != "" {
    69  				ruleSeverity = rule.severity
    70  			}
    71  
    72  			if rule.match(i, p.lineCache, p.log) {
    73  				i.Severity = ruleSeverity
    74  				return i
    75  			}
    76  		}
    77  		i.Severity = p.defaultSeverity
    78  		return i
    79  	}), nil
    80  }
    81  
    82  func (SeverityRules) Name() string { return "severity-rules" }
    83  func (SeverityRules) Finish()      {}
    84  
    85  var _ Processor = SeverityRules{}
    86  
    87  type SeverityRulesCaseSensitive struct {
    88  	*SeverityRules
    89  }
    90  
    91  func NewSeverityRulesCaseSensitive(defaultSeverity string, rules []SeverityRule,
    92  	lineCache *fsutils.LineCache, log logutils.Log) *SeverityRulesCaseSensitive {
    93  	r := &SeverityRules{
    94  		lineCache:       lineCache,
    95  		log:             log,
    96  		defaultSeverity: defaultSeverity,
    97  	}
    98  	r.rules = createSeverityRules(rules, "")
    99  
   100  	return &SeverityRulesCaseSensitive{r}
   101  }
   102  
   103  func (SeverityRulesCaseSensitive) Name() string { return "severity-rules-case-sensitive" }