1
1
package nestif
2
2
3
3
import (
4
- "sort"
5
- "sync"
6
-
7
4
"github.com/nakabonne/nestif"
8
5
"golang.org/x/tools/go/analysis"
9
6
10
7
"github.com/golangci/golangci-lint/pkg/config"
11
8
"github.com/golangci/golangci-lint/pkg/goanalysis"
12
- "github.com/golangci/golangci-lint/pkg/lint/linter"
13
- "github.com/golangci/golangci-lint/pkg/result"
14
9
)
15
10
16
11
const linterName = "nestif"
17
12
18
13
func New (settings * config.NestifSettings ) * goanalysis.Linter {
19
- var mu sync.Mutex
20
- var resIssues []goanalysis.Issue
21
-
22
14
analyzer := & analysis.Analyzer {
23
- Name : goanalysis . TheOnlyAnalyzerName ,
15
+ Name : linterName ,
24
16
Doc : goanalysis .TheOnlyanalyzerDoc ,
25
17
Run : func (pass * analysis.Pass ) (any , error ) {
26
- issues := runNestIf (pass , settings )
27
-
28
- if len (issues ) == 0 {
29
- return nil , nil
30
- }
31
-
32
- mu .Lock ()
33
- resIssues = append (resIssues , issues ... )
34
- mu .Unlock ()
18
+ runNestIf (pass , settings )
35
19
36
20
return nil , nil
37
21
},
@@ -42,37 +26,31 @@ func New(settings *config.NestifSettings) *goanalysis.Linter {
42
26
"Reports deeply nested if statements" ,
43
27
[]* analysis.Analyzer {analyzer },
44
28
nil ,
45
- ).WithIssuesReporter (func (* linter.Context ) []goanalysis.Issue {
46
- return resIssues
47
- }).WithLoadMode (goanalysis .LoadModeSyntax )
29
+ ).WithLoadMode (goanalysis .LoadModeSyntax )
48
30
}
49
31
50
- func runNestIf (pass * analysis.Pass , settings * config.NestifSettings ) []goanalysis. Issue {
32
+ func runNestIf (pass * analysis.Pass , settings * config.NestifSettings ) {
51
33
checker := & nestif.Checker {
52
34
MinComplexity : settings .MinComplexity ,
53
35
}
54
36
55
- var lintIssues []nestif.Issue
56
- for _ , f := range pass .Files {
57
- lintIssues = append (lintIssues , checker .Check (f , pass .Fset )... )
58
- }
37
+ for _ , file := range pass .Files {
38
+ position := goanalysis .GetFilePosition (pass , file )
59
39
60
- if len (lintIssues ) == 0 {
61
- return nil
62
- }
40
+ issues := checker .Check (file , pass .Fset )
41
+ if len (issues ) == 0 {
42
+ continue
43
+ }
63
44
64
- sort .SliceStable (lintIssues , func (i , j int ) bool {
65
- return lintIssues [i ].Complexity > lintIssues [j ].Complexity
66
- })
45
+ nonAdjPosition := pass .Fset .PositionFor (file .Pos (), false )
67
46
68
- issues := make ([]goanalysis.Issue , 0 , len (lintIssues ))
69
- for _ , i := range lintIssues {
70
- issues = append (issues , goanalysis .NewIssue (& result.Issue {
71
- Pos : i .Pos ,
72
- Text : i .Message ,
73
- FromLinter : linterName ,
74
- }, pass ))
75
- }
47
+ f := pass .Fset .File (file .Pos ())
76
48
77
- return issues
49
+ for _ , issue := range issues {
50
+ pass .Report (analysis.Diagnostic {
51
+ Pos : f .LineStart (goanalysis .AdjustPos (issue .Pos .Line , nonAdjPosition .Line , position .Line )),
52
+ Message : issue .Message ,
53
+ })
54
+ }
55
+ }
78
56
}
0 commit comments