@liendev/parser 0.39.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 (153) hide show
  1. package/dist/ast/chunker.d.ts +30 -0
  2. package/dist/ast/chunker.d.ts.map +1 -0
  3. package/dist/ast/chunker.js +310 -0
  4. package/dist/ast/chunker.js.map +1 -0
  5. package/dist/ast/complexity/cognitive.d.ts +16 -0
  6. package/dist/ast/complexity/cognitive.d.ts.map +1 -0
  7. package/dist/ast/complexity/cognitive.js +137 -0
  8. package/dist/ast/complexity/cognitive.js.map +1 -0
  9. package/dist/ast/complexity/cyclomatic.d.ts +12 -0
  10. package/dist/ast/complexity/cyclomatic.d.ts.map +1 -0
  11. package/dist/ast/complexity/cyclomatic.js +54 -0
  12. package/dist/ast/complexity/cyclomatic.js.map +1 -0
  13. package/dist/ast/complexity/halstead.d.ts +56 -0
  14. package/dist/ast/complexity/halstead.d.ts.map +1 -0
  15. package/dist/ast/complexity/halstead.js +196 -0
  16. package/dist/ast/complexity/halstead.js.map +1 -0
  17. package/dist/ast/complexity/index.d.ts +13 -0
  18. package/dist/ast/complexity/index.d.ts.map +1 -0
  19. package/dist/ast/complexity/index.js +12 -0
  20. package/dist/ast/complexity/index.js.map +1 -0
  21. package/dist/ast/extractors/index.d.ts +35 -0
  22. package/dist/ast/extractors/index.d.ts.map +1 -0
  23. package/dist/ast/extractors/index.js +41 -0
  24. package/dist/ast/extractors/index.js.map +1 -0
  25. package/dist/ast/extractors/symbol-helpers.d.ts +20 -0
  26. package/dist/ast/extractors/symbol-helpers.d.ts.map +1 -0
  27. package/dist/ast/extractors/symbol-helpers.js +58 -0
  28. package/dist/ast/extractors/symbol-helpers.js.map +1 -0
  29. package/dist/ast/extractors/types.d.ts +108 -0
  30. package/dist/ast/extractors/types.d.ts.map +1 -0
  31. package/dist/ast/extractors/types.js +2 -0
  32. package/dist/ast/extractors/types.js.map +1 -0
  33. package/dist/ast/languages/javascript.d.ts +134 -0
  34. package/dist/ast/languages/javascript.d.ts.map +1 -0
  35. package/dist/ast/languages/javascript.js +787 -0
  36. package/dist/ast/languages/javascript.js.map +1 -0
  37. package/dist/ast/languages/php.d.ts +84 -0
  38. package/dist/ast/languages/php.d.ts.map +1 -0
  39. package/dist/ast/languages/php.js +452 -0
  40. package/dist/ast/languages/php.js.map +1 -0
  41. package/dist/ast/languages/python.d.ts +96 -0
  42. package/dist/ast/languages/python.d.ts.map +1 -0
  43. package/dist/ast/languages/python.js +448 -0
  44. package/dist/ast/languages/python.js.map +1 -0
  45. package/dist/ast/languages/registry.d.ts +30 -0
  46. package/dist/ast/languages/registry.d.ts.map +1 -0
  47. package/dist/ast/languages/registry.js +95 -0
  48. package/dist/ast/languages/registry.js.map +1 -0
  49. package/dist/ast/languages/rust.d.ts +113 -0
  50. package/dist/ast/languages/rust.d.ts.map +1 -0
  51. package/dist/ast/languages/rust.js +614 -0
  52. package/dist/ast/languages/rust.js.map +1 -0
  53. package/dist/ast/languages/types.d.ts +52 -0
  54. package/dist/ast/languages/types.d.ts.map +1 -0
  55. package/dist/ast/languages/types.js +2 -0
  56. package/dist/ast/languages/types.js.map +1 -0
  57. package/dist/ast/languages/typescript.d.ts +3 -0
  58. package/dist/ast/languages/typescript.d.ts.map +1 -0
  59. package/dist/ast/languages/typescript.js +134 -0
  60. package/dist/ast/languages/typescript.js.map +1 -0
  61. package/dist/ast/parser.d.ts +29 -0
  62. package/dist/ast/parser.d.ts.map +1 -0
  63. package/dist/ast/parser.js +67 -0
  64. package/dist/ast/parser.js.map +1 -0
  65. package/dist/ast/symbols.d.ts +74 -0
  66. package/dist/ast/symbols.d.ts.map +1 -0
  67. package/dist/ast/symbols.js +171 -0
  68. package/dist/ast/symbols.js.map +1 -0
  69. package/dist/ast/traversers/index.d.ts +19 -0
  70. package/dist/ast/traversers/index.d.ts.map +1 -0
  71. package/dist/ast/traversers/index.js +21 -0
  72. package/dist/ast/traversers/index.js.map +1 -0
  73. package/dist/ast/traversers/types.d.ts +98 -0
  74. package/dist/ast/traversers/types.d.ts.map +1 -0
  75. package/dist/ast/traversers/types.js +2 -0
  76. package/dist/ast/traversers/types.js.map +1 -0
  77. package/dist/ast/types.d.ts +54 -0
  78. package/dist/ast/types.d.ts.map +1 -0
  79. package/dist/ast/types.js +2 -0
  80. package/dist/ast/types.js.map +1 -0
  81. package/dist/chunk-only-index.d.ts +25 -0
  82. package/dist/chunk-only-index.d.ts.map +1 -0
  83. package/dist/chunk-only-index.js +107 -0
  84. package/dist/chunk-only-index.js.map +1 -0
  85. package/dist/chunker.d.ts +12 -0
  86. package/dist/chunker.d.ts.map +1 -0
  87. package/dist/chunker.js +98 -0
  88. package/dist/chunker.js.map +1 -0
  89. package/dist/constants.d.ts +8 -0
  90. package/dist/constants.d.ts.map +1 -0
  91. package/dist/constants.js +11 -0
  92. package/dist/constants.js.map +1 -0
  93. package/dist/content-hash.d.ts +20 -0
  94. package/dist/content-hash.d.ts.map +1 -0
  95. package/dist/content-hash.js +91 -0
  96. package/dist/content-hash.js.map +1 -0
  97. package/dist/dependency-analyzer.d.ts +79 -0
  98. package/dist/dependency-analyzer.d.ts.map +1 -0
  99. package/dist/dependency-analyzer.js +408 -0
  100. package/dist/dependency-analyzer.js.map +1 -0
  101. package/dist/ecosystem-presets.d.ts +32 -0
  102. package/dist/ecosystem-presets.d.ts.map +1 -0
  103. package/dist/ecosystem-presets.js +325 -0
  104. package/dist/ecosystem-presets.js.map +1 -0
  105. package/dist/gitignore.d.ts +22 -0
  106. package/dist/gitignore.d.ts.map +1 -0
  107. package/dist/gitignore.js +128 -0
  108. package/dist/gitignore.js.map +1 -0
  109. package/dist/index.d.ts +32 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +68 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/insights/chunk-complexity.d.ts +89 -0
  114. package/dist/insights/chunk-complexity.d.ts.map +1 -0
  115. package/dist/insights/chunk-complexity.js +332 -0
  116. package/dist/insights/chunk-complexity.js.map +1 -0
  117. package/dist/insights/types.d.ts +73 -0
  118. package/dist/insights/types.d.ts.map +1 -0
  119. package/dist/insights/types.js +9 -0
  120. package/dist/insights/types.js.map +1 -0
  121. package/dist/json-template-chunker.d.ts +12 -0
  122. package/dist/json-template-chunker.d.ts.map +1 -0
  123. package/dist/json-template-chunker.js +87 -0
  124. package/dist/json-template-chunker.js.map +1 -0
  125. package/dist/liquid-chunker.d.ts +16 -0
  126. package/dist/liquid-chunker.d.ts.map +1 -0
  127. package/dist/liquid-chunker.js +274 -0
  128. package/dist/liquid-chunker.js.map +1 -0
  129. package/dist/scanner.d.ts +16 -0
  130. package/dist/scanner.d.ts.map +1 -0
  131. package/dist/scanner.js +95 -0
  132. package/dist/scanner.js.map +1 -0
  133. package/dist/symbol-extractor.d.ts +18 -0
  134. package/dist/symbol-extractor.d.ts.map +1 -0
  135. package/dist/symbol-extractor.js +343 -0
  136. package/dist/symbol-extractor.js.map +1 -0
  137. package/dist/test-associations.d.ts +16 -0
  138. package/dist/test-associations.d.ts.map +1 -0
  139. package/dist/test-associations.js +43 -0
  140. package/dist/test-associations.js.map +1 -0
  141. package/dist/types.d.ts +75 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +2 -0
  144. package/dist/types.js.map +1 -0
  145. package/dist/utils/path-matching.d.ts +71 -0
  146. package/dist/utils/path-matching.d.ts.map +1 -0
  147. package/dist/utils/path-matching.js +258 -0
  148. package/dist/utils/path-matching.js.map +1 -0
  149. package/dist/utils/repo-id.d.ts +6 -0
  150. package/dist/utils/repo-id.d.ts.map +1 -0
  151. package/dist/utils/repo-id.js +12 -0
  152. package/dist/utils/repo-id.js.map +1 -0
  153. package/package.json +66 -0
@@ -0,0 +1,614 @@
1
+ import Rust from 'tree-sitter-rust';
2
+ import { extractSignature, extractParameters, extractReturnType, } from '../extractors/symbol-helpers.js';
3
+ import { calculateComplexity } from '../complexity/index.js';
4
+ // =============================================================================
5
+ // TRAVERSER
6
+ // =============================================================================
7
+ /**
8
+ * Rust AST traverser
9
+ *
10
+ * Handles Rust AST node types and traversal patterns.
11
+ * Rust is similar to Python in that functions are always declared with `fn`:
12
+ * - No variable declarations with functions (unlike JS const x = || {})
13
+ * - `impl` blocks and `trait` blocks act as containers (like classes)
14
+ * - Closures exist but are not top-level declarations
15
+ */
16
+ export class RustTraverser {
17
+ targetNodeTypes = ['function_item', 'function_signature_item'];
18
+ containerTypes = ['impl_item', 'trait_item'];
19
+ declarationTypes = [];
20
+ functionTypes = ['closure_expression'];
21
+ shouldExtractChildren(node) {
22
+ return this.containerTypes.includes(node.type);
23
+ }
24
+ isDeclarationWithFunction(_node) {
25
+ return false;
26
+ }
27
+ getContainerBody(node) {
28
+ if (node.type === 'impl_item' || node.type === 'trait_item') {
29
+ return node.childForFieldName('body');
30
+ }
31
+ return null;
32
+ }
33
+ shouldTraverseChildren(node) {
34
+ return (node.type === 'source_file' || node.type === 'declaration_list' || node.type === 'mod_item');
35
+ }
36
+ findParentContainerName(node) {
37
+ let current = node.parent;
38
+ while (current) {
39
+ if (current.type === 'impl_item') {
40
+ const typeNode = current.childForFieldName('type');
41
+ return typeNode?.text;
42
+ }
43
+ if (current.type === 'trait_item') {
44
+ const nameNode = current.childForFieldName('name');
45
+ return nameNode?.text;
46
+ }
47
+ current = current.parent;
48
+ }
49
+ return undefined;
50
+ }
51
+ findFunctionInDeclaration(_node) {
52
+ return {
53
+ hasFunction: false,
54
+ functionNode: null,
55
+ };
56
+ }
57
+ }
58
+ // =============================================================================
59
+ // EXPORT EXTRACTOR
60
+ // =============================================================================
61
+ /**
62
+ * Rust export extractor
63
+ *
64
+ * Rust uses `pub` visibility to mark items as exported. Items with a
65
+ * `visibility_modifier` child (e.g., `pub`, `pub(crate)`) are considered exports.
66
+ *
67
+ * Exportable items:
68
+ * - pub fn helper() {}
69
+ * - pub struct User {}
70
+ * - pub enum Status {}
71
+ * - pub trait Serialize {}
72
+ * - pub type Alias = ...
73
+ * - pub const VALUE: ... = ...
74
+ * - pub static GLOBAL: ... = ...
75
+ * - pub mod submodule;
76
+ * - pub use other::Thing; (re-exports)
77
+ */
78
+ export class RustExportExtractor {
79
+ exportableTypes = new Set([
80
+ 'function_item',
81
+ 'struct_item',
82
+ 'enum_item',
83
+ 'trait_item',
84
+ 'type_item',
85
+ 'const_item',
86
+ 'static_item',
87
+ 'mod_item',
88
+ ]);
89
+ extractExports(rootNode) {
90
+ const exports = [];
91
+ const seen = new Set();
92
+ const addExport = (name) => {
93
+ if (name && !seen.has(name)) {
94
+ seen.add(name);
95
+ exports.push(name);
96
+ }
97
+ };
98
+ for (let i = 0; i < rootNode.namedChildCount; i++) {
99
+ const child = rootNode.namedChild(i);
100
+ if (!child)
101
+ continue;
102
+ if (!this.hasVisibilityModifier(child))
103
+ continue;
104
+ this.extractExportName(child, addExport);
105
+ }
106
+ return exports;
107
+ }
108
+ extractExportName(node, addExport) {
109
+ if (node.type === 'use_declaration') {
110
+ const argument = node.childForFieldName('argument');
111
+ if (argument) {
112
+ const names = this.extractUseExportNames(argument);
113
+ names.forEach(addExport);
114
+ }
115
+ return;
116
+ }
117
+ if (this.exportableTypes.has(node.type)) {
118
+ const nameNode = node.childForFieldName('name');
119
+ if (nameNode)
120
+ addExport(nameNode.text);
121
+ }
122
+ }
123
+ hasVisibilityModifier(node) {
124
+ for (let i = 0; i < node.childCount; i++) {
125
+ const child = node.child(i);
126
+ if (child?.type === 'visibility_modifier')
127
+ return true;
128
+ }
129
+ return false;
130
+ }
131
+ /**
132
+ * Extract exported names from a use declaration argument.
133
+ * Handles both simple patterns and list patterns:
134
+ * - `pub use crate::auth::AuthService;` -> ["AuthService"]
135
+ * - `pub use crate::auth::{AuthService, AuthError};` -> ["AuthService", "AuthError"]
136
+ */
137
+ extractUseExportNames(node) {
138
+ if (node.type === 'scoped_identifier') {
139
+ const nameNode = node.childForFieldName('name');
140
+ return nameNode ? [nameNode.text] : [];
141
+ }
142
+ if (node.type === 'identifier') {
143
+ return [node.text];
144
+ }
145
+ if (node.type === 'scoped_use_list') {
146
+ // Find the use_list child and extract symbols
147
+ for (let i = 0; i < node.namedChildCount; i++) {
148
+ const child = node.namedChild(i);
149
+ if (child?.type === 'use_list') {
150
+ return extractUseListSymbols(child);
151
+ }
152
+ }
153
+ }
154
+ return [];
155
+ }
156
+ }
157
+ // =============================================================================
158
+ // IMPORT EXTRACTOR
159
+ // =============================================================================
160
+ /**
161
+ * Convert a Rust module path to a relative file path.
162
+ *
163
+ * - `crate::auth::middleware` -> `auth/middleware`
164
+ * - `self::config` -> `config`
165
+ * - `super::utils` -> `../utils`
166
+ * - `std::io` -> null (external crate, skip)
167
+ */
168
+ function convertRustModulePath(path) {
169
+ // Remove leading `crate::`, `self::`, or `super::`
170
+ if (path.startsWith('crate::')) {
171
+ return path.slice('crate::'.length).replace(/::/g, '/');
172
+ }
173
+ if (path.startsWith('self::')) {
174
+ return path.slice('self::'.length).replace(/::/g, '/');
175
+ }
176
+ if (path.startsWith('super::')) {
177
+ return '../' + path.slice('super::'.length).replace(/::/g, '/');
178
+ }
179
+ // External crate - skip
180
+ return null;
181
+ }
182
+ /**
183
+ * Extract the module path prefix from a scoped use argument.
184
+ * For `crate::auth::AuthService`, returns `crate::auth`.
185
+ * For `crate::auth::{A, B}`, returns `crate::auth`.
186
+ */
187
+ function extractScopePath(node) {
188
+ const pathNode = node.childForFieldName('path');
189
+ return pathNode?.text ?? null;
190
+ }
191
+ /**
192
+ * Extract the symbol name from a use_as_clause node.
193
+ * Prefers the alias if present, otherwise takes the last identifier.
194
+ */
195
+ function extractUseAsClauseSymbol(node) {
196
+ const alias = node.childForFieldName('alias');
197
+ if (alias)
198
+ return alias.text;
199
+ // Fallback: take the last identifier
200
+ for (let j = node.namedChildCount - 1; j >= 0; j--) {
201
+ const child = node.namedChild(j);
202
+ if (child?.type === 'identifier')
203
+ return child.text;
204
+ }
205
+ return null;
206
+ }
207
+ /**
208
+ * Extract the symbol name from a single use_list item.
209
+ */
210
+ function extractUseListItemSymbol(item) {
211
+ switch (item.type) {
212
+ case 'identifier':
213
+ return item.text;
214
+ case 'scoped_identifier':
215
+ return item.childForFieldName('name')?.text ?? null;
216
+ case 'use_as_clause':
217
+ return extractUseAsClauseSymbol(item);
218
+ case 'use_wildcard':
219
+ return '*';
220
+ default:
221
+ return null;
222
+ }
223
+ }
224
+ /**
225
+ * Extract imported symbol names from a use_list node.
226
+ * Handles: identifier, scoped_identifier, use_as_clause, use_wildcard
227
+ */
228
+ function extractUseListSymbols(useList) {
229
+ const symbols = [];
230
+ for (let i = 0; i < useList.namedChildCount; i++) {
231
+ const item = useList.namedChild(i);
232
+ if (!item)
233
+ continue;
234
+ const symbol = extractUseListItemSymbol(item);
235
+ if (symbol)
236
+ symbols.push(symbol);
237
+ }
238
+ return symbols;
239
+ }
240
+ /**
241
+ * Rust import extractor
242
+ *
243
+ * Handles all `use` declarations (not just `pub use`).
244
+ * Every `use` creates a dependency.
245
+ *
246
+ * Examples:
247
+ * - `use crate::auth::AuthService;`
248
+ * - `use crate::auth::{AuthService, AuthError};`
249
+ * - `use crate::auth::Service as Auth;`
250
+ * - `use crate::models::*;`
251
+ * - `use std::io::Read;` (external - skipped)
252
+ * - `use super::utils::helper;`
253
+ */
254
+ export class RustImportExtractor {
255
+ importNodeTypes = ['use_declaration'];
256
+ extractImportPath(node) {
257
+ const argument = node.childForFieldName('argument');
258
+ if (!argument)
259
+ return null;
260
+ const fullPath = this.resolveFullPath(argument);
261
+ return fullPath ? convertRustModulePath(fullPath) : null;
262
+ }
263
+ processImportSymbols(node) {
264
+ const argument = node.childForFieldName('argument');
265
+ if (!argument)
266
+ return null;
267
+ return this.processUseArgument(argument);
268
+ }
269
+ processUseArgument(node) {
270
+ // Simple: `use crate::auth::AuthService;`
271
+ if (node.type === 'scoped_identifier') {
272
+ return this.processScopedIdentifier(node);
273
+ }
274
+ // List: `use crate::auth::{AuthService, AuthError};`
275
+ if (node.type === 'scoped_use_list') {
276
+ return this.processScopedUseList(node);
277
+ }
278
+ // Alias: `use crate::auth::Service as Auth;`
279
+ if (node.type === 'use_as_clause') {
280
+ return this.processUseAsClause(node);
281
+ }
282
+ // Wildcard: `use crate::models::*;`
283
+ if (node.type === 'use_wildcard') {
284
+ return this.processUseWildcard(node);
285
+ }
286
+ // Direct identifier (rare): `use SomeItem;`
287
+ if (node.type === 'identifier') {
288
+ return null; // External or ambient, skip
289
+ }
290
+ return null;
291
+ }
292
+ processScopedIdentifier(node) {
293
+ const pathNode = node.childForFieldName('path');
294
+ const nameNode = node.childForFieldName('name');
295
+ if (!pathNode || !nameNode)
296
+ return null;
297
+ const modulePath = convertRustModulePath(pathNode.text);
298
+ if (!modulePath)
299
+ return null;
300
+ return { importPath: modulePath, symbols: [nameNode.text] };
301
+ }
302
+ processScopedUseList(node) {
303
+ const scopePath = extractScopePath(node);
304
+ if (!scopePath)
305
+ return null;
306
+ const modulePath = convertRustModulePath(scopePath);
307
+ if (!modulePath)
308
+ return null;
309
+ // Find the use_list child
310
+ let useList = null;
311
+ for (let i = 0; i < node.namedChildCount; i++) {
312
+ const child = node.namedChild(i);
313
+ if (child?.type === 'use_list') {
314
+ useList = child;
315
+ break;
316
+ }
317
+ }
318
+ if (!useList)
319
+ return null;
320
+ const symbols = extractUseListSymbols(useList);
321
+ return symbols.length > 0 ? { importPath: modulePath, symbols } : null;
322
+ }
323
+ processUseAsClause(node) {
324
+ // `use crate::auth::Service as Auth;`
325
+ // The first child is the path (scoped_identifier), alias field has the alias
326
+ const aliasNode = node.childForFieldName('alias');
327
+ let pathChild = null;
328
+ for (let i = 0; i < node.namedChildCount; i++) {
329
+ const child = node.namedChild(i);
330
+ if (child?.type === 'scoped_identifier') {
331
+ pathChild = child;
332
+ break;
333
+ }
334
+ }
335
+ if (!pathChild)
336
+ return null;
337
+ const scopePathNode = pathChild.childForFieldName('path');
338
+ if (!scopePathNode)
339
+ return null;
340
+ const modulePath = convertRustModulePath(scopePathNode.text);
341
+ if (!modulePath)
342
+ return null;
343
+ const symbol = aliasNode?.text || pathChild.childForFieldName('name')?.text;
344
+ if (!symbol)
345
+ return null;
346
+ return { importPath: modulePath, symbols: [symbol] };
347
+ }
348
+ processUseWildcard(node) {
349
+ // `use crate::models::*;` -> AST is:
350
+ // use_wildcard
351
+ // scoped_identifier (crate::models)
352
+ // *
353
+ // Find the scoped_identifier child to get the path
354
+ for (let i = 0; i < node.namedChildCount; i++) {
355
+ const child = node.namedChild(i);
356
+ if (child?.type === 'scoped_identifier') {
357
+ const modulePath = convertRustModulePath(child.text);
358
+ if (!modulePath)
359
+ return null;
360
+ return { importPath: modulePath, symbols: ['*'] };
361
+ }
362
+ }
363
+ return null;
364
+ }
365
+ /**
366
+ * Resolve the full path of a use argument for the imports list.
367
+ * Returns the full `crate::...` path or similar.
368
+ */
369
+ resolveFullPath(node) {
370
+ if (node.type === 'scoped_identifier') {
371
+ return node.text;
372
+ }
373
+ if (node.type === 'scoped_use_list') {
374
+ const pathNode = node.childForFieldName('path');
375
+ return pathNode?.text ?? null;
376
+ }
377
+ if (node.type === 'use_as_clause') {
378
+ // Find the scoped_identifier inside
379
+ for (let i = 0; i < node.namedChildCount; i++) {
380
+ const child = node.namedChild(i);
381
+ if (child?.type === 'scoped_identifier') {
382
+ return child.text;
383
+ }
384
+ }
385
+ }
386
+ if (node.type === 'use_wildcard') {
387
+ // use_wildcard contains a scoped_identifier child, not a 'path' field
388
+ for (let i = 0; i < node.namedChildCount; i++) {
389
+ const child = node.namedChild(i);
390
+ if (child?.type === 'scoped_identifier') {
391
+ return child.text;
392
+ }
393
+ }
394
+ return null;
395
+ }
396
+ return null;
397
+ }
398
+ }
399
+ // =============================================================================
400
+ // SYMBOL EXTRACTOR
401
+ // =============================================================================
402
+ /**
403
+ * Rust symbol extractor
404
+ *
405
+ * Handles:
406
+ * - function_item (fn foo() {})
407
+ * - function_signature_item (fn foo(); in traits)
408
+ * - impl_item (impl Foo {}) - treated as class equivalent
409
+ * - trait_item (trait Foo {}) - treated as interface equivalent
410
+ *
411
+ * Call sites: call_expression (foo()), macro_invocation (println!())
412
+ */
413
+ export class RustSymbolExtractor {
414
+ symbolNodeTypes = [
415
+ 'function_item',
416
+ 'function_signature_item',
417
+ 'impl_item',
418
+ 'trait_item',
419
+ ];
420
+ extractSymbol(node, content, parentClass) {
421
+ switch (node.type) {
422
+ case 'function_item':
423
+ case 'function_signature_item':
424
+ return this.extractFunctionInfo(node, content, parentClass);
425
+ case 'impl_item':
426
+ return this.extractImplInfo(node);
427
+ case 'trait_item':
428
+ return this.extractTraitInfo(node);
429
+ default:
430
+ return null;
431
+ }
432
+ }
433
+ extractCallSite(node) {
434
+ const line = node.startPosition.row + 1;
435
+ // call_expression: foo(), obj.method()
436
+ if (node.type === 'call_expression') {
437
+ const funcNode = node.childForFieldName('function');
438
+ if (!funcNode)
439
+ return null;
440
+ if (funcNode.type === 'identifier') {
441
+ return { symbol: funcNode.text, line, key: `${funcNode.text}:${line}` };
442
+ }
443
+ // field_expression: obj.method()
444
+ if (funcNode.type === 'field_expression') {
445
+ const fieldNode = funcNode.childForFieldName('field');
446
+ if (fieldNode?.type === 'field_identifier') {
447
+ return { symbol: fieldNode.text, line, key: `${fieldNode.text}:${line}` };
448
+ }
449
+ }
450
+ return null;
451
+ }
452
+ // macro_invocation: println!(), vec![]
453
+ if (node.type === 'macro_invocation') {
454
+ const macroNode = node.childForFieldName('macro');
455
+ if (macroNode?.type === 'identifier') {
456
+ const symbol = `${macroNode.text}!`;
457
+ return { symbol, line, key: `${symbol}:${line}` };
458
+ }
459
+ }
460
+ return null;
461
+ }
462
+ extractFunctionInfo(node, content, parentClass) {
463
+ const nameNode = node.childForFieldName('name');
464
+ if (!nameNode)
465
+ return null;
466
+ return {
467
+ name: nameNode.text,
468
+ type: parentClass ? 'method' : 'function',
469
+ startLine: node.startPosition.row + 1,
470
+ endLine: node.endPosition.row + 1,
471
+ parentClass,
472
+ signature: extractSignature(node, content),
473
+ parameters: extractParameters(node, content),
474
+ returnType: extractReturnType(node, content),
475
+ complexity: calculateComplexity(node),
476
+ };
477
+ }
478
+ extractImplInfo(node) {
479
+ const typeNode = node.childForFieldName('type');
480
+ if (!typeNode)
481
+ return null;
482
+ return {
483
+ name: typeNode.text,
484
+ type: 'class',
485
+ startLine: node.startPosition.row + 1,
486
+ endLine: node.endPosition.row + 1,
487
+ signature: `impl ${typeNode.text}`,
488
+ };
489
+ }
490
+ extractTraitInfo(node) {
491
+ const nameNode = node.childForFieldName('name');
492
+ if (!nameNode)
493
+ return null;
494
+ return {
495
+ name: nameNode.text,
496
+ type: 'interface',
497
+ startLine: node.startPosition.row + 1,
498
+ endLine: node.endPosition.row + 1,
499
+ signature: `trait ${nameNode.text}`,
500
+ };
501
+ }
502
+ }
503
+ // =============================================================================
504
+ // LANGUAGE DEFINITION
505
+ // =============================================================================
506
+ export const rustDefinition = {
507
+ id: 'rust',
508
+ extensions: ['rs'],
509
+ grammar: Rust,
510
+ traverser: new RustTraverser(),
511
+ exportExtractor: new RustExportExtractor(),
512
+ importExtractor: new RustImportExtractor(),
513
+ symbolExtractor: new RustSymbolExtractor(),
514
+ complexity: {
515
+ decisionPoints: [
516
+ 'if_expression',
517
+ 'match_expression',
518
+ 'while_expression',
519
+ 'for_expression',
520
+ 'loop_expression',
521
+ 'match_arm',
522
+ 'binary_expression',
523
+ ],
524
+ nestingTypes: [
525
+ 'if_expression',
526
+ 'for_expression',
527
+ 'while_expression',
528
+ 'loop_expression',
529
+ 'match_expression',
530
+ ],
531
+ nonNestingTypes: ['else_clause', 'match_arm'],
532
+ lambdaTypes: ['closure_expression'],
533
+ operatorSymbols: new Set([
534
+ '+',
535
+ '-',
536
+ '*',
537
+ '/',
538
+ '%',
539
+ '==',
540
+ '!=',
541
+ '<',
542
+ '>',
543
+ '<=',
544
+ '>=',
545
+ '=',
546
+ '+=',
547
+ '-=',
548
+ '*=',
549
+ '/=',
550
+ '%=',
551
+ '&=',
552
+ '|=',
553
+ '^=',
554
+ '<<=',
555
+ '>>=',
556
+ '&',
557
+ '|',
558
+ '^',
559
+ '!',
560
+ '<<',
561
+ '>>',
562
+ '.',
563
+ '::',
564
+ '..',
565
+ '..=',
566
+ '=>',
567
+ '->',
568
+ '?',
569
+ '(',
570
+ ')',
571
+ '[',
572
+ ']',
573
+ '{',
574
+ '}',
575
+ ]),
576
+ operatorKeywords: new Set([
577
+ 'if',
578
+ 'else',
579
+ 'match',
580
+ 'for',
581
+ 'while',
582
+ 'loop',
583
+ 'return',
584
+ 'break',
585
+ 'continue',
586
+ 'let',
587
+ 'mut',
588
+ 'fn',
589
+ 'struct',
590
+ 'enum',
591
+ 'impl',
592
+ 'trait',
593
+ 'pub',
594
+ 'mod',
595
+ 'use',
596
+ 'as',
597
+ 'async',
598
+ 'await',
599
+ 'unsafe',
600
+ 'where',
601
+ 'move',
602
+ 'ref',
603
+ 'self',
604
+ 'super',
605
+ 'crate',
606
+ 'dyn',
607
+ 'type',
608
+ ]),
609
+ },
610
+ symbols: {
611
+ callExpressionTypes: ['call_expression', 'macro_invocation'],
612
+ },
613
+ };
614
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/ast/languages/rust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { LanguageTraverser } from '../traversers/types.js';
2
+ import type { LanguageExportExtractor, LanguageImportExtractor, LanguageSymbolExtractor } from '../extractors/types.js';
3
+ import type { SupportedLanguage } from './registry.js';
4
+ /**
5
+ * Tree-sitter language grammar type.
6
+ * Using any due to type incompatibility between parser packages and tree-sitter core.
7
+ */
8
+ export type TreeSitterLanguage = any;
9
+ /**
10
+ * Complete definition for a language supported by AST parsing.
11
+ *
12
+ * Each supported language has a single definition file that assembles
13
+ * all language-specific data (grammar, traverser, extractor, complexity
14
+ * constants, symbol types) into one place.
15
+ */
16
+ export interface LanguageDefinition {
17
+ /** Language identifier (e.g., 'typescript', 'python') */
18
+ id: SupportedLanguage;
19
+ /** File extensions without dots (e.g., ['ts', 'tsx']) */
20
+ extensions: string[];
21
+ /** Tree-sitter grammar object for parsing */
22
+ grammar: TreeSitterLanguage;
23
+ /** Language-specific AST traverser instance */
24
+ traverser: LanguageTraverser;
25
+ /** Language-specific export extractor instance */
26
+ exportExtractor: LanguageExportExtractor;
27
+ /** Language-specific import extractor instance (optional for backwards compatibility) */
28
+ importExtractor?: LanguageImportExtractor;
29
+ /** Language-specific symbol extractor instance (optional for backwards compatibility) */
30
+ symbolExtractor?: LanguageSymbolExtractor;
31
+ /** Complexity metric configuration */
32
+ complexity: {
33
+ /** Cyclomatic: AST node types that represent decision points */
34
+ decisionPoints: string[];
35
+ /** Cognitive: node types that increase complexity AND increment nesting */
36
+ nestingTypes: string[];
37
+ /** Cognitive: node types that add complexity but don't nest */
38
+ nonNestingTypes: string[];
39
+ /** Cognitive: lambda/closure types that add complexity when nested */
40
+ lambdaTypes: string[];
41
+ /** Halstead: operator symbol characters (e.g., +, -, &&) */
42
+ operatorSymbols: Set<string>;
43
+ /** Halstead: keyword operators (e.g., if, while, return) */
44
+ operatorKeywords: Set<string>;
45
+ };
46
+ /** Symbol extraction configuration */
47
+ symbols: {
48
+ /** AST node types representing function/method calls */
49
+ callExpressionTypes: string[];
50
+ };
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map