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

     1  package golinters
     2  
     3  import (
     4  	"go/token"
     5  	"strings"
     6  	"sync"
     7  
     8  	"github.com/matoous/godox"
     9  	"golang.org/x/tools/go/analysis"
    10  
    11  	"github.com/golangci/golangci-lint/pkg/config"
    12  	"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
    13  	"github.com/golangci/golangci-lint/pkg/lint/linter"
    14  	"github.com/golangci/golangci-lint/pkg/result"
    15  )
    16  
    17  const godoxName = "godox"
    18  
    19  //nolint:dupl
    20  func NewGodox(settings *config.GodoxSettings) *goanalysis.Linter {
    21  	var mu sync.Mutex
    22  	var resIssues []goanalysis.Issue
    23  
    24  	analyzer := &analysis.Analyzer{
    25  		Name: godoxName,
    26  		Doc:  goanalysis.TheOnlyanalyzerDoc,
    27  		Run: func(pass *analysis.Pass) (interface{}, error) {
    28  			issues := runGodox(pass, settings)
    29  
    30  			if len(issues) == 0 {
    31  				return nil, nil
    32  			}
    33  
    34  			mu.Lock()
    35  			resIssues = append(resIssues, issues...)
    36  			mu.Unlock()
    37  
    38  			return nil, nil
    39  		},
    40  	}
    41  
    42  	return goanalysis.NewLinter(
    43  		godoxName,
    44  		"Tool for detection of FIXME, TODO and other comment keywords",
    45  		[]*analysis.Analyzer{analyzer},
    46  		nil,
    47  	).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
    48  		return resIssues
    49  	}).WithLoadMode(goanalysis.LoadModeSyntax)
    50  }
    51  
    52  func runGodox(pass *analysis.Pass, settings *config.GodoxSettings) []goanalysis.Issue {
    53  	var messages []godox.Message
    54  	for _, file := range pass.Files {
    55  		messages = append(messages, godox.Run(file, pass.Fset, settings.Keywords...)...)
    56  	}
    57  
    58  	if len(messages) == 0 {
    59  		return nil
    60  	}
    61  
    62  	issues := make([]goanalysis.Issue, len(messages))
    63  
    64  	for k, i := range messages {
    65  		issues[k] = goanalysis.NewIssue(&result.Issue{
    66  			Pos: token.Position{
    67  				Filename: i.Pos.Filename,
    68  				Line:     i.Pos.Line,
    69  			},
    70  			Text:       strings.TrimRight(i.Message, "\n"),
    71  			FromLinter: godoxName,
    72  		}, pass)
    73  	}
    74  
    75  	return issues
    76  }