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 }