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  }