@@ -3,7 +3,6 @@ package revive
33import (
44 "bytes"
55 "cmp"
6- "encoding/json"
76 "fmt"
87 "go/token"
98 "os"
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-
4336func 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
8679type 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