github.com/nozzle/golangci-lint@v1.49.0-nz3/pkg/golinters/varcheck.go (about)

     1  package golinters
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	varcheckAPI "github.com/golangci/check/cmd/varcheck"
     8  	"golang.org/x/tools/go/analysis"
     9  
    10  	"github.com/golangci/golangci-lint/pkg/config"
    11  	"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
    12  	"github.com/golangci/golangci-lint/pkg/lint/linter"
    13  	"github.com/golangci/golangci-lint/pkg/result"
    14  )
    15  
    16  const varcheckName = "varcheck"
    17  
    18  func NewVarcheck(settings *config.VarCheckSettings) *goanalysis.Linter {
    19  	var mu sync.Mutex
    20  	var resIssues []goanalysis.Issue
    21  
    22  	analyzer := &analysis.Analyzer{
    23  		Name: varcheckName,
    24  		Doc:  goanalysis.TheOnlyanalyzerDoc,
    25  		Run:  goanalysis.DummyRun,
    26  	}
    27  
    28  	return goanalysis.NewLinter(
    29  		varcheckName,
    30  		"Finds unused global variables and constants",
    31  		[]*analysis.Analyzer{analyzer},
    32  		nil,
    33  	).WithContextSetter(func(lintCtx *linter.Context) {
    34  		analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
    35  			issues := runVarCheck(pass, settings)
    36  
    37  			if len(issues) == 0 {
    38  				return nil, nil
    39  			}
    40  
    41  			mu.Lock()
    42  			resIssues = append(resIssues, issues...)
    43  			mu.Unlock()
    44  
    45  			return nil, nil
    46  		}
    47  	}).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
    48  		return resIssues
    49  	}).WithLoadMode(goanalysis.LoadModeTypesInfo)
    50  }
    51  
    52  //nolint:dupl
    53  func runVarCheck(pass *analysis.Pass, settings *config.VarCheckSettings) []goanalysis.Issue {
    54  	prog := goanalysis.MakeFakeLoaderProgram(pass)
    55  
    56  	lintIssues := varcheckAPI.Run(prog, settings.CheckExportedFields)
    57  	if len(lintIssues) == 0 {
    58  		return nil
    59  	}
    60  
    61  	issues := make([]goanalysis.Issue, 0, len(lintIssues))
    62  
    63  	for _, i := range lintIssues {
    64  		issues = append(issues, goanalysis.NewIssue(&result.Issue{
    65  			Pos:        i.Pos,
    66  			Text:       fmt.Sprintf("%s is unused", formatCode(i.VarName, nil)),
    67  			FromLinter: varcheckName,
    68  		}, pass))
    69  	}
    70  
    71  	return issues
    72  }