4 files changed,
21 insertions(+),
3 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-06-27 12:41:04 +0300
Authored at:
2026-06-26 19:13:49 +0300
Change ID:
qwnyowotrlrpozoqmtzkvnrqsyrxkpll
Parent:
992e56f
M
internal/linter/report.go
··· 7 7 "io" 8 8 "os" 9 9 "path/filepath" 10 + "sort" 10 11 ) 11 12 12 13 // PathStyle controls how file paths are shown in output. ··· 20 21 21 22 // Fprint writes finds in text format: file:line:col code: message. 22 23 func Fprint(w io.Writer, style PathStyle, finds []Find) { 24 + sortFinds(finds) 23 25 for _, find := range finds { 24 26 fmt.Fprintf(w, "%s:%d:%d: %s: %s\n", 25 27 formatPath(style, find.Span.Start.File), ··· 39 41 40 42 // FprintJSON writes finds as [FindJSON] array. 41 43 func FprintJSON(w io.Writer, style PathStyle, finds []Find) error { 44 + sortFinds(finds) 42 45 jsonFinds := make([]FindJSON, len(finds)) 43 46 for i, find := range finds { 44 47 jsonFinds[i] = FindJSON{ ··· 98 101 panic("impossible PathStyle value") 99 102 } 100 103 } 104 + 105 +func sortFinds(finds []Find) { 106 + sort.Slice(finds, func(i, j int) bool { 107 + if finds[i].Span.Start.Line != finds[j].Span.Start.Line { 108 + return finds[i].Span.Start.Line < finds[j].Span.Start.Line 109 + } 110 + if finds[i].Span.Start.Col != finds[j].Span.Start.Col { 111 + return finds[i].Span.Start.Col < finds[j].Span.Start.Col 112 + } 113 + if finds[i].Code != finds[j].Code { 114 + return finds[i].Code < finds[j].Code 115 + } 116 + return finds[i].Message < finds[j].Message 117 + }) 118 +}
M
internal/linter/testdata/duplicated-account.golden
··· 1 1 duplicated-account.journal:1:9: duplicated-account: duplicated account declaration: Expenses:Food 2 -duplicated-account.journal:4:9: duplicated-account: duplicated account declaration: Expenses:Food 3 2 duplicated-account.journal:2:9: duplicated-account: duplicated account declaration: Expenses:Transport 3 +duplicated-account.journal:4:9: duplicated-account: duplicated account declaration: Expenses:Food 4 4 duplicated-account.journal:6:9: duplicated-account: duplicated account declaration: Expenses:Transport
M
internal/linter/testdata/duplicated-commodity.golden
··· 1 1 duplicated-commodity.journal:1:1: duplicated-commodity: duplicated commodity declaration: USD 2 -duplicated-commodity.journal:4:1: duplicated-commodity: duplicated commodity declaration: USD 3 2 duplicated-commodity.journal:2:1: duplicated-commodity: duplicated commodity declaration: EUR 3 +duplicated-commodity.journal:4:1: duplicated-commodity: duplicated commodity declaration: USD 4 4 duplicated-commodity.journal:6:1: duplicated-commodity: duplicated commodity declaration: EUR
M
internal/linter/testdata/unbalanced-transaction.golden
··· 1 1 unbalanced-transaction.journal:14:1: unbalanced-transaction: transaction is unbalanced; USD balance is 5 2 -unbalanced-transaction.journal:18:1: unbalanced-transaction: transaction is unbalanced; USD balance is 5 3 2 unbalanced-transaction.journal:18:1: unbalanced-transaction: transaction is unbalanced; EUR balance is 5 3 +unbalanced-transaction.journal:18:1: unbalanced-transaction: transaction is unbalanced; USD balance is 5 4 4 unbalanced-transaction.journal:32:1: unbalanced-transaction: transaction is unbalanced; USD balance is 10