11package processors
22
33import (
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+
2531var _ Processor = (* SortResults )(nil )
2632
2733type 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
8288func (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".
11291type 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 {
147126func 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
156135func 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 {
165144func 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 {
174153func 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
183162func 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}
0 commit comments