github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/gocyclo.go (about)

     1  package golinters
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"github.com/fzipp/gocyclo"
     8  	"golang.org/x/tools/go/analysis"
     9  
    10  	"github.com/elek/golangci-lint/pkg/golinters/goanalysis"
    11  	"github.com/elek/golangci-lint/pkg/lint/linter"
    12  	"github.com/elek/golangci-lint/pkg/result"
    13  )
    14  
    15  const gocycloName = "gocyclo"
    16  
    17  func NewGocyclo() *goanalysis.Linter {
    18  	var mu sync.Mutex
    19  	var resIssues []goanalysis.Issue
    20  
    21  	analyzer := &analysis.Analyzer{
    22  		Name: gocycloName,
    23  		Doc:  goanalysis.TheOnlyanalyzerDoc,
    24  	}
    25  	return goanalysis.NewLinter(
    26  		gocycloName,
    27  		"Computes and checks the cyclomatic complexity of functions",
    28  		[]*analysis.Analyzer{analyzer},
    29  		nil,
    30  	).WithContextSetter(func(lintCtx *linter.Context) {
    31  		analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
    32  			var stats gocyclo.Stats
    33  			for _, f := range pass.Files {
    34  				stats = gocyclo.AnalyzeASTFile(f, pass.Fset, stats)
    35  			}
    36  			if len(stats) == 0 {
    37  				return nil, nil
    38  			}
    39  
    40  			stats = stats.SortAndFilter(-1, lintCtx.Settings().Gocyclo.MinComplexity)
    41  
    42  			res := make([]goanalysis.Issue, 0, len(stats))
    43  			for _, s := range stats {
    44  				res = append(res, goanalysis.NewIssue(&result.Issue{
    45  					Pos: s.Pos,
    46  					Text: fmt.Sprintf("cyclomatic complexity %d of func %s is high (> %d)",
    47  						s.Complexity, formatCode(s.FuncName, lintCtx.Cfg), lintCtx.Settings().Gocyclo.MinComplexity),
    48  					FromLinter: gocycloName,
    49  				}, pass))
    50  			}
    51  
    52  			mu.Lock()
    53  			resIssues = append(resIssues, res...)
    54  			mu.Unlock()
    55  
    56  			return nil, nil
    57  		}
    58  	}).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
    59  		return resIssues
    60  	}).WithLoadMode(goanalysis.LoadModeSyntax)
    61  }