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 }