github.com/nozzle/golangci-lint@v1.49.0-nz3/pkg/golinters/unconvert.go (about) 1 package golinters 2 3 import ( 4 "sync" 5 6 unconvertAPI "github.com/golangci/unconvert" 7 "golang.org/x/tools/go/analysis" 8 9 "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" 10 "github.com/golangci/golangci-lint/pkg/lint/linter" 11 "github.com/golangci/golangci-lint/pkg/result" 12 ) 13 14 const unconvertName = "unconvert" 15 16 //nolint:dupl 17 func NewUnconvert() *goanalysis.Linter { 18 var mu sync.Mutex 19 var resIssues []goanalysis.Issue 20 21 analyzer := &analysis.Analyzer{ 22 Name: unconvertName, 23 Doc: goanalysis.TheOnlyanalyzerDoc, 24 Run: func(pass *analysis.Pass) (interface{}, error) { 25 issues := runUnconvert(pass) 26 27 if len(issues) == 0 { 28 return nil, nil 29 } 30 31 mu.Lock() 32 resIssues = append(resIssues, issues...) 33 mu.Unlock() 34 35 return nil, nil 36 }, 37 } 38 39 return goanalysis.NewLinter( 40 unconvertName, 41 "Remove unnecessary type conversions", 42 []*analysis.Analyzer{analyzer}, 43 nil, 44 ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 45 return resIssues 46 }).WithLoadMode(goanalysis.LoadModeTypesInfo) 47 } 48 49 func runUnconvert(pass *analysis.Pass) []goanalysis.Issue { 50 prog := goanalysis.MakeFakeLoaderProgram(pass) 51 52 positions := unconvertAPI.Run(prog) 53 if len(positions) == 0 { 54 return nil 55 } 56 57 issues := make([]goanalysis.Issue, 0, len(positions)) 58 for _, pos := range positions { 59 issues = append(issues, goanalysis.NewIssue(&result.Issue{ 60 Pos: pos, 61 Text: "unnecessary conversion", 62 FromLinter: unconvertName, 63 }, pass)) 64 } 65 66 return issues 67 }