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 }