github.com/nozzle/golangci-lint@v1.49.0-nz3/pkg/golinters/wsl.go (about) 1 package golinters 2 3 import ( 4 "sync" 5 6 "github.com/bombsimon/wsl/v3" 7 "golang.org/x/tools/go/analysis" 8 9 "github.com/golangci/golangci-lint/pkg/config" 10 "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" 11 "github.com/golangci/golangci-lint/pkg/lint/linter" 12 "github.com/golangci/golangci-lint/pkg/result" 13 ) 14 15 const wslName = "wsl" 16 17 // NewWSL returns a new WSL linter. 18 func NewWSL(settings *config.WSLSettings) *goanalysis.Linter { 19 var mu sync.Mutex 20 var resIssues []goanalysis.Issue 21 22 conf := wsl.DefaultConfig() 23 24 if settings != nil { 25 conf.StrictAppend = settings.StrictAppend 26 conf.AllowAssignAndCallCuddle = settings.AllowAssignAndCallCuddle 27 conf.AllowAssignAndAnythingCuddle = settings.AllowAssignAndAnythingCuddle 28 conf.AllowMultiLineAssignCuddle = settings.AllowMultiLineAssignCuddle 29 conf.ForceCaseTrailingWhitespaceLimit = settings.ForceCaseTrailingWhitespaceLimit 30 conf.AllowTrailingComment = settings.AllowTrailingComment 31 conf.AllowSeparatedLeadingComment = settings.AllowSeparatedLeadingComment 32 conf.AllowCuddleDeclaration = settings.AllowCuddleDeclaration 33 conf.AllowCuddleWithCalls = settings.AllowCuddleWithCalls 34 conf.AllowCuddleWithRHS = settings.AllowCuddleWithRHS 35 } 36 37 analyzer := &analysis.Analyzer{ 38 Name: goanalysis.TheOnlyAnalyzerName, 39 Doc: goanalysis.TheOnlyanalyzerDoc, 40 Run: func(pass *analysis.Pass) (interface{}, error) { 41 issues := runWSL(pass, &conf) 42 43 if len(issues) == 0 { 44 return nil, nil 45 } 46 47 mu.Lock() 48 resIssues = append(resIssues, issues...) 49 mu.Unlock() 50 51 return nil, nil 52 }, 53 } 54 55 return goanalysis.NewLinter( 56 wslName, 57 "Whitespace Linter - Forces you to use empty lines!", 58 []*analysis.Analyzer{analyzer}, 59 nil, 60 ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 61 return resIssues 62 }).WithLoadMode(goanalysis.LoadModeSyntax) 63 } 64 65 func runWSL(pass *analysis.Pass, conf *wsl.Configuration) []goanalysis.Issue { 66 if conf == nil { 67 return nil 68 } 69 70 files := getFileNames(pass) 71 wslErrors, _ := wsl.NewProcessorWithConfig(*conf).ProcessFiles(files) 72 if len(wslErrors) == 0 { 73 return nil 74 } 75 76 var issues []goanalysis.Issue 77 for _, err := range wslErrors { 78 issues = append(issues, goanalysis.NewIssue(&result.Issue{ 79 FromLinter: wslName, 80 Pos: err.Position, 81 Text: err.Reason, 82 }, pass)) 83 } 84 85 return issues 86 }