github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/deadcode.go (about) 1 package golinters 2 3 import ( 4 "fmt" 5 "sync" 6 7 deadcodeAPI "github.com/golangci/go-misc/deadcode" 8 "golang.org/x/tools/go/analysis" 9 10 "github.com/elek/golangci-lint/pkg/golinters/goanalysis" 11 "github.com/elek/golangci-lint/pkg/lint/linter" 12 "github.com/elek/golangci-lint/pkg/result" 13 ) 14 15 func NewDeadcode() *goanalysis.Linter { 16 const linterName = "deadcode" 17 var mu sync.Mutex 18 var resIssues []goanalysis.Issue 19 20 analyzer := &analysis.Analyzer{ 21 Name: linterName, 22 Doc: goanalysis.TheOnlyanalyzerDoc, 23 Run: func(pass *analysis.Pass) (interface{}, error) { 24 prog := goanalysis.MakeFakeLoaderProgram(pass) 25 issues, err := deadcodeAPI.Run(prog) 26 if err != nil { 27 return nil, err 28 } 29 res := make([]goanalysis.Issue, 0, len(issues)) 30 for _, i := range issues { 31 res = append(res, goanalysis.NewIssue(&result.Issue{ 32 Pos: i.Pos, 33 Text: fmt.Sprintf("%s is unused", formatCode(i.UnusedIdentName, nil)), 34 FromLinter: linterName, 35 }, pass)) 36 } 37 mu.Lock() 38 resIssues = append(resIssues, res...) 39 mu.Unlock() 40 41 return nil, nil 42 }, 43 } 44 return goanalysis.NewLinter( 45 linterName, 46 "Finds unused code", 47 []*analysis.Analyzer{analyzer}, 48 nil, 49 ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 50 return resIssues 51 }).WithLoadMode(goanalysis.LoadModeTypesInfo) 52 }