github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/forbidigo.go (about) 1 package golinters 2 3 import ( 4 "sync" 5 6 "github.com/ashanbrown/forbidigo/forbidigo" 7 "github.com/pkg/errors" 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 NewForbidigo() *goanalysis.Linter { 16 const linterName = "forbidigo" 17 var mu sync.Mutex 18 var resIssues []goanalysis.Issue 19 20 analyzer := &analysis.Analyzer{ 21 Name: linterName, 22 Doc: goanalysis.TheOnlyanalyzerDoc, 23 } 24 return goanalysis.NewLinter( 25 linterName, 26 "Forbids identifiers", 27 []*analysis.Analyzer{analyzer}, 28 nil, 29 ).WithContextSetter(func(lintCtx *linter.Context) { 30 s := &lintCtx.Settings().Forbidigo 31 32 analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { 33 var res []goanalysis.Issue 34 options := []forbidigo.Option{ 35 forbidigo.OptionExcludeGodocExamples(s.ExcludeGodocExamples), 36 // disable "//permit" directives so only "//nolint" directives matters within golangci lint 37 forbidigo.OptionIgnorePermitDirectives(true), 38 } 39 forbid, err := forbidigo.NewLinter(s.Forbid, options...) 40 if err != nil { 41 return nil, errors.Wrapf(err, "failed to create linter %q", linterName) 42 } 43 44 for _, file := range pass.Files { 45 hints, err := forbid.Run(pass.Fset, file) 46 if err != nil { 47 return nil, errors.Wrapf(err, "forbidigo linter failed on file %q", file.Name.String()) 48 } 49 for _, hint := range hints { 50 res = append(res, goanalysis.NewIssue(&result.Issue{ 51 Pos: hint.Position(), 52 Text: hint.Details(), 53 FromLinter: linterName, 54 }, pass)) 55 } 56 } 57 58 if len(res) == 0 { 59 return nil, nil 60 } 61 62 mu.Lock() 63 resIssues = append(resIssues, res...) 64 mu.Unlock() 65 return nil, nil 66 } 67 }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 68 return resIssues 69 }).WithLoadMode(goanalysis.LoadModeSyntax) 70 }