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  }