github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/funlen.go (about) 1 package golinters 2 3 import ( 4 "go/token" 5 "strings" 6 "sync" 7 8 "github.com/ultraware/funlen" 9 "golang.org/x/tools/go/analysis" 10 11 "github.com/elek/golangci-lint/pkg/golinters/goanalysis" 12 "github.com/elek/golangci-lint/pkg/lint/linter" 13 "github.com/elek/golangci-lint/pkg/result" 14 ) 15 16 const funlenLinterName = "funlen" 17 18 func NewFunlen() *goanalysis.Linter { 19 var mu sync.Mutex 20 var resIssues []goanalysis.Issue 21 22 analyzer := &analysis.Analyzer{ 23 Name: funlenLinterName, 24 Doc: goanalysis.TheOnlyanalyzerDoc, 25 } 26 return goanalysis.NewLinter( 27 funlenLinterName, 28 "Tool for detection of long functions", 29 []*analysis.Analyzer{analyzer}, 30 nil, 31 ).WithContextSetter(func(lintCtx *linter.Context) { 32 analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { 33 var issues []funlen.Message 34 for _, file := range pass.Files { 35 fileIssues := funlen.Run(file, pass.Fset, lintCtx.Settings().Funlen.Lines, lintCtx.Settings().Funlen.Statements) 36 issues = append(issues, fileIssues...) 37 } 38 39 if len(issues) == 0 { 40 return nil, nil 41 } 42 43 res := make([]goanalysis.Issue, len(issues)) 44 for k, i := range issues { 45 res[k] = goanalysis.NewIssue(&result.Issue{ 46 Pos: token.Position{ 47 Filename: i.Pos.Filename, 48 Line: i.Pos.Line, 49 }, 50 Text: strings.TrimRight(i.Message, "\n"), 51 FromLinter: funlenLinterName, 52 }, pass) 53 } 54 55 mu.Lock() 56 resIssues = append(resIssues, res...) 57 mu.Unlock() 58 59 return nil, nil 60 } 61 }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 62 return resIssues 63 }).WithLoadMode(goanalysis.LoadModeSyntax) 64 }