github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/unused.go (about) 1 package golinters 2 3 import ( 4 "fmt" 5 "sync" 6 7 "golang.org/x/tools/go/analysis" 8 "honnef.co/go/tools/unused" 9 10 "github.com/elek/golangci-lint/pkg/config" 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 type UnusedSettings struct { 17 GoVersion string 18 } 19 20 func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter { 21 const name = "unused" 22 23 var mu sync.Mutex 24 var resIssues []goanalysis.Issue 25 26 analyzer := &analysis.Analyzer{ 27 Name: name, 28 Doc: unused.Analyzer.Analyzer.Doc, 29 Requires: unused.Analyzer.Analyzer.Requires, 30 Run: func(pass *analysis.Pass) (interface{}, error) { 31 res, err := unused.Analyzer.Analyzer.Run(pass) 32 if err != nil { 33 return nil, err 34 } 35 36 sr := unused.Serialize(pass, res.(unused.Result), pass.Fset) 37 38 var issues []goanalysis.Issue 39 for _, object := range sr.Unused { 40 issue := goanalysis.NewIssue(&result.Issue{ 41 FromLinter: name, 42 Text: fmt.Sprintf("%s %s is unused", object.Kind, object.Name), 43 Pos: object.Position, 44 }, pass) 45 46 issues = append(issues, issue) 47 } 48 49 mu.Lock() 50 resIssues = append(resIssues, issues...) 51 mu.Unlock() 52 53 return nil, nil 54 }, 55 } 56 57 setAnalyzerGoVersion(analyzer, getGoVersion(settings)) 58 59 lnt := goanalysis.NewLinter( 60 name, 61 "Checks Go code for unused constants, variables, functions and types", 62 []*analysis.Analyzer{analyzer}, 63 nil, 64 ).WithIssuesReporter(func(lintCtx *linter.Context) []goanalysis.Issue { 65 return resIssues 66 }).WithLoadMode(goanalysis.LoadModeTypesInfo) 67 68 return lnt 69 }