Skip to content

Commit 444b819

Browse files
authored
dev: simplify revive implementation (#5552)
1 parent 313f829 commit 444b819

File tree

1 file changed

+35
-62
lines changed

1 file changed

+35
-62
lines changed

Diff for: pkg/golinters/revive/revive.go

+35-62
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package revive
33
import (
44
"bytes"
55
"cmp"
6-
"encoding/json"
76
"fmt"
87
"go/token"
98
"os"
@@ -34,12 +33,6 @@ var (
3433
isDebug = logutils.HaveDebugTag(logutils.DebugKeyRevive)
3534
)
3635

37-
// jsonObject defines a JSON object of a failure
38-
type jsonObject struct {
39-
Severity lint.Severity
40-
lint.Failure `json:",inline"`
41-
}
42-
4336
func New(settings *config.ReviveSettings) *goanalysis.Linter {
4437
var mu sync.Mutex
4538
var resIssues []goanalysis.Issue
@@ -63,7 +56,7 @@ func New(settings *config.ReviveSettings) *goanalysis.Linter {
6356
}
6457

6558
analyzer.Run = func(pass *analysis.Pass) (any, error) {
66-
issues, err := w.run(lintCtx, pass)
59+
issues, err := w.run(pass)
6760
if err != nil {
6861
return nil, err
6962
}
@@ -85,7 +78,6 @@ func New(settings *config.ReviveSettings) *goanalysis.Linter {
8578

8679
type wrapper struct {
8780
revive lint.Linter
88-
formatter lint.Formatter
8981
lintingRules []lint.Rule
9082
conf *lint.Config
9183
}
@@ -103,101 +95,70 @@ func newWrapper(settings *config.ReviveSettings) (*wrapper, error) {
10395
return nil, err
10496
}
10597

106-
formatter, err := reviveConfig.GetFormatter("json")
107-
if err != nil {
108-
return nil, err
109-
}
110-
11198
lintingRules, err := reviveConfig.GetLintingRules(conf, []lint.Rule{})
11299
if err != nil {
113100
return nil, err
114101
}
115102

116103
return &wrapper{
117104
revive: lint.New(os.ReadFile, settings.MaxOpenFiles),
118-
formatter: formatter,
119105
lintingRules: lintingRules,
120106
conf: conf,
121107
}, nil
122108
}
123109

124-
func (w *wrapper) run(lintCtx *linter.Context, pass *analysis.Pass) ([]goanalysis.Issue, error) {
110+
func (w *wrapper) run(pass *analysis.Pass) ([]goanalysis.Issue, error) {
125111
packages := [][]string{internal.GetGoFileNames(pass)}
126112

127113
failures, err := w.revive.Lint(packages, w.lintingRules, *w.conf)
128114
if err != nil {
129115
return nil, err
130116
}
131117

132-
formatChan := make(chan lint.Failure)
133-
exitChan := make(chan bool)
134-
135-
var output string
136-
go func() {
137-
output, err = w.formatter.Format(formatChan, *w.conf)
138-
if err != nil {
139-
lintCtx.Log.Errorf("Format error: %v", err)
140-
}
141-
exitChan <- true
142-
}()
143-
144-
for f := range failures {
145-
if f.Confidence < w.conf.Confidence {
118+
var issues []goanalysis.Issue
119+
for failure := range failures {
120+
if failure.Confidence < w.conf.Confidence {
146121
continue
147122
}
148123

149-
formatChan <- f
150-
}
151-
152-
close(formatChan)
153-
<-exitChan
154-
155-
var results []jsonObject
156-
err = json.Unmarshal([]byte(output), &results)
157-
if err != nil {
158-
return nil, err
159-
}
160-
161-
var issues []goanalysis.Issue
162-
for i := range results {
163-
issues = append(issues, toIssue(pass, &results[i]))
124+
issues = append(issues, w.toIssue(pass, &failure))
164125
}
165126

166127
return issues, nil
167128
}
168129

169-
func toIssue(pass *analysis.Pass, object *jsonObject) goanalysis.Issue {
170-
lineRangeTo := object.Position.End.Line
171-
if object.RuleName == (&rule.ExportedRule{}).Name() {
172-
lineRangeTo = object.Position.Start.Line
130+
func (w *wrapper) toIssue(pass *analysis.Pass, failure *lint.Failure) goanalysis.Issue {
131+
lineRangeTo := failure.Position.End.Line
132+
if failure.RuleName == (&rule.ExportedRule{}).Name() {
133+
lineRangeTo = failure.Position.Start.Line
173134
}
174135

175136
issue := &result.Issue{
176-
Severity: string(object.Severity),
177-
Text: fmt.Sprintf("%s: %s", object.RuleName, object.Failure.Failure),
137+
Severity: string(severity(w.conf, failure)),
138+
Text: fmt.Sprintf("%s: %s", failure.RuleName, failure.Failure),
178139
Pos: token.Position{
179-
Filename: object.Position.Start.Filename,
180-
Line: object.Position.Start.Line,
181-
Offset: object.Position.Start.Offset,
182-
Column: object.Position.Start.Column,
140+
Filename: failure.Position.Start.Filename,
141+
Line: failure.Position.Start.Line,
142+
Offset: failure.Position.Start.Offset,
143+
Column: failure.Position.Start.Column,
183144
},
184145
LineRange: &result.Range{
185-
From: object.Position.Start.Line,
146+
From: failure.Position.Start.Line,
186147
To: lineRangeTo,
187148
},
188149
FromLinter: linterName,
189150
}
190151

191-
if object.ReplacementLine != "" {
192-
f := pass.Fset.File(token.Pos(object.Position.Start.Offset))
152+
if failure.ReplacementLine != "" {
153+
f := pass.Fset.File(token.Pos(failure.Position.Start.Offset))
193154

194155
// Skip cgo files because the positions are wrong.
195-
if object.GetFilename() == f.Name() {
156+
if failure.GetFilename() == f.Name() {
196157
issue.SuggestedFixes = []analysis.SuggestedFix{{
197158
TextEdits: []analysis.TextEdit{{
198-
Pos: f.LineStart(object.Position.Start.Line),
199-
End: goanalysis.EndOfLinePos(f, object.Position.End.Line),
200-
NewText: []byte(object.ReplacementLine),
159+
Pos: f.LineStart(failure.Position.Start.Line),
160+
End: goanalysis.EndOfLinePos(f, failure.Position.End.Line),
161+
NewText: []byte(failure.ReplacementLine),
201162
}},
202163
}}
203164
}
@@ -489,3 +450,15 @@ func extractRulesName(rules []lint.Rule) []string {
489450

490451
return names
491452
}
453+
454+
// Extracted from https://github.com/mgechev/revive/blob/v1.7.0/formatter/severity.go
455+
// Modified to use pointers (related to hugeParam rule).
456+
func severity(config *lint.Config, failure *lint.Failure) lint.Severity {
457+
if cfg, ok := config.Rules[failure.RuleName]; ok && cfg.Severity == lint.SeverityError {
458+
return lint.SeverityError
459+
}
460+
if cfg, ok := config.Directives[failure.RuleName]; ok && cfg.Severity == lint.SeverityError {
461+
return lint.SeverityError
462+
}
463+
return lint.SeverityWarning
464+
}

0 commit comments

Comments
 (0)