hledger-lsp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +632 -0
- package/out/extension.d.ts +1 -0
- package/out/extension.d.ts.map +1 -0
- package/out/extension.js +2 -0
- package/out/extension.js.map +1 -0
- package/out/features/codeActions.d.ts +73 -0
- package/out/features/codeActions.d.ts.map +1 -0
- package/out/features/codeActions.js +417 -0
- package/out/features/codeActions.js.map +1 -0
- package/out/features/completion.d.ts +94 -0
- package/out/features/completion.d.ts.map +1 -0
- package/out/features/completion.js +323 -0
- package/out/features/completion.js.map +1 -0
- package/out/features/definition.d.ts +12 -0
- package/out/features/definition.d.ts.map +1 -0
- package/out/features/definition.js +61 -0
- package/out/features/definition.js.map +1 -0
- package/out/features/documentLinks.d.ts +17 -0
- package/out/features/documentLinks.d.ts.map +1 -0
- package/out/features/documentLinks.js +68 -0
- package/out/features/documentLinks.js.map +1 -0
- package/out/features/findReferences.d.ts +33 -0
- package/out/features/findReferences.d.ts.map +1 -0
- package/out/features/findReferences.js +79 -0
- package/out/features/findReferences.js.map +1 -0
- package/out/features/foldingRanges.d.ts +27 -0
- package/out/features/foldingRanges.d.ts.map +1 -0
- package/out/features/foldingRanges.js +111 -0
- package/out/features/foldingRanges.js.map +1 -0
- package/out/features/formatter.d.ts +70 -0
- package/out/features/formatter.d.ts.map +1 -0
- package/out/features/formatter.js +373 -0
- package/out/features/formatter.js.map +1 -0
- package/out/features/hover.d.ts +66 -0
- package/out/features/hover.d.ts.map +1 -0
- package/out/features/hover.js +387 -0
- package/out/features/hover.js.map +1 -0
- package/out/features/inlayHints.d.ts +43 -0
- package/out/features/inlayHints.d.ts.map +1 -0
- package/out/features/inlayHints.js +221 -0
- package/out/features/inlayHints.js.map +1 -0
- package/out/features/selectionRange.d.ts +47 -0
- package/out/features/selectionRange.d.ts.map +1 -0
- package/out/features/selectionRange.js +273 -0
- package/out/features/selectionRange.js.map +1 -0
- package/out/features/semanticTokens.d.ts +83 -0
- package/out/features/semanticTokens.d.ts.map +1 -0
- package/out/features/semanticTokens.js +370 -0
- package/out/features/semanticTokens.js.map +1 -0
- package/out/features/symbols.d.ts +47 -0
- package/out/features/symbols.d.ts.map +1 -0
- package/out/features/symbols.js +249 -0
- package/out/features/symbols.js.map +1 -0
- package/out/features/transactionAnalyzer.d.ts +63 -0
- package/out/features/transactionAnalyzer.d.ts.map +1 -0
- package/out/features/transactionAnalyzer.js +127 -0
- package/out/features/transactionAnalyzer.js.map +1 -0
- package/out/features/validator.d.ts +142 -0
- package/out/features/validator.d.ts.map +1 -0
- package/out/features/validator.js +633 -0
- package/out/features/validator.js.map +1 -0
- package/out/parser/ast.d.ts +37 -0
- package/out/parser/ast.d.ts.map +1 -0
- package/out/parser/ast.js +606 -0
- package/out/parser/ast.js.map +1 -0
- package/out/parser/includes.d.ts +25 -0
- package/out/parser/includes.d.ts.map +1 -0
- package/out/parser/includes.js +106 -0
- package/out/parser/includes.js.map +1 -0
- package/out/parser/index.d.ts +54 -0
- package/out/parser/index.d.ts.map +1 -0
- package/out/parser/index.js +146 -0
- package/out/parser/index.js.map +1 -0
- package/out/server/deps.d.ts +19 -0
- package/out/server/deps.d.ts.map +1 -0
- package/out/server/deps.js +77 -0
- package/out/server/deps.js.map +1 -0
- package/out/server/settings.d.ts +60 -0
- package/out/server/settings.d.ts.map +1 -0
- package/out/server/settings.js +110 -0
- package/out/server/settings.js.map +1 -0
- package/out/server.d.ts +3 -0
- package/out/server.d.ts.map +1 -0
- package/out/server.js +420 -0
- package/out/server.js.map +1 -0
- package/out/types.d.ts +84 -0
- package/out/types.d.ts.map +1 -0
- package/out/types.js +6 -0
- package/out/types.js.map +1 -0
- package/out/utils/index.d.ts +38 -0
- package/out/utils/index.d.ts.map +1 -0
- package/out/utils/index.js +89 -0
- package/out/utils/index.js.map +1 -0
- package/out/utils/uri.d.ts +32 -0
- package/out/utils/uri.d.ts.map +1 -0
- package/out/utils/uri.js +215 -0
- package/out/utils/uri.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover provider for hledger language server
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive hover information for:
|
|
5
|
+
* - Accounts (type, declaration location, usage count)
|
|
6
|
+
* - Payees (declaration location, usage count)
|
|
7
|
+
* - Commodities (format information, declaration location)
|
|
8
|
+
* - Tags (declaration location, usage statistics)
|
|
9
|
+
* - Transaction headers (totals per commodity)
|
|
10
|
+
* - Dates (formatted date information)
|
|
11
|
+
*/
|
|
12
|
+
import { Hover } from 'vscode-languageserver';
|
|
13
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
14
|
+
import { ParsedDocument } from '../types';
|
|
15
|
+
export declare class HoverProvider {
|
|
16
|
+
/**
|
|
17
|
+
* Provide hover information at the given document position
|
|
18
|
+
*/
|
|
19
|
+
provideHover(document: TextDocument, line: number, character: number, parsed?: ParsedDocument): Hover | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get the token at a specific character position
|
|
22
|
+
*/
|
|
23
|
+
private getTokenAtPosition;
|
|
24
|
+
/**
|
|
25
|
+
* Check if token is a date
|
|
26
|
+
*/
|
|
27
|
+
private isDate;
|
|
28
|
+
/**
|
|
29
|
+
* Provide hover for dates
|
|
30
|
+
*/
|
|
31
|
+
private provideDateHover;
|
|
32
|
+
/**
|
|
33
|
+
* Provide hover for accounts
|
|
34
|
+
*/
|
|
35
|
+
private provideAccountHover;
|
|
36
|
+
/**
|
|
37
|
+
* Provide hover for commodities
|
|
38
|
+
*/
|
|
39
|
+
private provideCommodityHover;
|
|
40
|
+
/**
|
|
41
|
+
* Provide hover for payees
|
|
42
|
+
*/
|
|
43
|
+
private providePayeeHover;
|
|
44
|
+
/**
|
|
45
|
+
* Provide hover for tags
|
|
46
|
+
*/
|
|
47
|
+
private provideTagHover;
|
|
48
|
+
/**
|
|
49
|
+
* Provide hover for transaction headers
|
|
50
|
+
*/
|
|
51
|
+
private provideTransactionHover;
|
|
52
|
+
/**
|
|
53
|
+
* Calculate transaction totals per commodity
|
|
54
|
+
*/
|
|
55
|
+
private calculateTransactionTotals;
|
|
56
|
+
/**
|
|
57
|
+
* Count how many times an account is used
|
|
58
|
+
*/
|
|
59
|
+
private countAccountUsage;
|
|
60
|
+
/**
|
|
61
|
+
* Provide basic hover without parsed data
|
|
62
|
+
*/
|
|
63
|
+
private provideBasicHover;
|
|
64
|
+
}
|
|
65
|
+
export declare const hoverProvider: HoverProvider;
|
|
66
|
+
//# sourceMappingURL=hover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/features/hover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAc,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAe,MAAM,UAAU,CAAC;AAGvD,qBAAa,aAAa;IACxB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,KAAK,GAAG,IAAI;IAwE5G;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,MAAM;IAId;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsD7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmDvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0C/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAalC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAwB1B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hover provider for hledger language server
|
|
4
|
+
*
|
|
5
|
+
* Provides comprehensive hover information for:
|
|
6
|
+
* - Accounts (type, declaration location, usage count)
|
|
7
|
+
* - Payees (declaration location, usage count)
|
|
8
|
+
* - Commodities (format information, declaration location)
|
|
9
|
+
* - Tags (declaration location, usage statistics)
|
|
10
|
+
* - Transaction headers (totals per commodity)
|
|
11
|
+
* - Dates (formatted date information)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.hoverProvider = exports.HoverProvider = void 0;
|
|
15
|
+
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
16
|
+
const index_1 = require("../utils/index");
|
|
17
|
+
class HoverProvider {
|
|
18
|
+
/**
|
|
19
|
+
* Provide hover information at the given document position
|
|
20
|
+
*/
|
|
21
|
+
provideHover(document, line, character, parsed) {
|
|
22
|
+
if (!parsed) {
|
|
23
|
+
return this.provideBasicHover(document, line, character);
|
|
24
|
+
}
|
|
25
|
+
const fullLine = document.getText({
|
|
26
|
+
start: { line, character: 0 },
|
|
27
|
+
end: { line, character: Number.MAX_SAFE_INTEGER }
|
|
28
|
+
});
|
|
29
|
+
// Get token at cursor position
|
|
30
|
+
const token = this.getTokenAtPosition(fullLine, character);
|
|
31
|
+
if (!token)
|
|
32
|
+
return null;
|
|
33
|
+
// Check for date first (highest priority)
|
|
34
|
+
if (this.isDate(token)) {
|
|
35
|
+
return this.provideDateHover(token);
|
|
36
|
+
}
|
|
37
|
+
// Check for tag (in comments) before other checks
|
|
38
|
+
if (fullLine.includes(';') || fullLine.includes('#')) {
|
|
39
|
+
// Check if cursor is after the comment marker
|
|
40
|
+
const semicolonPos = fullLine.indexOf(';');
|
|
41
|
+
const hashPos = fullLine.indexOf('#');
|
|
42
|
+
const commentStart = Math.min(semicolonPos >= 0 ? semicolonPos : Infinity, hashPos >= 0 ? hashPos : Infinity);
|
|
43
|
+
if (character > commentStart) {
|
|
44
|
+
// If token contains ':', extract just the tag name part
|
|
45
|
+
let tagName = token;
|
|
46
|
+
if (token.includes(':')) {
|
|
47
|
+
tagName = token.substring(0, token.indexOf(':'));
|
|
48
|
+
}
|
|
49
|
+
// Check if this is a tag (tag name followed by colon in the line)
|
|
50
|
+
if (tagName && fullLine.includes(`${tagName}:`)) {
|
|
51
|
+
return this.provideTagHover(tagName, parsed);
|
|
52
|
+
}
|
|
53
|
+
// If in comment but not a tag, return null
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Check for account (contains ':')
|
|
58
|
+
if (token.includes(':')) {
|
|
59
|
+
return this.provideAccountHover(token, parsed);
|
|
60
|
+
}
|
|
61
|
+
// Check for commodity
|
|
62
|
+
const commodity = parsed.commodities.find(c => c.name === token);
|
|
63
|
+
if (commodity) {
|
|
64
|
+
return this.provideCommodityHover(commodity);
|
|
65
|
+
}
|
|
66
|
+
// Check for payee - only if token is part of payee name
|
|
67
|
+
const payee = parsed.payees.find(p => p.name.toLowerCase().includes(token.toLowerCase()));
|
|
68
|
+
if (payee?.declared) {
|
|
69
|
+
return this.providePayeeHover(payee, parsed);
|
|
70
|
+
}
|
|
71
|
+
// Check if we're on a transaction header (lowest priority)
|
|
72
|
+
const trimmedLine = fullLine.trim();
|
|
73
|
+
if ((0, index_1.isTransactionHeader)(trimmedLine)) {
|
|
74
|
+
return this.provideTransactionHover(fullLine, line, parsed);
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the token at a specific character position
|
|
80
|
+
*/
|
|
81
|
+
getTokenAtPosition(line, character) {
|
|
82
|
+
const col = Math.min(character, line.length);
|
|
83
|
+
// Find token boundaries
|
|
84
|
+
let start = col - 1;
|
|
85
|
+
while (start >= 0) {
|
|
86
|
+
const ch = line[start];
|
|
87
|
+
if (/\s|;|#|\|/.test(ch))
|
|
88
|
+
break;
|
|
89
|
+
start--;
|
|
90
|
+
}
|
|
91
|
+
start++;
|
|
92
|
+
let end = col;
|
|
93
|
+
while (end < line.length) {
|
|
94
|
+
const ch = line[end];
|
|
95
|
+
if (/\s|;|#|\|/.test(ch))
|
|
96
|
+
break;
|
|
97
|
+
end++;
|
|
98
|
+
}
|
|
99
|
+
const token = line.substring(start, end).trim();
|
|
100
|
+
return token || null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if token is a date
|
|
104
|
+
*/
|
|
105
|
+
isDate(token) {
|
|
106
|
+
return /^\d{4}[-/]\d{2}[-/]\d{2}$/.test(token);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Provide hover for dates
|
|
110
|
+
*/
|
|
111
|
+
provideDateHover(dateStr) {
|
|
112
|
+
const date = new Date(dateStr.replace(/\//g, '-'));
|
|
113
|
+
const formatted = date.toLocaleDateString('en-US', {
|
|
114
|
+
weekday: 'long',
|
|
115
|
+
year: 'numeric',
|
|
116
|
+
month: 'long',
|
|
117
|
+
day: 'numeric'
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
contents: {
|
|
121
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
122
|
+
value: `**Date**\n\n${formatted}`
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Provide hover for accounts
|
|
128
|
+
*/
|
|
129
|
+
provideAccountHover(accountName, parsed) {
|
|
130
|
+
const account = parsed.accounts.find(a => a.name === accountName);
|
|
131
|
+
if (!account) {
|
|
132
|
+
return {
|
|
133
|
+
contents: {
|
|
134
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
135
|
+
value: `**Account**\n\n\`${accountName}\``
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const parts = [`**Account**\n\n\`${accountName}\``];
|
|
140
|
+
// Add account type if available
|
|
141
|
+
if (account.type) {
|
|
142
|
+
const typeCapitalized = account.type.charAt(0).toUpperCase() + account.type.slice(1);
|
|
143
|
+
parts.push(`**Type:** ${typeCapitalized}`);
|
|
144
|
+
}
|
|
145
|
+
// Add declaration status and location
|
|
146
|
+
if (account.declared) {
|
|
147
|
+
parts.push(`**Status:** Declared`);
|
|
148
|
+
if (account.sourceUri) {
|
|
149
|
+
const fileName = account.sourceUri.split('/').pop() || account.sourceUri;
|
|
150
|
+
const lineNum = (account.line ?? 0) + 1;
|
|
151
|
+
parts.push(`**Location:** ${fileName}:${lineNum}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
parts.push(`**Status:** Undeclared (inferred from usage)`);
|
|
156
|
+
}
|
|
157
|
+
// Count usage
|
|
158
|
+
const usageCount = this.countAccountUsage(accountName, parsed);
|
|
159
|
+
if (usageCount > 0) {
|
|
160
|
+
parts.push(`**Usage:** ${usageCount} posting${usageCount !== 1 ? 's' : ''}`);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
contents: {
|
|
164
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
165
|
+
value: parts.join('\n\n')
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Provide hover for commodities
|
|
171
|
+
*/
|
|
172
|
+
provideCommodityHover(commodity) {
|
|
173
|
+
const parts = [`**Commodity**\n\n\`${commodity.name}\``];
|
|
174
|
+
// Add declaration status
|
|
175
|
+
if (commodity.declared) {
|
|
176
|
+
parts.push(`**Status:** Declared`);
|
|
177
|
+
if (commodity.sourceUri) {
|
|
178
|
+
const fileName = commodity.sourceUri.split('/').pop() || commodity.sourceUri;
|
|
179
|
+
const lineNum = (commodity.line ?? 0) + 1;
|
|
180
|
+
parts.push(`**Location:** ${fileName}:${lineNum}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
parts.push(`**Status:** Undeclared (inferred from usage)`);
|
|
185
|
+
}
|
|
186
|
+
// Add format information if available
|
|
187
|
+
if (commodity.format) {
|
|
188
|
+
const fmt = commodity.format;
|
|
189
|
+
const formatParts = ['**Format:**'];
|
|
190
|
+
if (fmt.symbolOnLeft !== undefined) {
|
|
191
|
+
formatParts.push(`- Symbol position: ${fmt.symbolOnLeft ? 'Left' : 'Right'}`);
|
|
192
|
+
}
|
|
193
|
+
if (fmt.spaceBetween !== undefined) {
|
|
194
|
+
formatParts.push(`- Space between: ${fmt.spaceBetween ? 'Yes' : 'No'}`);
|
|
195
|
+
}
|
|
196
|
+
if (fmt.decimalMark) {
|
|
197
|
+
formatParts.push(`- Decimal mark: \`${fmt.decimalMark}\``);
|
|
198
|
+
}
|
|
199
|
+
if (fmt.thousandsSeparator !== undefined) {
|
|
200
|
+
const sep = fmt.thousandsSeparator === null ? 'None' : `\`${fmt.thousandsSeparator}\``;
|
|
201
|
+
formatParts.push(`- Thousands separator: ${sep}`);
|
|
202
|
+
}
|
|
203
|
+
if (fmt.precision !== null && fmt.precision !== undefined) {
|
|
204
|
+
formatParts.push(`- Precision: ${fmt.precision} decimal place${fmt.precision !== 1 ? 's' : ''}`);
|
|
205
|
+
}
|
|
206
|
+
if (formatParts.length > 1) {
|
|
207
|
+
parts.push(formatParts.join('\n'));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
contents: {
|
|
212
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
213
|
+
value: parts.join('\n\n')
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Provide hover for payees
|
|
219
|
+
*/
|
|
220
|
+
providePayeeHover(payee, parsed) {
|
|
221
|
+
const parts = [`**Payee**\n\n\`${payee.name}\``];
|
|
222
|
+
// Add declaration status
|
|
223
|
+
if (payee.declared) {
|
|
224
|
+
parts.push(`**Status:** Declared`);
|
|
225
|
+
if (payee.sourceUri) {
|
|
226
|
+
const fileName = payee.sourceUri.split('/').pop() || payee.sourceUri;
|
|
227
|
+
const lineNum = (payee.line ?? 0) + 1;
|
|
228
|
+
parts.push(`**Location:** ${fileName}:${lineNum}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
parts.push(`**Status:** Undeclared (inferred from usage)`);
|
|
233
|
+
}
|
|
234
|
+
// Count transactions with this payee
|
|
235
|
+
const transactionCount = parsed.transactions.filter(t => t.payee === payee.name).length;
|
|
236
|
+
if (transactionCount > 0) {
|
|
237
|
+
parts.push(`**Transactions:** ${transactionCount}`);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
contents: {
|
|
241
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
242
|
+
value: parts.join('\n\n')
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Provide hover for tags
|
|
248
|
+
*/
|
|
249
|
+
provideTagHover(tagName, parsed) {
|
|
250
|
+
const tag = parsed.tags.find(t => t.name === tagName);
|
|
251
|
+
if (!tag) {
|
|
252
|
+
return {
|
|
253
|
+
contents: {
|
|
254
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
255
|
+
value: `**Tag**\n\n\`${tagName}:\``
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const parts = [`**Tag**\n\n\`${tagName}:\``];
|
|
260
|
+
// Add declaration status
|
|
261
|
+
if (tag.declared) {
|
|
262
|
+
parts.push(`**Status:** Declared`);
|
|
263
|
+
if (tag.sourceUri) {
|
|
264
|
+
const fileName = tag.sourceUri.split('/').pop() || tag.sourceUri;
|
|
265
|
+
const lineNum = (tag.line ?? 0) + 1;
|
|
266
|
+
parts.push(`**Location:** ${fileName}:${lineNum}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
parts.push(`**Status:** Undeclared (inferred from usage)`);
|
|
271
|
+
}
|
|
272
|
+
// Count tag usage across transactions and postings
|
|
273
|
+
let usageCount = 0;
|
|
274
|
+
for (const transaction of parsed.transactions) {
|
|
275
|
+
if (transaction.tags && tagName in transaction.tags) {
|
|
276
|
+
usageCount++;
|
|
277
|
+
}
|
|
278
|
+
for (const posting of transaction.postings) {
|
|
279
|
+
if (posting.tags && tagName in posting.tags) {
|
|
280
|
+
usageCount++;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (usageCount > 0) {
|
|
285
|
+
parts.push(`**Usage:** ${usageCount} time${usageCount !== 1 ? 's' : ''}`);
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
contents: {
|
|
289
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
290
|
+
value: parts.join('\n\n')
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Provide hover for transaction headers
|
|
296
|
+
*/
|
|
297
|
+
provideTransactionHover(line, lineNumber, parsed) {
|
|
298
|
+
// Find the transaction at this line
|
|
299
|
+
const transaction = parsed.transactions.find(t => t.line === lineNumber);
|
|
300
|
+
if (!transaction)
|
|
301
|
+
return null;
|
|
302
|
+
const parts = [`**Transaction**\n\n\`${transaction.description}\``];
|
|
303
|
+
// Add status if present
|
|
304
|
+
if (transaction.status) {
|
|
305
|
+
const statusText = transaction.status === 'cleared' ? 'Cleared (*)' :
|
|
306
|
+
transaction.status === 'pending' ? 'Pending (!)' : 'Unmarked';
|
|
307
|
+
parts.push(`**Status:** ${statusText}`);
|
|
308
|
+
}
|
|
309
|
+
// Add code if present
|
|
310
|
+
if (transaction.code) {
|
|
311
|
+
parts.push(`**Code:** \`${transaction.code}\``);
|
|
312
|
+
}
|
|
313
|
+
// Calculate totals per commodity
|
|
314
|
+
const totals = this.calculateTransactionTotals(transaction);
|
|
315
|
+
if (Object.keys(totals).length > 0) {
|
|
316
|
+
const totalLines = ['**Totals:**'];
|
|
317
|
+
for (const [commodity, total] of Object.entries(totals)) {
|
|
318
|
+
const sign = total >= 0 ? '+' : '';
|
|
319
|
+
const commodityStr = commodity || '(no commodity)';
|
|
320
|
+
totalLines.push(`- ${sign}${total.toFixed(2)} ${commodityStr}`);
|
|
321
|
+
}
|
|
322
|
+
parts.push(totalLines.join('\n'));
|
|
323
|
+
}
|
|
324
|
+
// Add posting count
|
|
325
|
+
parts.push(`**Postings:** ${transaction.postings.length}`);
|
|
326
|
+
return {
|
|
327
|
+
contents: {
|
|
328
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
329
|
+
value: parts.join('\n\n')
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Calculate transaction totals per commodity
|
|
335
|
+
*/
|
|
336
|
+
calculateTransactionTotals(transaction) {
|
|
337
|
+
const totals = {};
|
|
338
|
+
for (const posting of transaction.postings) {
|
|
339
|
+
if (posting.amount) {
|
|
340
|
+
const commodity = posting.amount.commodity || '';
|
|
341
|
+
totals[commodity] = (totals[commodity] || 0) + posting.amount.quantity;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return totals;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Count how many times an account is used
|
|
348
|
+
*/
|
|
349
|
+
countAccountUsage(accountName, parsed) {
|
|
350
|
+
let count = 0;
|
|
351
|
+
for (const transaction of parsed.transactions) {
|
|
352
|
+
for (const posting of transaction.postings) {
|
|
353
|
+
if (posting.account === accountName) {
|
|
354
|
+
count++;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return count;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Provide basic hover without parsed data
|
|
362
|
+
*/
|
|
363
|
+
provideBasicHover(document, line, character) {
|
|
364
|
+
const fullLine = document.getText({
|
|
365
|
+
start: { line, character: 0 },
|
|
366
|
+
end: { line, character: Number.MAX_SAFE_INTEGER }
|
|
367
|
+
});
|
|
368
|
+
const token = this.getTokenAtPosition(fullLine, character);
|
|
369
|
+
if (!token)
|
|
370
|
+
return null;
|
|
371
|
+
if (this.isDate(token)) {
|
|
372
|
+
return this.provideDateHover(token);
|
|
373
|
+
}
|
|
374
|
+
if (token.includes(':')) {
|
|
375
|
+
return {
|
|
376
|
+
contents: {
|
|
377
|
+
kind: vscode_languageserver_1.MarkupKind.Markdown,
|
|
378
|
+
value: `**Account**\n\n\`${token}\``
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
exports.HoverProvider = HoverProvider;
|
|
386
|
+
exports.hoverProvider = new HoverProvider();
|
|
387
|
+
//# sourceMappingURL=hover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../../src/features/hover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inlay hints provider for hledger language server
|
|
3
|
+
*
|
|
4
|
+
* Provides inline, non-intrusive information:
|
|
5
|
+
* - Inferred amounts on postings without explicit amounts
|
|
6
|
+
* - Running balances after each posting
|
|
7
|
+
* - Cost conversions when costs are involved
|
|
8
|
+
*/
|
|
9
|
+
import { InlayHint, Range } from 'vscode-languageserver';
|
|
10
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
11
|
+
import { ParsedDocument } from '../types';
|
|
12
|
+
export interface InlayHintsSettings {
|
|
13
|
+
/** Show inferred amounts on postings without explicit amounts */
|
|
14
|
+
showInferredAmounts?: boolean;
|
|
15
|
+
/** Show running balance after each posting */
|
|
16
|
+
showRunningBalances?: boolean;
|
|
17
|
+
/** Show cost conversions (e.g., "= $135") */
|
|
18
|
+
showCostConversions?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare class InlayHintsProvider {
|
|
21
|
+
/**
|
|
22
|
+
* Format an amount with proper commodity placement
|
|
23
|
+
*/
|
|
24
|
+
private formatAmount;
|
|
25
|
+
/**
|
|
26
|
+
* Provide inlay hints for a document
|
|
27
|
+
*/
|
|
28
|
+
provideInlayHints(document: TextDocument, range: Range, parsed: ParsedDocument, settings?: InlayHintsSettings): InlayHint[];
|
|
29
|
+
/**
|
|
30
|
+
* Get hints for inferred amounts (postings without explicit amounts)
|
|
31
|
+
*/
|
|
32
|
+
private getInferredAmountHints;
|
|
33
|
+
/**
|
|
34
|
+
* Get hints for running balances after each posting
|
|
35
|
+
*/
|
|
36
|
+
private getRunningBalanceHints;
|
|
37
|
+
/**
|
|
38
|
+
* Get hints for cost conversions
|
|
39
|
+
*/
|
|
40
|
+
private getCostConversionHints;
|
|
41
|
+
}
|
|
42
|
+
export declare const inlayHintsProvider: InlayHintsProvider;
|
|
43
|
+
//# sourceMappingURL=inlayHints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inlayHints.d.ts","sourceRoot":"","sources":["../../src/features/inlayHints.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAA2B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAwB,MAAM,UAAU,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,8CAA8C;IAC9C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAQD,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,OAAO,CAAC,YAAY;IA+BpB;;OAEG;IACH,iBAAiB,CACf,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,SAAS,EAAE;IAgCd;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyE9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6C9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAyC/B;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|