2 files changed,
30 insertions(+),
18 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-09-02 18:22:35 +0300
Authored at:
2026-09-02 17:53:43 +0300
Change ID:
swwoynvxxlyuzunqqzurqxxrlyzqvpym
Parent:
cf9c1d9
jump to
| M | internal/analyzer/build.go |
| M | journal/ast/ast.go |
M
internal/analyzer/build.go
··· 41 41 return a 42 42 } 43 43 44 -func TxDuplicateKey(tx *ast.Transaction) string { 44 +func txDuplicateKey(tx *ast.Transaction, names []string) string { 45 45 var b strings.Builder 46 46 b.WriteString(tx.Date.String()) 47 47 b.WriteByte('|') ··· 49 49 b.WriteString(tx.Payee.Name) 50 50 } 51 51 b.WriteByte('|') 52 - for _, p := range tx.Postings { 53 - b.WriteString(p.Account.String()) 52 + for i := range tx.Postings { 53 + b.WriteString(names[i]) 54 54 b.WriteByte(',') 55 55 } 56 56 return b.String() ··· 99 99 case *ast.Comment: 100 100 a.addCommentTags(fileIndex, nil, e) 101 101 case *ast.Transaction: 102 + a.addPayee(fileIndex, e.Payee) 102 103 a.Transactions = append(a.Transactions, e) 103 - a.addPostings(fileIndex, e.Postings, &e.Date) 104 - a.addPayee(fileIndex, e.Payee) 104 + a.TransactionsCountByDate[e.Date.String()]++ 105 + 106 + names := make([]string, len(e.Postings)) 107 + for i, p := range e.Postings { 108 + names[i] = p.Account.String() 109 + } 110 + a.addPostings(fileIndex, e.Postings, names, &e.Date) 111 + 105 112 a.addCommentTags(fileIndex, &e.Date, e.Comment) 106 113 for _, c := range e.HeaderComments { 107 114 a.addCommentTags(fileIndex, &e.Date, c) 108 115 } 109 - key := TxDuplicateKey(e) 116 + key := txDuplicateKey(e, names) 110 117 a.TransactionsByKey[key] = append(a.TransactionsByKey[key], e) 111 - a.TransactionsCountByDate[e.Date.String()]++ 112 118 case *ast.PeriodicTransaction: 113 119 a.PeriodicTransactions = append(a.PeriodicTransactions, e) 114 - a.addPostings(fileIndex, e.Postings, nil) 120 + a.addPostings(fileIndex, e.Postings, nil, nil) 115 121 a.addCommentTags(fileIndex, nil, e.Comment) 116 122 for _, c := range e.HeaderComments { 117 123 a.addCommentTags(fileIndex, nil, c) 118 124 } 119 125 case *ast.AutomatedTransaction: 120 126 a.AutomatedTransactions = append(a.AutomatedTransactions, e) 121 - a.addPostings(fileIndex, e.Postings, nil) 127 + a.addPostings(fileIndex, e.Postings, nil, nil) 122 128 a.addCommentTags(fileIndex, nil, e.Comment) 123 129 for _, c := range e.HeaderComments { 124 130 a.addCommentTags(fileIndex, nil, c) ··· 224 230 info.UsedCount++ 225 231 } 226 232 227 -func (a *Analysis) addPostings(fileIndex int, postings []*ast.Posting, date *ast.Date) { 228 - for _, posting := range postings { 229 - aname := posting.Account.String() 233 +func (a *Analysis) addPostings(fileIndex int, postings []*ast.Posting, names []string, date *ast.Date) { 234 + if names == nil { 235 + names = make([]string, len(postings)) 236 + for i, p := range postings { 237 + names[i] = p.Account.String() 238 + } 239 + } 240 + for i, posting := range postings { 241 + aname := names[i] 230 242 info, ok := a.Accounts[aname] 231 243 if !ok { 232 244 info = &AccountInfo{}
M
journal/ast/ast.go
··· 163 163 if len(a.Name) == 0 { 164 164 return "" 165 165 } 166 - var name strings.Builder 167 - name.Grow(len(a.Name)) 168 - name.WriteString(a.Name[0].Name) 166 + var b strings.Builder 167 + b.Grow(len(a.Name)) 168 + b.WriteString(a.Name[0].Name) 169 169 for _, s := range a.Name[1:] { 170 - name.WriteByte(':') 171 - name.WriteString(s.Name) 170 + b.WriteByte(':') 171 + b.WriteString(s.Name) 172 172 } 173 - return name.String() 173 + return b.String() 174 174 }