all repos

clerk @ 0c15ec4

missing tooling for ledger/hledger
4 files changed, 21 insertions(+), 3 deletions(-)
linter: sort output by position of spans
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