From df71654b2634a437624daeea8c1133a9364e10bf Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Wed, 12 Jun 2024 20:53:43 +0200 Subject: [PATCH] dev: improve revive construction (#4817) --- pkg/golinters/revive/revive.go | 44 ++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/pkg/golinters/revive/revive.go b/pkg/golinters/revive/revive.go index da44d9241468..3a76cee27e32 100644 --- a/pkg/golinters/revive/revive.go +++ b/pkg/golinters/revive/revive.go @@ -49,8 +49,14 @@ func New(settings *config.ReviveSettings) *goanalysis.Linter { []*analysis.Analyzer{analyzer}, nil, ).WithContextSetter(func(lintCtx *linter.Context) { + w, err := newWrapper(settings) + if err != nil { + lintCtx.Log.Errorf("setup revive: %v", err) + return + } + analyzer.Run = func(pass *analysis.Pass) (any, error) { - issues, err := runRevive(lintCtx, pass, settings) + issues, err := w.run(lintCtx, pass) if err != nil { return nil, err } @@ -70,10 +76,15 @@ func New(settings *config.ReviveSettings) *goanalysis.Linter { }).WithLoadMode(goanalysis.LoadModeSyntax) } -func runRevive(lintCtx *linter.Context, pass *analysis.Pass, settings *config.ReviveSettings) ([]goanalysis.Issue, error) { - packages := [][]string{internal.GetFileNames(pass)} +type wrapper struct { + revive lint.Linter + formatter lint.Formatter + lintingRules []lint.Rule + conf *lint.Config +} - conf, err := getReviveConfig(settings) +func newWrapper(settings *config.ReviveSettings) (*wrapper, error) { + conf, err := getConfig(settings) if err != nil { return nil, err } @@ -83,14 +94,23 @@ func runRevive(lintCtx *linter.Context, pass *analysis.Pass, settings *config.Re return nil, err } - revive := lint.New(os.ReadFile, settings.MaxOpenFiles) - lintingRules, err := reviveConfig.GetLintingRules(conf, []lint.Rule{}) if err != nil { return nil, err } - failures, err := revive.Lint(packages, lintingRules, *conf) + return &wrapper{ + revive: lint.New(os.ReadFile, settings.MaxOpenFiles), + formatter: formatter, + lintingRules: lintingRules, + conf: conf, + }, nil +} + +func (w *wrapper) run(lintCtx *linter.Context, pass *analysis.Pass) ([]goanalysis.Issue, error) { + packages := [][]string{internal.GetFileNames(pass)} + + failures, err := w.revive.Lint(packages, w.lintingRules, *w.conf) if err != nil { return nil, err } @@ -100,7 +120,7 @@ func runRevive(lintCtx *linter.Context, pass *analysis.Pass, settings *config.Re var output string go func() { - output, err = formatter.Format(formatChan, *conf) + output, err = w.formatter.Format(formatChan, *w.conf) if err != nil { lintCtx.Log.Errorf("Format error: %v", err) } @@ -108,7 +128,7 @@ func runRevive(lintCtx *linter.Context, pass *analysis.Pass, settings *config.Re }() for f := range failures { - if f.Confidence < conf.Confidence { + if f.Confidence < w.conf.Confidence { continue } @@ -126,13 +146,13 @@ func runRevive(lintCtx *linter.Context, pass *analysis.Pass, settings *config.Re var issues []goanalysis.Issue for i := range results { - issues = append(issues, reviveToIssue(pass, &results[i])) + issues = append(issues, toIssue(pass, &results[i])) } return issues, nil } -func reviveToIssue(pass *analysis.Pass, object *jsonObject) goanalysis.Issue { +func toIssue(pass *analysis.Pass, object *jsonObject) goanalysis.Issue { lineRangeTo := object.Position.End.Line if object.RuleName == (&rule.ExportedRule{}).Name() { lineRangeTo = object.Position.Start.Line @@ -160,7 +180,7 @@ func reviveToIssue(pass *analysis.Pass, object *jsonObject) goanalysis.Issue { // https://github.com/golangci/golangci-lint/issues/1745 // https://github.com/mgechev/revive/blob/v1.3.7/config/config.go#L217 // https://github.com/mgechev/revive/blob/v1.3.7/config/config.go#L169-L174 -func getReviveConfig(cfg *config.ReviveSettings) (*lint.Config, error) { +func getConfig(cfg *config.ReviveSettings) (*lint.Config, error) { conf := defaultConfig() if !reflect.DeepEqual(cfg, &config.ReviveSettings{}) {