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  }