Skip to content

Commit b5f07ea

Browse files
committed
refactor: use standard comparison values
1 parent e0e37c4 commit b5f07ea

File tree

2 files changed

+60
-91
lines changed

2 files changed

+60
-91
lines changed

pkg/result/processors/sort_results.go

+37-79
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package processors
22

33
import (
4+
"cmp"
45
"errors"
56
"fmt"
67
"slices"
7-
"sort"
88
"strings"
99

1010
"github.com/golangci/golangci-lint/pkg/config"
@@ -22,6 +22,12 @@ const (
2222
orderNameSeverity = "severity"
2323
)
2424

25+
const (
26+
less = iota - 1
27+
equal
28+
greater
29+
)
30+
2531
var _ Processor = (*SortResults)(nil)
2632

2733
type SortResults struct {
@@ -67,77 +73,50 @@ func (p SortResults) Process(issues []result.Issue) ([]result.Issue, error) {
6773
cmps = append(cmps, c)
6874
}
6975

70-
cmp, err := mergeComparators(cmps)
76+
comp, err := mergeComparators(cmps)
7177
if err != nil {
7278
return nil, err
7379
}
7480

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)
7783
})
7884

7985
return issues, nil
8086
}
8187

8288
func (SortResults) Finish() {}
8389

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-
11190
// comparator describes how to implement compare for two "issues".
11291
type comparator struct {
11392
name string
114-
compare func(a, b *result.Issue) compareResult
93+
compare func(a, b *result.Issue) int
11594
next *comparator
11695
}
11796

118-
func (cmp *comparator) Next() *comparator { return cmp.next }
97+
func (cp *comparator) Next() *comparator { return cp.next }
11998

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
123102
}
124103

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()
129108
}
130109

131110
return s
132111
}
133112

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 {
137116
return res
138117
}
139118

140-
if next := cmp.Next(); next != nil {
119+
if next := cp.Next(); next != nil {
141120
return next.Compare(a, b)
142121
}
143122

@@ -147,16 +126,16 @@ func (cmp *comparator) Compare(a, b *result.Issue) compareResult {
147126
func byFileName() *comparator {
148127
return &comparator{
149128
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())
152131
},
153132
}
154133
}
155134

156135
func byLine() *comparator {
157136
return &comparator{
158137
name: "byLine",
159-
compare: func(a, b *result.Issue) compareResult {
138+
compare: func(a, b *result.Issue) int {
160139
return numericCompare(a.Line(), b.Line())
161140
},
162141
}
@@ -165,7 +144,7 @@ func byLine() *comparator {
165144
func byColumn() *comparator {
166145
return &comparator{
167146
name: "byColumn",
168-
compare: func(a, b *result.Issue) compareResult {
147+
compare: func(a, b *result.Issue) int {
169148
return numericCompare(a.Column(), b.Column())
170149
},
171150
}
@@ -174,16 +153,16 @@ func byColumn() *comparator {
174153
func byLinter() *comparator {
175154
return &comparator{
176155
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)
179158
},
180159
}
181160
}
182161

183162
func bySeverity() *comparator {
184163
return &comparator{
185164
name: "bySeverity",
186-
compare: func(a, b *result.Issue) compareResult {
165+
compare: func(a, b *result.Issue) int {
187166
return severityCompare(a.Severity, b.Severity)
188167
},
189168
}
@@ -209,19 +188,12 @@ func findComparatorTip(cmp *comparator) *comparator {
209188
return cmp
210189
}
211190

212-
func severityCompare(a, b string) compareResult {
191+
func severityCompare(a, b string) int {
213192
// The position inside the slice define the importance (lower to higher).
214193
classic := []string{"low", "medium", "high", "warning", "error"}
215194

216195
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))
225197
}
226198

227199
if slices.Contains(classic, a) {
@@ -232,28 +204,14 @@ func severityCompare(a, b string) compareResult {
232204
return less
233205
}
234206

235-
return compareResult(strings.Compare(a, b))
207+
return strings.Compare(a, b)
236208
}
237209

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 {
249213
return equal
250-
case isValuesInvalid || isZeroValueInA || isZeroValueInB:
251-
return none
252-
case a > b:
253-
return greater
254-
case a < b:
255-
return less
256214
}
257215

258-
return equal
216+
return cmp.Compare(a, b)
259217
}

pkg/result/processors/sort_results_test.go

+23-12
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ var extraSeverityIssues = []result.Issue{
7373

7474
type compareTestCase struct {
7575
a, b result.Issue
76-
expected compareResult
76+
expected int
7777
}
7878

7979
func testCompareValues(t *testing.T, cmp *comparator, name string, tests []compareTestCase) {
@@ -82,7 +82,7 @@ func testCompareValues(t *testing.T, cmp *comparator, name string, tests []compa
8282
for i, test := range tests { //nolint:gocritic // To ignore rangeValCopy rule
8383
t.Run(fmt.Sprintf("%s(%d)", name, i), func(t *testing.T) {
8484
res := cmp.Compare(&test.a, &test.b)
85-
assert.Equal(t, test.expected.String(), res.String())
85+
assert.Equal(t, compToString(test.expected), compToString(res))
8686
})
8787
}
8888
}
@@ -121,13 +121,13 @@ func TestCompareByFileName(t *testing.T) {
121121
func TestCompareByColumn(t *testing.T) {
122122
testCompareValues(t, byColumn(), "Compare By Column", []compareTestCase{
123123
{issues[0], issues[1], greater}, // 80 vs 70
124-
{issues[1], issues[2], none}, // 70 vs zero value
124+
{issues[1], issues[2], equal}, // 70 vs zero value
125125
{issues[3], issues[3], equal}, // 60 vs 60
126-
{issues[2], issues[3], none}, // zero value vs 60
127-
{issues[2], issues[1], none}, // zero value vs 70
126+
{issues[2], issues[3], equal}, // zero value vs 60
127+
{issues[2], issues[1], equal}, // zero value vs 70
128128
{issues[1], issues[0], less}, // 70 vs 80
129129
{issues[1], issues[1], equal}, // 70 vs 70
130-
{issues[3], issues[2], none}, // vs zero value
130+
{issues[3], issues[2], equal}, // vs zero value
131131
{issues[2], issues[2], equal}, // zero value vs zero value
132132
{issues[1], issues[1], equal}, // 70 vs 70
133133
})
@@ -185,13 +185,13 @@ func TestCompareNested(t *testing.T) {
185185
func TestNumericCompare(t *testing.T) {
186186
tests := []struct {
187187
a, b int
188-
expected compareResult
188+
expected int
189189
}{
190190
{0, 0, equal},
191-
{0, 1, none},
192-
{1, 0, none},
193-
{1, -1, none},
194-
{-1, 1, none},
191+
{0, 1, equal},
192+
{1, 0, equal},
193+
{1, -1, equal},
194+
{-1, 1, equal},
195195
{1, 1, equal},
196196
{1, 2, less},
197197
{2, 1, greater},
@@ -202,7 +202,7 @@ func TestNumericCompare(t *testing.T) {
202202
for i, test := range tests {
203203
t.Run(fmt.Sprintf("%s(%d)", "Numeric Compare", i), func(t *testing.T) {
204204
res := numericCompare(test.a, test.b)
205-
assert.Equal(t, test.expected.String(), res.String())
205+
assert.Equal(t, compToString(test.expected), compToString(res))
206206
})
207207
}
208208
}
@@ -280,3 +280,14 @@ func Test_mergeComparators_error(t *testing.T) {
280280
_, err := mergeComparators(nil)
281281
require.EqualError(t, err, "no comparator")
282282
}
283+
284+
func compToString(c int) string {
285+
switch c {
286+
case less:
287+
return "less"
288+
case greater:
289+
return "greater"
290+
default:
291+
return "equal"
292+
}
293+
}

0 commit comments

Comments
 (0)