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

     1  package processors
     2  
     3  import (
     4  	"github.com/chenfeining/golangci-lint/pkg/config"
     5  	"github.com/chenfeining/golangci-lint/pkg/result"
     6  )
     7  
     8  type linterToCountMap map[string]int
     9  type fileToLinterToCountMap map[string]linterToCountMap
    10  
    11  type MaxPerFileFromLinter struct {
    12  	flc                        fileToLinterToCountMap
    13  	maxPerFileFromLinterConfig map[string]int
    14  }
    15  
    16  var _ Processor = &MaxPerFileFromLinter{}
    17  
    18  func NewMaxPerFileFromLinter(cfg *config.Config) *MaxPerFileFromLinter {
    19  	maxPerFileFromLinterConfig := map[string]int{}
    20  
    21  	if !cfg.Issues.NeedFix {
    22  		// if we don't fix we do this limiting to not annoy user;
    23  		// otherwise we need to fix all issues in the file at once
    24  		maxPerFileFromLinterConfig["gofmt"] = 1
    25  		maxPerFileFromLinterConfig["goimports"] = 1
    26  	}
    27  
    28  	return &MaxPerFileFromLinter{
    29  		flc:                        fileToLinterToCountMap{},
    30  		maxPerFileFromLinterConfig: maxPerFileFromLinterConfig,
    31  	}
    32  }
    33  
    34  func (p *MaxPerFileFromLinter) Name() string {
    35  	return "max_per_file_from_linter"
    36  }
    37  
    38  func (p *MaxPerFileFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
    39  	return filterIssues(issues, func(i *result.Issue) bool {
    40  		limit := p.maxPerFileFromLinterConfig[i.FromLinter]
    41  		if limit == 0 {
    42  			return true
    43  		}
    44  
    45  		lm := p.flc[i.FilePath()]
    46  		if lm == nil {
    47  			p.flc[i.FilePath()] = linterToCountMap{}
    48  		}
    49  		count := p.flc[i.FilePath()][i.FromLinter]
    50  		if count >= limit {
    51  			return false
    52  		}
    53  
    54  		p.flc[i.FilePath()][i.FromLinter]++
    55  		return true
    56  	}), nil
    57  }
    58  
    59  func (p *MaxPerFileFromLinter) Finish() {}