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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +632 -0
  3. package/out/extension.d.ts +1 -0
  4. package/out/extension.d.ts.map +1 -0
  5. package/out/extension.js +2 -0
  6. package/out/extension.js.map +1 -0
  7. package/out/features/codeActions.d.ts +73 -0
  8. package/out/features/codeActions.d.ts.map +1 -0
  9. package/out/features/codeActions.js +417 -0
  10. package/out/features/codeActions.js.map +1 -0
  11. package/out/features/completion.d.ts +94 -0
  12. package/out/features/completion.d.ts.map +1 -0
  13. package/out/features/completion.js +323 -0
  14. package/out/features/completion.js.map +1 -0
  15. package/out/features/definition.d.ts +12 -0
  16. package/out/features/definition.d.ts.map +1 -0
  17. package/out/features/definition.js +61 -0
  18. package/out/features/definition.js.map +1 -0
  19. package/out/features/documentLinks.d.ts +17 -0
  20. package/out/features/documentLinks.d.ts.map +1 -0
  21. package/out/features/documentLinks.js +68 -0
  22. package/out/features/documentLinks.js.map +1 -0
  23. package/out/features/findReferences.d.ts +33 -0
  24. package/out/features/findReferences.d.ts.map +1 -0
  25. package/out/features/findReferences.js +79 -0
  26. package/out/features/findReferences.js.map +1 -0
  27. package/out/features/foldingRanges.d.ts +27 -0
  28. package/out/features/foldingRanges.d.ts.map +1 -0
  29. package/out/features/foldingRanges.js +111 -0
  30. package/out/features/foldingRanges.js.map +1 -0
  31. package/out/features/formatter.d.ts +70 -0
  32. package/out/features/formatter.d.ts.map +1 -0
  33. package/out/features/formatter.js +373 -0
  34. package/out/features/formatter.js.map +1 -0
  35. package/out/features/hover.d.ts +66 -0
  36. package/out/features/hover.d.ts.map +1 -0
  37. package/out/features/hover.js +387 -0
  38. package/out/features/hover.js.map +1 -0
  39. package/out/features/inlayHints.d.ts +43 -0
  40. package/out/features/inlayHints.d.ts.map +1 -0
  41. package/out/features/inlayHints.js +221 -0
  42. package/out/features/inlayHints.js.map +1 -0
  43. package/out/features/selectionRange.d.ts +47 -0
  44. package/out/features/selectionRange.d.ts.map +1 -0
  45. package/out/features/selectionRange.js +273 -0
  46. package/out/features/selectionRange.js.map +1 -0
  47. package/out/features/semanticTokens.d.ts +83 -0
  48. package/out/features/semanticTokens.d.ts.map +1 -0
  49. package/out/features/semanticTokens.js +370 -0
  50. package/out/features/semanticTokens.js.map +1 -0
  51. package/out/features/symbols.d.ts +47 -0
  52. package/out/features/symbols.d.ts.map +1 -0
  53. package/out/features/symbols.js +249 -0
  54. package/out/features/symbols.js.map +1 -0
  55. package/out/features/transactionAnalyzer.d.ts +63 -0
  56. package/out/features/transactionAnalyzer.d.ts.map +1 -0
  57. package/out/features/transactionAnalyzer.js +127 -0
  58. package/out/features/transactionAnalyzer.js.map +1 -0
  59. package/out/features/validator.d.ts +142 -0
  60. package/out/features/validator.d.ts.map +1 -0
  61. package/out/features/validator.js +633 -0
  62. package/out/features/validator.js.map +1 -0
  63. package/out/parser/ast.d.ts +37 -0
  64. package/out/parser/ast.d.ts.map +1 -0
  65. package/out/parser/ast.js +606 -0
  66. package/out/parser/ast.js.map +1 -0
  67. package/out/parser/includes.d.ts +25 -0
  68. package/out/parser/includes.d.ts.map +1 -0
  69. package/out/parser/includes.js +106 -0
  70. package/out/parser/includes.js.map +1 -0
  71. package/out/parser/index.d.ts +54 -0
  72. package/out/parser/index.d.ts.map +1 -0
  73. package/out/parser/index.js +146 -0
  74. package/out/parser/index.js.map +1 -0
  75. package/out/server/deps.d.ts +19 -0
  76. package/out/server/deps.d.ts.map +1 -0
  77. package/out/server/deps.js +77 -0
  78. package/out/server/deps.js.map +1 -0
  79. package/out/server/settings.d.ts +60 -0
  80. package/out/server/settings.d.ts.map +1 -0
  81. package/out/server/settings.js +110 -0
  82. package/out/server/settings.js.map +1 -0
  83. package/out/server.d.ts +3 -0
  84. package/out/server.d.ts.map +1 -0
  85. package/out/server.js +420 -0
  86. package/out/server.js.map +1 -0
  87. package/out/types.d.ts +84 -0
  88. package/out/types.d.ts.map +1 -0
  89. package/out/types.js +6 -0
  90. package/out/types.js.map +1 -0
  91. package/out/utils/index.d.ts +38 -0
  92. package/out/utils/index.d.ts.map +1 -0
  93. package/out/utils/index.js +89 -0
  94. package/out/utils/index.js.map +1 -0
  95. package/out/utils/uri.d.ts +32 -0
  96. package/out/utils/uri.d.ts.map +1 -0
  97. package/out/utils/uri.js +215 -0
  98. package/out/utils/uri.js.map +1 -0
  99. package/package.json +58 -0
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ /**
3
+ * Completion provider for hledger language server
4
+ *
5
+ * Provides intelligent auto-completion for:
6
+ * - Account names
7
+ * - Payee names
8
+ * - Commodity symbols
9
+ * - Directive keywords
10
+ * - Include file paths
11
+ * - Tags
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.completionProvider = exports.CompletionProvider = void 0;
48
+ const vscode_languageserver_1 = require("vscode-languageserver");
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const transactionAnalyzer_1 = require("./transactionAnalyzer");
52
+ class CompletionProvider {
53
+ constructor() {
54
+ this.accounts = [];
55
+ this.payees = [];
56
+ this.commodities = [];
57
+ this.tags = [];
58
+ }
59
+ /**
60
+ * Update the list of known accounts
61
+ */
62
+ updateAccounts(accounts) {
63
+ this.accounts = accounts;
64
+ }
65
+ /**
66
+ * Update the list of known payees
67
+ */
68
+ updatePayees(payees) {
69
+ this.payees = payees;
70
+ }
71
+ /**
72
+ * Update the list of known commodities
73
+ */
74
+ updateCommodities(commodities) {
75
+ this.commodities = commodities;
76
+ }
77
+ /**
78
+ * Update the list of known tags
79
+ */
80
+ updateTags(tags) {
81
+ this.tags = tags;
82
+ }
83
+ /**
84
+ * Get completion items for the current position
85
+ */
86
+ getCompletionItems(document, position, parsed, settings) {
87
+ const line = document.getText({
88
+ start: { line: position.line, character: 0 },
89
+ end: { line: position.line, character: position.character }
90
+ });
91
+ // Include directive - suggest file paths
92
+ const includeMatch = line.match(/^include\s+(.*)$/);
93
+ if (includeMatch) {
94
+ return this.getIncludePathCompletions(document.uri, includeMatch[1]);
95
+ }
96
+ // Comment - suggest tags (tags appear after ; in format tag:value)
97
+ const commentMatch = line.match(/;([^;]*?)$/);
98
+ if (commentMatch) {
99
+ const commentPart = commentMatch[1];
100
+ // Check if we're typing a tag name (after whitespace or after another tag)
101
+ if (/(?:^|\s)(\w*)$/.test(commentPart)) {
102
+ return this.getTagCompletions(settings);
103
+ }
104
+ }
105
+ // Cost notation - suggest commodities after @ or @@
106
+ if (/^\s+/.test(line) && !commentMatch) {
107
+ // Check if cursor is after @ or @@ (for cost notation)
108
+ const costMatch = line.match(/@@?\s*[^\s]*$/);
109
+ if (costMatch) {
110
+ return this.getCommodityCompletions(settings);
111
+ }
112
+ // Otherwise, suggest accounts for posting line
113
+ // Try to get smart suggestions based on current transaction context
114
+ if (parsed) {
115
+ const payee = this.getCurrentTransactionPayee(document, position);
116
+ if (payee) {
117
+ return this.getSmartAccountCompletions(payee, parsed, settings);
118
+ }
119
+ }
120
+ return this.getAccountCompletions(settings);
121
+ }
122
+ // Transaction header - suggest payees
123
+ if (/^\d{4}[-/]\d{2}[-/]\d{2}/.test(line) && !commentMatch) {
124
+ return this.getPayeeCompletions(settings);
125
+ }
126
+ // Directive line
127
+ if (line.trim().length === 0 || /^[a-z]/.test(line.trim())) {
128
+ return this.getDirectiveCompletions();
129
+ }
130
+ return [];
131
+ }
132
+ /**
133
+ * Get account name completions
134
+ */
135
+ getAccountCompletions(settings) {
136
+ const onlyDeclared = settings?.onlyDeclaredAccounts ?? true;
137
+ const filtered = onlyDeclared ? this.accounts.filter(a => a.declared) : this.accounts;
138
+ return filtered.map(account => ({
139
+ label: account.name,
140
+ kind: vscode_languageserver_1.CompletionItemKind.Field,
141
+ detail: 'Account'
142
+ }));
143
+ }
144
+ /**
145
+ * Get payee completions
146
+ */
147
+ getPayeeCompletions(settings) {
148
+ const onlyDeclared = settings?.onlyDeclaredPayees ?? true;
149
+ const filtered = onlyDeclared ? this.payees.filter(p => p.declared) : this.payees;
150
+ return filtered.map(payee => ({
151
+ label: payee.name,
152
+ kind: vscode_languageserver_1.CompletionItemKind.Text,
153
+ detail: 'Payee'
154
+ }));
155
+ }
156
+ /**
157
+ * Get directive keyword completions
158
+ */
159
+ getDirectiveCompletions() {
160
+ const directives = [
161
+ { label: 'account', detail: 'Declare an account' },
162
+ { label: 'commodity', detail: 'Declare a commodity' },
163
+ { label: 'payee', detail: 'Declare a payee' },
164
+ { label: 'tag', detail: 'Declare a tag' },
165
+ { label: 'include', detail: 'Include another file' },
166
+ { label: 'alias', detail: 'Define an account alias' }
167
+ ];
168
+ return directives.map(d => ({
169
+ label: d.label,
170
+ kind: vscode_languageserver_1.CompletionItemKind.Keyword,
171
+ detail: d.detail
172
+ }));
173
+ }
174
+ /**
175
+ * Get commodity completions
176
+ */
177
+ getCommodityCompletions(settings) {
178
+ const onlyDeclared = settings?.onlyDeclaredCommodities ?? true;
179
+ const filtered = onlyDeclared ? this.commodities.filter(c => c.declared) : this.commodities;
180
+ return filtered.map(commodity => ({
181
+ label: commodity.name,
182
+ kind: vscode_languageserver_1.CompletionItemKind.Unit,
183
+ detail: 'Commodity'
184
+ }));
185
+ }
186
+ /**
187
+ * Get tag name completions
188
+ */
189
+ getTagCompletions(settings) {
190
+ const onlyDeclared = settings?.onlyDeclaredTags ?? true;
191
+ const filtered = onlyDeclared ? this.tags.filter(t => t.declared) : this.tags;
192
+ return filtered.map(tag => ({
193
+ label: tag.name,
194
+ kind: vscode_languageserver_1.CompletionItemKind.Property,
195
+ detail: 'Tag',
196
+ insertText: `${tag.name}:`
197
+ }));
198
+ }
199
+ /**
200
+ * Get include file path completions
201
+ */
202
+ getIncludePathCompletions(documentUri, partialPath) {
203
+ try {
204
+ // Convert URI to file path
205
+ const currentFilePath = documentUri.startsWith('file://')
206
+ ? documentUri.substring(7)
207
+ : documentUri;
208
+ const currentDir = path.dirname(currentFilePath);
209
+ // Determine which directory to search based on partialPath
210
+ let searchDir;
211
+ if (partialPath.endsWith('/') || partialPath.endsWith(path.sep)) {
212
+ // If ends with /, search in that directory (e.g., "../" -> parent dir, "../monthly/" -> monthly dir)
213
+ searchDir = path.resolve(currentDir, partialPath);
214
+ }
215
+ else if (partialPath.includes('/') || partialPath.includes(path.sep)) {
216
+ // Has a path separator but doesn't end with it
217
+ // Extract directory part: "../monthly/feb" -> search in "../monthly"
218
+ const dirPart = path.dirname(partialPath);
219
+ searchDir = path.resolve(currentDir, dirPart);
220
+ }
221
+ else if (partialPath === '..' || partialPath === '.') {
222
+ // Special case: typing ".." or "." should show parent/current directory
223
+ searchDir = path.resolve(currentDir, partialPath);
224
+ }
225
+ else {
226
+ // No path separator, search in current directory
227
+ searchDir = currentDir;
228
+ }
229
+ // Check if directory exists
230
+ if (!fs.existsSync(searchDir) || !fs.statSync(searchDir).isDirectory()) {
231
+ return [];
232
+ }
233
+ // Read directory contents
234
+ const files = fs.readdirSync(searchDir);
235
+ const completions = [];
236
+ for (const file of files) {
237
+ const filePath = path.join(searchDir, file);
238
+ const stats = fs.statSync(filePath);
239
+ if (stats.isDirectory()) {
240
+ // Add directories with trailing slash
241
+ completions.push({
242
+ label: file + '/',
243
+ kind: vscode_languageserver_1.CompletionItemKind.Folder,
244
+ detail: 'Directory'
245
+ });
246
+ }
247
+ else if (file.endsWith('.journal') || file.endsWith('.hledger')) {
248
+ // Add journal files
249
+ completions.push({
250
+ label: file,
251
+ kind: vscode_languageserver_1.CompletionItemKind.File,
252
+ detail: 'Journal file'
253
+ });
254
+ }
255
+ }
256
+ return completions;
257
+ }
258
+ catch (error) {
259
+ // If any error occurs (permissions, etc.), return empty array
260
+ return [];
261
+ }
262
+ }
263
+ /**
264
+ * Get the payee of the current transaction being edited
265
+ */
266
+ getCurrentTransactionPayee(document, position) {
267
+ const lines = document.getText().split('\n');
268
+ // Search backwards from current line to find transaction header
269
+ for (let i = position.line; i >= 0; i--) {
270
+ const line = lines[i];
271
+ // Transaction header with payee
272
+ const match = line.match(/^\d{4}[-/]\d{2}[-/]\d{2}(?:\s+[*!])?(?:\s+\([^)]+\))?\s+(.+?)(?:\s*;|$)/);
273
+ if (match) {
274
+ return match[1].trim();
275
+ }
276
+ // Stop if we hit a non-transaction line (directive or empty)
277
+ if (line.trim() && !line.match(/^\s+/) && !line.match(/^\d{4}/)) {
278
+ break;
279
+ }
280
+ }
281
+ return null;
282
+ }
283
+ /**
284
+ * Get smart account completions based on payee history
285
+ */
286
+ getSmartAccountCompletions(payee, parsed, settings) {
287
+ // Analyze the parsed document to build patterns
288
+ transactionAnalyzer_1.transactionAnalyzer.analyze(parsed);
289
+ // Get accounts historically used with this payee
290
+ const patterns = transactionAnalyzer_1.transactionAnalyzer.getAccountsForPayee(payee, 5);
291
+ const suggestedAccounts = new Set(patterns.map(p => p.account));
292
+ // Get all accounts with frequency info
293
+ const frequencyMap = new Map(transactionAnalyzer_1.transactionAnalyzer.getAccountsByFrequency().map(f => [f.account, f.count]));
294
+ // Filter accounts based on settings
295
+ const onlyDeclared = settings?.onlyDeclaredAccounts ?? true;
296
+ const filtered = onlyDeclared ? this.accounts.filter(a => a.declared) : this.accounts;
297
+ // Create completion items with smart sorting
298
+ const items = filtered.map(account => {
299
+ const item = {
300
+ label: account.name,
301
+ kind: vscode_languageserver_1.CompletionItemKind.Field,
302
+ detail: 'Account'
303
+ };
304
+ // Add sort text to prioritize suggested accounts
305
+ if (suggestedAccounts.has(account.name)) {
306
+ const frequency = patterns.find(p => p.account === account.name)?.frequency || 0;
307
+ // Use '0' prefix for suggested accounts to sort them first
308
+ item.sortText = `0_${String(1000 - frequency).padStart(4, '0')}_${account.name}`;
309
+ item.detail = `Account (used ${frequency}x with ${payee})`;
310
+ }
311
+ else {
312
+ // Use '1' prefix for other accounts, sorted by global frequency
313
+ const freq = frequencyMap.get(account.name) || 0;
314
+ item.sortText = `1_${String(10000 - freq).padStart(5, '0')}_${account.name}`;
315
+ }
316
+ return item;
317
+ });
318
+ return items;
319
+ }
320
+ }
321
+ exports.CompletionProvider = CompletionProvider;
322
+ exports.completionProvider = new CompletionProvider();
323
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/features/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Location } from 'vscode-languageserver';
2
+ import { TextDocument } from 'vscode-languageserver-textdocument';
3
+ import { ParsedDocument } from '../types';
4
+ export declare class DefinitionProvider {
5
+ /**
6
+ * Provide a definition location for the token at the given position.
7
+ * Accepts `parsed` produced by server's parser (follows includes, uses fileReader).
8
+ */
9
+ provideDefinition(document: TextDocument, line: number, character: number, parsed: ParsedDocument): Location | null;
10
+ }
11
+ export declare const definitionProvider: DefinitionProvider;
12
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/features/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAGlE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,IAAI;CAkDpH;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.definitionProvider = exports.DefinitionProvider = void 0;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ class DefinitionProvider {
6
+ /**
7
+ * Provide a definition location for the token at the given position.
8
+ * Accepts `parsed` produced by server's parser (follows includes, uses fileReader).
9
+ */
10
+ provideDefinition(document, line, character, parsed) {
11
+ // Get token at position (reuse simple logic from hover)
12
+ const fullLine = document.getText({ start: { line, character: 0 }, end: { line, character: Number.MAX_SAFE_INTEGER } });
13
+ const col = Math.min(character, fullLine.length);
14
+ let start = col - 1;
15
+ while (start >= 0) {
16
+ const ch = fullLine[start];
17
+ if (/\s|;|#/.test(ch))
18
+ break;
19
+ start--;
20
+ }
21
+ start++;
22
+ let end = col;
23
+ while (end < fullLine.length) {
24
+ const ch = fullLine[end];
25
+ if (/\s|;|#/.test(ch))
26
+ break;
27
+ end++;
28
+ }
29
+ const token = fullLine.substring(start, end).trim();
30
+ if (!token)
31
+ return null;
32
+ // Search accounts
33
+ const account = parsed.accounts.find(a => a.name === token);
34
+ if (account && account.sourceUri) {
35
+ const lineNum = account.line ?? 0;
36
+ return vscode_languageserver_1.Location.create(account.sourceUri, vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(lineNum, 0), vscode_languageserver_1.Position.create(lineNum, 0)));
37
+ }
38
+ // Search payees
39
+ const payee = parsed.payees.find(p => p.name === token);
40
+ if (payee && payee.sourceUri) {
41
+ const lineNum = payee.line ?? 0;
42
+ return vscode_languageserver_1.Location.create(payee.sourceUri, vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(lineNum, 0), vscode_languageserver_1.Position.create(lineNum, 0)));
43
+ }
44
+ // Search commodities
45
+ const commodity = parsed.commodities.find(c => c.name === token || c.format?.symbol === token);
46
+ if (commodity && commodity.sourceUri) {
47
+ const lineNum = commodity.line ?? 0;
48
+ return vscode_languageserver_1.Location.create(commodity.sourceUri, vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(lineNum, 0), vscode_languageserver_1.Position.create(lineNum, 0)));
49
+ }
50
+ // Search tags
51
+ const tag = parsed.tags.find(t => t.name === token);
52
+ if (tag && tag.sourceUri) {
53
+ const lineNum = tag.line ?? 0;
54
+ return vscode_languageserver_1.Location.create(tag.sourceUri, vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(lineNum, 0), vscode_languageserver_1.Position.create(lineNum, 0)));
55
+ }
56
+ return null;
57
+ }
58
+ }
59
+ exports.DefinitionProvider = DefinitionProvider;
60
+ exports.definitionProvider = new DefinitionProvider();
61
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/features/definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Document links provider for hledger journal files
3
+ *
4
+ * Provides clickable links for:
5
+ * - Include directive paths
6
+ */
7
+ import { DocumentLink } from 'vscode-languageserver/node';
8
+ import { TextDocument } from 'vscode-languageserver-textdocument';
9
+ import { ParsedDocument } from '../types';
10
+ export declare class DocumentLinksProvider {
11
+ /**
12
+ * Provide document links for a document
13
+ */
14
+ provideDocumentLinks(document: TextDocument, parsedDoc: ParsedDocument): DocumentLink[];
15
+ }
16
+ export declare const documentLinksProvider: DocumentLinksProvider;
17
+ //# sourceMappingURL=documentLinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentLinks.d.ts","sourceRoot":"","sources":["../../src/features/documentLinks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,qBAAa,qBAAqB;IAChC;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,GAAG,YAAY,EAAE;CAwDxF;AAED,eAAO,MAAM,qBAAqB,uBAA8B,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Document links provider for hledger journal files
4
+ *
5
+ * Provides clickable links for:
6
+ * - Include directive paths
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.documentLinksProvider = exports.DocumentLinksProvider = void 0;
10
+ const uri_1 = require("../utils/uri");
11
+ class DocumentLinksProvider {
12
+ /**
13
+ * Provide document links for a document
14
+ */
15
+ provideDocumentLinks(document, parsedDoc) {
16
+ const links = [];
17
+ const lines = document.getText().split('\n');
18
+ // Create links for each include directive
19
+ for (const directive of parsedDoc.directives) {
20
+ if (directive.type === 'include' && directive.line !== undefined) {
21
+ const line = lines[directive.line];
22
+ if (!line)
23
+ continue;
24
+ // Find the include path in the line
25
+ const includeKeyword = 'include';
26
+ const keywordIndex = line.indexOf(includeKeyword);
27
+ if (keywordIndex === -1)
28
+ continue;
29
+ // The path starts after 'include ' (with space)
30
+ const pathStart = keywordIndex + includeKeyword.length;
31
+ // Skip whitespace after 'include'
32
+ let actualPathStart = pathStart;
33
+ while (actualPathStart < line.length && /\s/.test(line[actualPathStart])) {
34
+ actualPathStart++;
35
+ }
36
+ // Find the end of the path (end of line or start of comment)
37
+ let pathEnd = actualPathStart;
38
+ while (pathEnd < line.length) {
39
+ const char = line[pathEnd];
40
+ if (char === ';' || char === '#') {
41
+ break;
42
+ }
43
+ pathEnd++;
44
+ }
45
+ // Trim trailing whitespace
46
+ while (pathEnd > actualPathStart && /\s/.test(line[pathEnd - 1])) {
47
+ pathEnd--;
48
+ }
49
+ const includePath = line.substring(actualPathStart, pathEnd).trim();
50
+ if (!includePath)
51
+ continue;
52
+ // Resolve the include path to a full URI
53
+ const resolvedUri = (0, uri_1.resolveIncludePath)(includePath, document.uri);
54
+ links.push({
55
+ range: {
56
+ start: { line: directive.line, character: actualPathStart },
57
+ end: { line: directive.line, character: pathEnd }
58
+ },
59
+ target: resolvedUri
60
+ });
61
+ }
62
+ }
63
+ return links;
64
+ }
65
+ }
66
+ exports.DocumentLinksProvider = DocumentLinksProvider;
67
+ exports.documentLinksProvider = new DocumentLinksProvider();
68
+ //# sourceMappingURL=documentLinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentLinks.js","sourceRoot":"","sources":["../../src/features/documentLinks.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAKH,sCAAkD;AAElD,MAAa,qBAAqB;IAChC;;OAEG;IACH,oBAAoB,CAAC,QAAsB,EAAE,SAAyB;QACpE,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,0CAA0C;QAC1C,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7C,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACjE,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,oCAAoC;gBACpC,MAAM,cAAc,GAAG,SAAS,CAAC;gBACjC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAClD,IAAI,YAAY,KAAK,CAAC,CAAC;oBAAE,SAAS;gBAElC,gDAAgD;gBAChD,MAAM,SAAS,GAAG,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC;gBACvD,kCAAkC;gBAClC,IAAI,eAAe,GAAG,SAAS,CAAC;gBAChC,OAAO,eAAe,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;oBACzE,eAAe,EAAE,CAAC;gBACpB,CAAC;gBAED,6DAA6D;gBAC7D,IAAI,OAAO,GAAG,eAAe,CAAC;gBAC9B,OAAO,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC3B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;wBACjC,MAAM;oBACR,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,2BAA2B;gBAC3B,OAAO,OAAO,GAAG,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpE,IAAI,CAAC,WAAW;oBAAE,SAAS;gBAE3B,yCAAyC;gBACzC,MAAM,WAAW,GAAG,IAAA,wBAAkB,EAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAElE,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE;wBAC3D,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE;qBAClD;oBACD,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5DD,sDA4DC;AAEY,QAAA,qBAAqB,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Find references provider for hledger language server
3
+ *
4
+ * Finds all occurrences of accounts, payees, commodities, and tags
5
+ * across the journal file and its includes.
6
+ */
7
+ import { Location, Position } from 'vscode-languageserver';
8
+ import { TextDocument } from 'vscode-languageserver-textdocument';
9
+ import { ParsedDocument } from '../types';
10
+ export declare class FindReferencesProvider {
11
+ /**
12
+ * Find all references to the symbol at the given position
13
+ */
14
+ findReferences(document: TextDocument, position: Position, parsed: ParsedDocument, includeDeclaration: boolean): Location[] | null;
15
+ /**
16
+ * Find all references to an account
17
+ */
18
+ private findAccountReferences;
19
+ /**
20
+ * Find all references to a payee
21
+ */
22
+ private findPayeeReferences;
23
+ /**
24
+ * Find all references to a commodity
25
+ */
26
+ private findCommodityReferences;
27
+ /**
28
+ * Find all references to a tag
29
+ */
30
+ private findTagReferences;
31
+ }
32
+ export declare const findReferencesProvider: FindReferencesProvider;
33
+ //# sourceMappingURL=findReferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReferences.d.ts","sourceRoot":"","sources":["../../src/features/findReferences.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAS,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,qBAAa,sBAAsB;IACjC;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,cAAc,EACtB,kBAAkB,EAAE,OAAO,GAC1B,QAAQ,EAAE,GAAG,IAAI;IAsCpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAS/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAQ1B;AAED,eAAO,MAAM,sBAAsB,wBAA+B,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * Find references provider for hledger language server
4
+ *
5
+ * Finds all occurrences of accounts, payees, commodities, and tags
6
+ * across the journal file and its includes.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.findReferencesProvider = exports.FindReferencesProvider = void 0;
10
+ const vscode_languageserver_1 = require("vscode-languageserver");
11
+ const codeActions_1 = require("./codeActions");
12
+ class FindReferencesProvider {
13
+ /**
14
+ * Find all references to the symbol at the given position
15
+ */
16
+ findReferences(document, position, parsed, includeDeclaration) {
17
+ // Get the item at cursor
18
+ const item = codeActions_1.codeActionProvider.getItemAtCursor(document, position, parsed);
19
+ if (!item) {
20
+ return null;
21
+ }
22
+ // Find all references across all files
23
+ const locations = [];
24
+ // Build a map of URI -> document content for all files
25
+ const fileContents = new Map();
26
+ fileContents.set(document.uri, document.getText());
27
+ // We need to process the main document and any included files
28
+ // For now, we'll only search the current document since we don't have
29
+ // access to other file contents in this provider
30
+ // TODO: This could be extended to search included files if we have access to them
31
+ // Find references based on item type
32
+ switch (item.type) {
33
+ case 'account':
34
+ locations.push(...this.findAccountReferences(document, item.name, parsed));
35
+ break;
36
+ case 'payee':
37
+ locations.push(...this.findPayeeReferences(document, item.name, parsed));
38
+ break;
39
+ case 'commodity':
40
+ locations.push(...this.findCommodityReferences(document, item.name, parsed));
41
+ break;
42
+ case 'tag':
43
+ locations.push(...this.findTagReferences(document, item.name, parsed));
44
+ break;
45
+ }
46
+ return locations;
47
+ }
48
+ /**
49
+ * Find all references to an account
50
+ */
51
+ findAccountReferences(document, accountName, parsed) {
52
+ const ranges = codeActions_1.codeActionProvider.findAccountReferences(document, accountName, parsed);
53
+ return ranges.map(range => vscode_languageserver_1.Location.create(document.uri, range));
54
+ }
55
+ /**
56
+ * Find all references to a payee
57
+ */
58
+ findPayeeReferences(document, payeeName, parsed) {
59
+ const ranges = codeActions_1.codeActionProvider.findPayeeReferences(document, payeeName, parsed);
60
+ return ranges.map(range => vscode_languageserver_1.Location.create(document.uri, range));
61
+ }
62
+ /**
63
+ * Find all references to a commodity
64
+ */
65
+ findCommodityReferences(document, commodityName, parsed) {
66
+ const ranges = codeActions_1.codeActionProvider.findCommodityReferences(document, commodityName, parsed);
67
+ return ranges.map(range => vscode_languageserver_1.Location.create(document.uri, range));
68
+ }
69
+ /**
70
+ * Find all references to a tag
71
+ */
72
+ findTagReferences(document, tagName, parsed) {
73
+ const ranges = codeActions_1.codeActionProvider.findTagReferences(document, tagName, parsed);
74
+ return ranges.map(range => vscode_languageserver_1.Location.create(document.uri, range));
75
+ }
76
+ }
77
+ exports.FindReferencesProvider = FindReferencesProvider;
78
+ exports.findReferencesProvider = new FindReferencesProvider();
79
+ //# sourceMappingURL=findReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReferences.js","sourceRoot":"","sources":["../../src/features/findReferences.ts"],"names":[],"mappings":"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"}