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  }