github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/unused.go (about)

     1  package golinters
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"golang.org/x/tools/go/analysis"
     8  	"honnef.co/go/tools/unused"
     9  
    10  	"github.com/elek/golangci-lint/pkg/config"
    11  	"github.com/elek/golangci-lint/pkg/golinters/goanalysis"
    12  	"github.com/elek/golangci-lint/pkg/lint/linter"
    13  	"github.com/elek/golangci-lint/pkg/result"
    14  )
    15  
    16  type UnusedSettings struct {
    17  	GoVersion string
    18  }
    19  
    20  func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
    21  	const name = "unused"
    22  
    23  	var mu sync.Mutex
    24  	var resIssues []goanalysis.Issue
    25  
    26  	analyzer := &analysis.Analyzer{
    27  		Name:     name,
    28  		Doc:      unused.Analyzer.Analyzer.Doc,
    29  		Requires: unused.Analyzer.Analyzer.Requires,
    30  		Run: func(pass *analysis.Pass) (interface{}, error) {
    31  			res, err := unused.Analyzer.Analyzer.Run(pass)
    32  			if err != nil {
    33  				return nil, err
    34  			}
    35  
    36  			sr := unused.Serialize(pass, res.(unused.Result), pass.Fset)
    37  
    38  			var issues []goanalysis.Issue
    39  			for _, object := range sr.Unused {
    40  				issue := goanalysis.NewIssue(&result.Issue{
    41  					FromLinter: name,
    42  					Text:       fmt.Sprintf("%s %s is unused", object.Kind, object.Name),
    43  					Pos:        object.Position,
    44  				}, pass)
    45  
    46  				issues = append(issues, issue)
    47  			}
    48  
    49  			mu.Lock()
    50  			resIssues = append(resIssues, issues...)
    51  			mu.Unlock()
    52  
    53  			return nil, nil
    54  		},
    55  	}
    56  
    57  	setAnalyzerGoVersion(analyzer, getGoVersion(settings))
    58  
    59  	lnt := goanalysis.NewLinter(
    60  		name,
    61  		"Checks Go code for unused constants, variables, functions and types",
    62  		[]*analysis.Analyzer{analyzer},
    63  		nil,
    64  	).WithIssuesReporter(func(lintCtx *linter.Context) []goanalysis.Issue {
    65  		return resIssues
    66  	}).WithLoadMode(goanalysis.LoadModeTypesInfo)
    67  
    68  	return lnt
    69  }