github.com/chenfeining/golangci-lint@v1.0.2-0.20230730162517-14c6c67868df/pkg/result/processors/exclude_rules.go (about)

     1  package processors
     2  
     3  import (
     4  	"regexp"
     5  
     6  	"github.com/chenfeining/golangci-lint/pkg/fsutils"
     7  	"github.com/chenfeining/golangci-lint/pkg/logutils"
     8  	"github.com/chenfeining/golangci-lint/pkg/result"
     9  )
    10  
    11  type excludeRule struct {
    12  	baseRule
    13  }
    14  
    15  type ExcludeRule struct {
    16  	BaseRule
    17  }
    18  
    19  type ExcludeRules struct {
    20  	rules []excludeRule
    21  	files *fsutils.Files
    22  	log   logutils.Log
    23  }
    24  
    25  func NewExcludeRules(rules []ExcludeRule, files *fsutils.Files, log logutils.Log) *ExcludeRules {
    26  	r := &ExcludeRules{
    27  		files: files,
    28  		log:   log,
    29  	}
    30  	r.rules = createRules(rules, "(?i)")
    31  
    32  	return r
    33  }
    34  
    35  func createRules(rules []ExcludeRule, prefix string) []excludeRule {
    36  	parsedRules := make([]excludeRule, 0, len(rules))
    37  	for _, rule := range rules {
    38  		parsedRule := excludeRule{}
    39  		parsedRule.linters = rule.Linters
    40  		if rule.Text != "" {
    41  			parsedRule.text = regexp.MustCompile(prefix + rule.Text)
    42  		}
    43  		if rule.Source != "" {
    44  			parsedRule.source = regexp.MustCompile(prefix + rule.Source)
    45  		}
    46  		if rule.Path != "" {
    47  			path := fsutils.NormalizePathInRegex(rule.Path)
    48  			parsedRule.path = regexp.MustCompile(path)
    49  		}
    50  		if rule.PathExcept != "" {
    51  			pathExcept := fsutils.NormalizePathInRegex(rule.PathExcept)
    52  			parsedRule.pathExcept = regexp.MustCompile(pathExcept)
    53  		}
    54  		parsedRules = append(parsedRules, parsedRule)
    55  	}
    56  	return parsedRules
    57  }
    58  
    59  func (p ExcludeRules) Process(issues []result.Issue) ([]result.Issue, error) {
    60  	if len(p.rules) == 0 {
    61  		return issues, nil
    62  	}
    63  	return filterIssues(issues, func(i *result.Issue) bool {
    64  		for _, rule := range p.rules {
    65  			rule := rule
    66  			if rule.match(i, p.files, p.log) {
    67  				return false
    68  			}
    69  		}
    70  		return true
    71  	}), nil
    72  }
    73  
    74  func (ExcludeRules) Name() string { return "exclude-rules" }
    75  func (ExcludeRules) Finish()      {}
    76  
    77  var _ Processor = ExcludeRules{}
    78  
    79  type ExcludeRulesCaseSensitive struct {
    80  	*ExcludeRules
    81  }
    82  
    83  func NewExcludeRulesCaseSensitive(rules []ExcludeRule, files *fsutils.Files, log logutils.Log) *ExcludeRulesCaseSensitive {
    84  	r := &ExcludeRules{
    85  		files: files,
    86  		log:   log,
    87  	}
    88  	r.rules = createRules(rules, "")
    89  
    90  	return &ExcludeRulesCaseSensitive{r}
    91  }
    92  
    93  func (ExcludeRulesCaseSensitive) Name() string { return "exclude-rules-case-sensitive" }
    94  
    95  var _ Processor = ExcludeCaseSensitive{}