github.com/nozzle/golangci-lint@v1.49.0-nz3/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/golangci/golangci-lint/pkg/config"
    12  	"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
    13  	"github.com/golangci/golangci-lint/pkg/lint/linter"
    14  	"github.com/golangci/golangci-lint/pkg/result"
    15  )
    16  
    17  const unparamName = "unparam"
    18  
    19  func NewUnparam(settings *config.UnparamSettings) *goanalysis.Linter {
    20  	var mu sync.Mutex
    21  	var resIssues []goanalysis.Issue
    22  
    23  	analyzer := &analysis.Analyzer{
    24  		Name:     unparamName,
    25  		Doc:      goanalysis.TheOnlyanalyzerDoc,
    26  		Requires: []*analysis.Analyzer{buildssa.Analyzer},
    27  		Run: func(pass *analysis.Pass) (interface{}, error) {
    28  			issues, err := runUnparam(pass, settings)
    29  			if err != nil {
    30  				return nil, err
    31  			}
    32  
    33  			if len(issues) == 0 {
    34  				return nil, nil
    35  			}
    36  
    37  			mu.Lock()
    38  			resIssues = append(resIssues, issues...)
    39  			mu.Unlock()
    40  
    41  			return nil, nil
    42  		},
    43  	}
    44  
    45  	return goanalysis.NewLinter(
    46  		unparamName,
    47  		"Reports unused function parameters",
    48  		[]*analysis.Analyzer{analyzer},
    49  		nil,
    50  	).WithContextSetter(func(lintCtx *linter.Context) {
    51  		if settings.Algo != "cha" {
    52  			lintCtx.Log.Warnf("`linters-settings.unparam.algo` isn't supported by the newest `unparam`")
    53  		}
    54  	}).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
    55  		return resIssues
    56  	}).WithLoadMode(goanalysis.LoadModeTypesInfo)
    57  }
    58  
    59  func runUnparam(pass *analysis.Pass, settings *config.UnparamSettings) ([]goanalysis.Issue, error) {
    60  	ssa := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)
    61  	ssaPkg := ssa.Pkg
    62  
    63  	pkg := &packages.Package{
    64  		Fset:      pass.Fset,
    65  		Syntax:    pass.Files,
    66  		Types:     pass.Pkg,
    67  		TypesInfo: pass.TypesInfo,
    68  	}
    69  
    70  	c := &check.Checker{}
    71  	c.CheckExportedFuncs(settings.CheckExported)
    72  	c.Packages([]*packages.Package{pkg})
    73  	c.ProgramSSA(ssaPkg.Prog)
    74  
    75  	unparamIssues, err := c.Check()
    76  	if err != nil {
    77  		return nil, err
    78  	}
    79  
    80  	var issues []goanalysis.Issue
    81  	for _, i := range unparamIssues {
    82  		issues = append(issues, goanalysis.NewIssue(&result.Issue{
    83  			Pos:        pass.Fset.Position(i.Pos()),
    84  			Text:       i.Message(),
    85  			FromLinter: unparamName,
    86  		}, pass))
    87  	}
    88  
    89  	return issues, nil
    90  }