github.com/nozzle/golangci-lint@v1.49.0-nz3/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/golangci/golangci-lint/pkg/golinters/goanalysis" 11 "github.com/golangci/golangci-lint/pkg/lint/linter" 12 "github.com/golangci/golangci-lint/pkg/result" 13 ) 14 15 const deadcodeName = "deadcode" 16 17 func NewDeadcode() *goanalysis.Linter { 18 var mu sync.Mutex 19 var resIssues []goanalysis.Issue 20 21 analyzer := &analysis.Analyzer{ 22 Name: deadcodeName, 23 Doc: goanalysis.TheOnlyanalyzerDoc, 24 Run: func(pass *analysis.Pass) (interface{}, error) { 25 prog := goanalysis.MakeFakeLoaderProgram(pass) 26 27 issues, err := deadcodeAPI.Run(prog) 28 if err != nil { 29 return nil, err 30 } 31 32 res := make([]goanalysis.Issue, 0, len(issues)) 33 for _, i := range issues { 34 res = append(res, goanalysis.NewIssue(&result.Issue{ 35 Pos: i.Pos, 36 Text: fmt.Sprintf("%s is unused", formatCode(i.UnusedIdentName, nil)), 37 FromLinter: deadcodeName, 38 }, pass)) 39 } 40 41 if len(issues) == 0 { 42 return nil, nil 43 } 44 45 mu.Lock() 46 resIssues = append(resIssues, res...) 47 mu.Unlock() 48 49 return nil, nil 50 }, 51 } 52 53 return goanalysis.NewLinter( 54 deadcodeName, 55 "Finds unused code", 56 []*analysis.Analyzer{analyzer}, 57 nil, 58 ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 59 return resIssues 60 }).WithLoadMode(goanalysis.LoadModeTypesInfo) 61 }