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