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  }