github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/nestif.go (about) 1 package golinters 2 3 import ( 4 "sort" 5 "sync" 6 7 "github.com/nakabonne/nestif" 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 nestifName = "nestif" 16 17 func NewNestif() *goanalysis.Linter { 18 var mu sync.Mutex 19 var resIssues []goanalysis.Issue 20 21 analyzer := &analysis.Analyzer{ 22 Name: goanalysis.TheOnlyAnalyzerName, 23 Doc: goanalysis.TheOnlyanalyzerDoc, 24 } 25 return goanalysis.NewLinter( 26 nestifName, 27 "Reports deeply nested if statements", 28 []*analysis.Analyzer{analyzer}, 29 nil, 30 ).WithContextSetter(func(lintCtx *linter.Context) { 31 analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { 32 checker := &nestif.Checker{ 33 MinComplexity: lintCtx.Settings().Nestif.MinComplexity, 34 } 35 var issues []nestif.Issue 36 for _, f := range pass.Files { 37 issues = append(issues, checker.Check(f, pass.Fset)...) 38 } 39 if len(issues) == 0 { 40 return nil, nil 41 } 42 43 sort.SliceStable(issues, func(i, j int) bool { 44 return issues[i].Complexity > issues[j].Complexity 45 }) 46 47 res := make([]goanalysis.Issue, 0, len(issues)) 48 for _, i := range issues { 49 res = append(res, goanalysis.NewIssue(&result.Issue{ 50 Pos: i.Pos, 51 Text: i.Message, 52 FromLinter: nestifName, 53 }, pass)) 54 } 55 56 mu.Lock() 57 resIssues = append(resIssues, res...) 58 mu.Unlock() 59 60 return nil, nil 61 } 62 }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 63 return resIssues 64 }).WithLoadMode(goanalysis.LoadModeSyntax) 65 }