github.com/chenfeining/golangci-lint@v1.0.2-0.20230730162517-14c6c67868df/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/chenfeining/golangci-lint/pkg/config" 10 "github.com/chenfeining/golangci-lint/pkg/golinters/goanalysis" 11 "github.com/chenfeining/golangci-lint/pkg/lint/linter" 12 "github.com/chenfeining/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 conf.ForceCuddleErrCheckAndAssign = settings.ForceCuddleErrCheckAndAssign 36 conf.ErrorVariableNames = settings.ErrorVariableNames 37 conf.ForceExclusiveShortDeclarations = settings.ForceExclusiveShortDeclarations 38 } 39 40 analyzer := &analysis.Analyzer{ 41 Name: goanalysis.TheOnlyAnalyzerName, 42 Doc: goanalysis.TheOnlyanalyzerDoc, 43 Run: func(pass *analysis.Pass) (any, error) { 44 issues := runWSL(pass, &conf) 45 46 if len(issues) == 0 { 47 return nil, nil 48 } 49 50 mu.Lock() 51 resIssues = append(resIssues, issues...) 52 mu.Unlock() 53 54 return nil, nil 55 }, 56 } 57 58 return goanalysis.NewLinter( 59 wslName, 60 "Whitespace Linter - Forces you to use empty lines!", 61 []*analysis.Analyzer{analyzer}, 62 nil, 63 ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { 64 return resIssues 65 }).WithLoadMode(goanalysis.LoadModeSyntax) 66 } 67 68 func runWSL(pass *analysis.Pass, conf *wsl.Configuration) []goanalysis.Issue { 69 if conf == nil { 70 return nil 71 } 72 73 files := getFileNames(pass) 74 wslErrors, _ := wsl.NewProcessorWithConfig(*conf).ProcessFiles(files) 75 if len(wslErrors) == 0 { 76 return nil 77 } 78 79 var issues []goanalysis.Issue 80 for _, err := range wslErrors { 81 issues = append(issues, goanalysis.NewIssue(&result.Issue{ 82 FromLinter: wslName, 83 Pos: err.Position, 84 Text: err.Reason, 85 }, pass)) 86 } 87 88 return issues 89 }