1
1
package processors
2
2
3
3
import (
4
+ "cmp"
4
5
"errors"
5
6
"fmt"
6
7
"slices"
7
- "sort"
8
8
"strings"
9
9
10
10
"github.com/golangci/golangci-lint/pkg/config"
@@ -22,6 +22,12 @@ const (
22
22
orderNameSeverity = "severity"
23
23
)
24
24
25
+ const (
26
+ less = iota - 1
27
+ equal
28
+ greater
29
+ )
30
+
25
31
var _ Processor = (* SortResults )(nil )
26
32
27
33
type SortResults struct {
@@ -67,77 +73,50 @@ func (p SortResults) Process(issues []result.Issue) ([]result.Issue, error) {
67
73
cmps = append (cmps , c )
68
74
}
69
75
70
- cmp , err := mergeComparators (cmps )
76
+ comp , err := mergeComparators (cmps )
71
77
if err != nil {
72
78
return nil , err
73
79
}
74
80
75
- sort . Slice (issues , func (i , j int ) bool {
76
- return cmp .Compare (& issues [ i ] , & issues [ j ]) == less
81
+ slices . SortFunc (issues , func (a , b result. Issue ) int {
82
+ return comp .Compare (& a , & b )
77
83
})
78
84
79
85
return issues , nil
80
86
}
81
87
82
88
func (SortResults ) Finish () {}
83
89
84
- type compareResult int
85
-
86
- const (
87
- less compareResult = iota - 1
88
- equal
89
- greater
90
- none
91
- )
92
-
93
- func (c compareResult ) isNeutral () bool {
94
- // return true if compare result is incomparable or equal.
95
- return c == none || c == equal
96
- }
97
-
98
- func (c compareResult ) String () string {
99
- switch c {
100
- case less :
101
- return "less"
102
- case equal :
103
- return "equal"
104
- case greater :
105
- return "greater"
106
- default :
107
- return "none"
108
- }
109
- }
110
-
111
90
// comparator describes how to implement compare for two "issues".
112
91
type comparator struct {
113
92
name string
114
- compare func (a , b * result.Issue ) compareResult
93
+ compare func (a , b * result.Issue ) int
115
94
next * comparator
116
95
}
117
96
118
- func (cmp * comparator ) Next () * comparator { return cmp .next }
97
+ func (cp * comparator ) Next () * comparator { return cp .next }
119
98
120
- func (cmp * comparator ) SetNext (c * comparator ) * comparator {
121
- cmp .next = c
122
- return cmp
99
+ func (cp * comparator ) SetNext (c * comparator ) * comparator {
100
+ cp .next = c
101
+ return cp
123
102
}
124
103
125
- func (cmp * comparator ) String () string {
126
- s := cmp .name
127
- if cmp .Next () != nil {
128
- s += " > " + cmp .Next ().String ()
104
+ func (cp * comparator ) String () string {
105
+ s := cp .name
106
+ if cp .Next () != nil {
107
+ s += " > " + cp .Next ().String ()
129
108
}
130
109
131
110
return s
132
111
}
133
112
134
- func (cmp * comparator ) Compare (a , b * result.Issue ) compareResult {
135
- res := cmp .compare (a , b )
136
- if ! res . isNeutral () {
113
+ func (cp * comparator ) Compare (a , b * result.Issue ) int {
114
+ res := cp .compare (a , b )
115
+ if res != equal {
137
116
return res
138
117
}
139
118
140
- if next := cmp .Next (); next != nil {
119
+ if next := cp .Next (); next != nil {
141
120
return next .Compare (a , b )
142
121
}
143
122
@@ -147,16 +126,16 @@ func (cmp *comparator) Compare(a, b *result.Issue) compareResult {
147
126
func byFileName () * comparator {
148
127
return & comparator {
149
128
name : "byFileName" ,
150
- compare : func (a , b * result.Issue ) compareResult {
151
- return compareResult ( strings .Compare (a .FilePath (), b .FilePath () ))
129
+ compare : func (a , b * result.Issue ) int {
130
+ return strings .Compare (a .FilePath (), b .FilePath ())
152
131
},
153
132
}
154
133
}
155
134
156
135
func byLine () * comparator {
157
136
return & comparator {
158
137
name : "byLine" ,
159
- compare : func (a , b * result.Issue ) compareResult {
138
+ compare : func (a , b * result.Issue ) int {
160
139
return numericCompare (a .Line (), b .Line ())
161
140
},
162
141
}
@@ -165,7 +144,7 @@ func byLine() *comparator {
165
144
func byColumn () * comparator {
166
145
return & comparator {
167
146
name : "byColumn" ,
168
- compare : func (a , b * result.Issue ) compareResult {
147
+ compare : func (a , b * result.Issue ) int {
169
148
return numericCompare (a .Column (), b .Column ())
170
149
},
171
150
}
@@ -174,16 +153,16 @@ func byColumn() *comparator {
174
153
func byLinter () * comparator {
175
154
return & comparator {
176
155
name : "byLinter" ,
177
- compare : func (a , b * result.Issue ) compareResult {
178
- return compareResult ( strings .Compare (a .FromLinter , b .FromLinter ) )
156
+ compare : func (a , b * result.Issue ) int {
157
+ return strings .Compare (a .FromLinter , b .FromLinter )
179
158
},
180
159
}
181
160
}
182
161
183
162
func bySeverity () * comparator {
184
163
return & comparator {
185
164
name : "bySeverity" ,
186
- compare : func (a , b * result.Issue ) compareResult {
165
+ compare : func (a , b * result.Issue ) int {
187
166
return severityCompare (a .Severity , b .Severity )
188
167
},
189
168
}
@@ -209,19 +188,12 @@ func findComparatorTip(cmp *comparator) *comparator {
209
188
return cmp
210
189
}
211
190
212
- func severityCompare (a , b string ) compareResult {
191
+ func severityCompare (a , b string ) int {
213
192
// The position inside the slice define the importance (lower to higher).
214
193
classic := []string {"low" , "medium" , "high" , "warning" , "error" }
215
194
216
195
if slices .Contains (classic , a ) && slices .Contains (classic , b ) {
217
- switch {
218
- case slices .Index (classic , a ) > slices .Index (classic , b ):
219
- return greater
220
- case slices .Index (classic , a ) < slices .Index (classic , b ):
221
- return less
222
- default :
223
- return equal
224
- }
196
+ return cmp .Compare (slices .Index (classic , a ), slices .Index (classic , b ))
225
197
}
226
198
227
199
if slices .Contains (classic , a ) {
@@ -232,28 +204,14 @@ func severityCompare(a, b string) compareResult {
232
204
return less
233
205
}
234
206
235
- return compareResult ( strings .Compare (a , b ) )
207
+ return strings .Compare (a , b )
236
208
}
237
209
238
- func numericCompare (a , b int ) compareResult {
239
- var (
240
- isValuesInvalid = a < 0 || b < 0
241
- isZeroValuesBoth = a == 0 && b == 0
242
- isEqual = a == b
243
- isZeroValueInA = b > 0 && a == 0
244
- isZeroValueInB = a > 0 && b == 0
245
- )
246
-
247
- switch {
248
- case isZeroValuesBoth || isEqual :
210
+ func numericCompare (a , b int ) int {
211
+ // Negative value and 0 are skipped because they either "neutral" (default value) or "invalid.
212
+ if a <= 0 || b <= 0 {
249
213
return equal
250
- case isValuesInvalid || isZeroValueInA || isZeroValueInB :
251
- return none
252
- case a > b :
253
- return greater
254
- case a < b :
255
- return less
256
214
}
257
215
258
- return equal
216
+ return cmp . Compare ( a , b )
259
217
}
0 commit comments