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  }