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 }