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  }