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

     1  package golinters
     2  
     3  import (
     4  	"sync"
     5  
     6  	"golang.org/x/tools/go/analysis"
     7  	"golang.org/x/tools/go/analysis/passes/buildssa"
     8  	"golang.org/x/tools/go/packages"
     9  	"mvdan.cc/unparam/check"
    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  func NewUnparam() *goanalysis.Linter {
    17  	const linterName = "unparam"
    18  	var mu sync.Mutex
    19  	var resIssues []goanalysis.Issue
    20  
    21  	analyzer := &analysis.Analyzer{
    22  		Name:     linterName,
    23  		Doc:      goanalysis.TheOnlyanalyzerDoc,
    24  		Requires: []*analysis.Analyzer{buildssa.Analyzer},
    25  	}
    26  	return goanalysis.NewLinter(
    27  		linterName,
    28  		"Reports unused function parameters",
    29  		[]*analysis.Analyzer{analyzer},
    30  		nil,
    31  	).WithContextSetter(func(lintCtx *linter.Context) {
    32  		us := &lintCtx.Settings().Unparam
    33  		if us.Algo != "cha" {
    34  			lintCtx.Log.Warnf("`linters-settings.unparam.algo` isn't supported by the newest `unparam`")
    35  		}
    36  
    37  		analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
    38  			ssa := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)
    39  			ssaPkg := ssa.Pkg
    40  
    41  			pkg := &packages.Package{
    42  				Fset:      pass.Fset,
    43  				Syntax:    pass.Files,
    44  				Types:     pass.Pkg,
    45  				TypesInfo: pass.TypesInfo,
    46  			}
    47  
    48  			c := &check.Checker{}
    49  			c.CheckExportedFuncs(us.CheckExported)
    50  			c.Packages([]*packages.Package{pkg})
    51  			c.ProgramSSA(ssaPkg.Prog)
    52  
    53  			unparamIssues, err := c.Check()
    54  			if err != nil {
    55  				return nil, err
    56  			}
    57  
    58  			var res []goanalysis.Issue
    59  			for _, i := range unparamIssues {
    60  				res = append(res, goanalysis.NewIssue(&result.Issue{
    61  					Pos:        pass.Fset.Position(i.Pos()),
    62  					Text:       i.Message(),
    63  					FromLinter: linterName,
    64  				}, pass))
    65  			}
    66  
    67  			mu.Lock()
    68  			resIssues = append(resIssues, res...)
    69  			mu.Unlock()
    70  
    71  			return nil, nil
    72  		}
    73  	}).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
    74  		return resIssues
    75  	}).WithLoadMode(goanalysis.LoadModeTypesInfo)
    76  }