@@ -2,7 +2,6 @@ package golinters
2
2
3
3
import (
4
4
"fmt"
5
- "go/token"
6
5
"sync"
7
6
8
7
"github.com/ultraware/whitespace"
@@ -16,33 +15,29 @@ import (
16
15
17
16
const whitespaceName = "whitespace"
18
17
19
- //nolint:dupl
20
18
func NewWhitespace (settings * config.WhitespaceSettings ) * goanalysis.Linter {
21
19
var mu sync.Mutex
22
20
var resIssues []goanalysis.Issue
23
21
24
22
var wsSettings whitespace.Settings
25
23
if settings != nil {
26
24
wsSettings = whitespace.Settings {
25
+ Mode : whitespace .RunningModeGolangCI ,
27
26
MultiIf : settings .MultiIf ,
28
27
MultiFunc : settings .MultiFunc ,
29
28
}
30
29
}
31
30
32
- analyzer := & analysis.Analyzer {
33
- Name : whitespaceName ,
34
- Doc : goanalysis .TheOnlyanalyzerDoc ,
35
- Run : goanalysis .DummyRun ,
36
- }
31
+ a := whitespace .NewAnalyzer (& wsSettings )
37
32
38
33
return goanalysis .NewLinter (
39
- whitespaceName ,
40
- "Tool for detection of leading and trailing whitespace" ,
41
- []* analysis.Analyzer {analyzer },
34
+ a . Name ,
35
+ a . Doc ,
36
+ []* analysis.Analyzer {a },
42
37
nil ,
43
38
).WithContextSetter (func (lintCtx * linter.Context ) {
44
- analyzer .Run = func (pass * analysis.Pass ) (any , error ) {
45
- issues , err := runWhitespace (lintCtx , pass , wsSettings )
39
+ a .Run = func (pass * analysis.Pass ) (any , error ) {
40
+ issues , err := runWhitespace (pass , wsSettings )
46
41
if err != nil {
47
42
return nil , err
48
43
}
@@ -62,46 +57,45 @@ func NewWhitespace(settings *config.WhitespaceSettings) *goanalysis.Linter {
62
57
}).WithLoadMode (goanalysis .LoadModeSyntax )
63
58
}
64
59
65
- func runWhitespace (lintCtx * linter.Context , pass * analysis.Pass , wsSettings whitespace.Settings ) ([]goanalysis.Issue , error ) {
66
- var messages []whitespace.Message
67
- for _ , file := range pass .Files {
68
- messages = append (messages , whitespace .Run (file , pass .Fset , wsSettings )... )
69
- }
70
-
71
- if len (messages ) == 0 {
72
- return nil , nil
73
- }
60
+ func runWhitespace (pass * analysis.Pass , wsSettings whitespace.Settings ) ([]goanalysis.Issue , error ) {
61
+ lintIssues := whitespace .Run (pass , & wsSettings )
74
62
75
- issues := make ([]goanalysis.Issue , len (messages ))
76
- for k , i := range messages {
77
- issue := result.Issue {
78
- Pos : token.Position {
79
- Filename : i .Pos .Filename ,
80
- Line : i .Pos .Line ,
81
- },
82
- LineRange : & result.Range {From : i .Pos .Line , To : i .Pos .Line },
83
- Text : i .Message ,
84
- FromLinter : whitespaceName ,
85
- Replacement : & result.Replacement {},
63
+ issues := make ([]goanalysis.Issue , len (lintIssues ))
64
+ for i , issue := range lintIssues {
65
+ report := & result.Issue {
66
+ FromLinter : whitespaceName ,
67
+ Pos : pass .Fset .PositionFor (issue .Diagnostic , false ),
68
+ Text : issue .Message ,
86
69
}
87
70
88
- bracketLine , err := lintCtx .LineCache .GetLine (issue .Pos .Filename , issue .Pos .Line )
89
- if err != nil {
90
- return nil , fmt .Errorf ("failed to get line %s:%d: %w" , issue .Pos .Filename , issue .Pos .Line , err )
91
- }
71
+ switch issue .MessageType {
72
+ case whitespace .MessageTypeRemove :
73
+ if len (issue .LineNumbers ) == 0 {
74
+ continue
75
+ }
76
+
77
+ report .LineRange = & result.Range {
78
+ From : issue .LineNumbers [0 ],
79
+ To : issue .LineNumbers [len (issue .LineNumbers )- 1 ],
80
+ }
81
+
82
+ report .Replacement = & result.Replacement {NeedOnlyDelete : true }
83
+
84
+ case whitespace .MessageTypeAdd :
85
+ report .Pos = pass .Fset .PositionFor (issue .FixStart , false )
86
+ report .Replacement = & result.Replacement {
87
+ Inline : & result.InlineFix {
88
+ StartCol : 0 ,
89
+ Length : 1 ,
90
+ NewString : "\n \t " ,
91
+ },
92
+ }
92
93
93
- switch i .Type {
94
- case whitespace .MessageTypeLeading :
95
- issue .LineRange .To ++ // cover two lines by the issue: opening bracket "{" (issue.Pos.Line) and following empty line
96
- case whitespace .MessageTypeTrailing :
97
- issue .LineRange .From -- // cover two lines by the issue: closing bracket "}" (issue.Pos.Line) and preceding empty line
98
- issue .Pos .Line -- // set in sync with LineRange.From to not break fixer and other code features
99
- case whitespace .MessageTypeAddAfter :
100
- bracketLine += "\n "
94
+ default :
95
+ return nil , fmt .Errorf ("unknown message type: %v" , issue .MessageType )
101
96
}
102
- issue .Replacement .NewLines = []string {bracketLine }
103
97
104
- issues [k ] = goanalysis .NewIssue (& issue , pass )
98
+ issues [i ] = goanalysis .NewIssue (report , pass )
105
99
}
106
100
107
101
return issues , nil
0 commit comments