github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/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/elek/golangci-lint/pkg/golinters/goanalysis" 10 "github.com/elek/golangci-lint/pkg/lint/linter" 11 "github.com/elek/golangci-lint/pkg/result" 12 ) 13 14 func NewUnconvert() *goanalysis.Linter { 15 const linterName = "unconvert" 16 var mu sync.Mutex 17 var res []goanalysis.Issue 18 analyzer := &analysis.Analyzer{ 19 Name: linterName, 20 Doc: goanalysis.TheOnlyanalyzerDoc, 21 } 22 return goanalysis.NewLinter( 23 linterName, 24 "Remove unnecessary type conversions", 25 []*analysis.Analyzer{analyzer}, 26 nil, 27 ).WithContextSetter(func(lintCtx *linter.Context) { 28 analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { 29 prog := goanalysis.MakeFakeLoaderProgram(pass) 30 31 positions := unconvertAPI.Run(prog) 32 if len(positions) == 0 { 33 return nil, nil 34 } 35 36 issues := make([]goanalysis.Issue, 0, len(positions)) 37 for _, pos := range positions { 38 issues = append(issues, goanalysis.NewIssue(&result.Issue{ 39 Pos: pos, 40 Text: "unnecessary conversion", 41 FromLinter: linterName, 42 }, pass)) 43 } 44 45 mu.Lock() 46 res = append(res, issues...) 47 mu.Unlock() 48 return nil, nil 49 } 50 }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 51 return res 52 }).WithLoadMode(goanalysis.LoadModeTypesInfo) 53 }