@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,96 @@
1
+ import type Parser from 'tree-sitter';
2
+ import type { SymbolInfo } from '../types.js';
3
+ import type { LanguageDefinition } from './types.js';
4
+ import type { LanguageTraverser, DeclarationFunctionInfo } from '../traversers/types.js';
5
+ import type { LanguageExportExtractor, LanguageImportExtractor, LanguageSymbolExtractor } from '../extractors/types.js';
6
+ /**
7
+ * Python AST traverser
8
+ *
9
+ * Handles Python AST node types and traversal patterns.
10
+ * Python has a simpler structure than TypeScript/JavaScript:
11
+ * - Functions are defined with 'def' or 'async def'
12
+ * - No variable declarations with functions (unlike JS const x = () => {})
13
+ * - Classes contain methods (which are just functions)
14
+ */
15
+ export declare class PythonTraverser implements LanguageTraverser {
16
+ targetNodeTypes: string[];
17
+ containerTypes: string[];
18
+ declarationTypes: string[];
19
+ functionTypes: string[];
20
+ shouldExtractChildren(node: Parser.SyntaxNode): boolean;
21
+ isDeclarationWithFunction(_node: Parser.SyntaxNode): boolean;
22
+ getContainerBody(node: Parser.SyntaxNode): Parser.SyntaxNode | null;
23
+ shouldTraverseChildren(node: Parser.SyntaxNode): boolean;
24
+ findParentContainerName(node: Parser.SyntaxNode): string | undefined;
25
+ findFunctionInDeclaration(_node: Parser.SyntaxNode): DeclarationFunctionInfo;
26
+ }
27
+ /**
28
+ * Python export extractor
29
+ *
30
+ * Python doesn't have explicit export syntax. All module-level (top-level)
31
+ * declarations are considered exported (importable by other modules):
32
+ * - Classes: class User: ...
33
+ * - Functions: def helper(): ...
34
+ * - Async functions: async def fetch_data(): ...
35
+ */
36
+ export declare class PythonExportExtractor implements LanguageExportExtractor {
37
+ private readonly exportableTypes;
38
+ private extractExportName;
39
+ extractExports(rootNode: Parser.SyntaxNode): string[];
40
+ private findModulePathIndex;
41
+ private extractReExportNames;
42
+ }
43
+ /**
44
+ * Python import extractor
45
+ *
46
+ * Handles:
47
+ * - import os
48
+ * - import os as system
49
+ * - from utils.validate import validateEmail, validatePhone
50
+ * - from typing import Optional as Opt
51
+ */
52
+ export declare class PythonImportExtractor implements LanguageImportExtractor {
53
+ readonly importNodeTypes: string[];
54
+ extractImportPath(node: Parser.SyntaxNode): string | null;
55
+ processImportSymbols(node: Parser.SyntaxNode): {
56
+ importPath: string;
57
+ symbols: string[];
58
+ } | null;
59
+ private processSimpleImport;
60
+ private processAliasedImport;
61
+ /**
62
+ * Process Python regular import statement.
63
+ * e.g., "import os", "import os as system"
64
+ */
65
+ private processPythonImport;
66
+ private findModulePath;
67
+ private collectImportedSymbols;
68
+ /**
69
+ * Process Python from...import statement.
70
+ * e.g., "from utils.validate import validateEmail, validatePhone"
71
+ */
72
+ private processPythonFromImport;
73
+ }
74
+ /**
75
+ * Python symbol extractor
76
+ *
77
+ * Handles:
78
+ * - function_definition (def foo():)
79
+ * - async_function_definition (async def foo():)
80
+ * - class_definition (class Foo:)
81
+ *
82
+ * Call sites: call (foo(), obj.method())
83
+ */
84
+ export declare class PythonSymbolExtractor implements LanguageSymbolExtractor {
85
+ readonly symbolNodeTypes: string[];
86
+ extractSymbol(node: Parser.SyntaxNode, content: string, parentClass?: string): SymbolInfo | null;
87
+ extractCallSite(node: Parser.SyntaxNode): {
88
+ symbol: string;
89
+ line: number;
90
+ key: string;
91
+ } | null;
92
+ private extractFunctionInfo;
93
+ private extractClassInfo;
94
+ }
95
+ export declare const pythonDefinition: LanguageDefinition;
96
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/ast/languages/python.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AA+BhC;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,eAAe,WAAwD;IAEvE,cAAc,WAEZ;IAEF,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAEhC,aAAa,WAAwD;IAErE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO;IAIvD,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO;IAI5D,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI;IAOnE,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO;IAIxD,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS;IAYpE,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,uBAAuB;CAM7E;AAMD;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,uBAAuB;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAI7B;IAEH,OAAO,CAAC,iBAAiB;IAgBzB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE;IA8BrD,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,oBAAoB;CAgB7B;AAMD;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,uBAAuB;IACnE,QAAQ,CAAC,eAAe,WAAiD;IAEzE,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI;IAKzD,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAU/F,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,oBAAoB;IAc5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,sBAAsB;IAgB9B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CAWhC;AAMD;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,YAAW,uBAAuB;IACnE,QAAQ,CAAC,eAAe,WAItB;IAEF,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAYhG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuB9F,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,gBAAgB;CAYzB;AAMD,eAAO,MAAM,gBAAgB,EAAE,kBA8G9B,CAAC"}
@@ -0,0 +1,448 @@
1
+ import Python from 'tree-sitter-python';
2
+ import { extractSignature, extractParameters } from '../extractors/symbol-helpers.js';
3
+ import { calculateComplexity } from '../complexity/index.js';
4
+ // =============================================================================
5
+ // SHARED HELPERS
6
+ // =============================================================================
7
+ /**
8
+ * Extract the effective symbol name from a Python aliased_import node.
9
+ * Returns the alias if present, otherwise the original name.
10
+ */
11
+ function extractAliasedSymbolName(node) {
12
+ const identifiers = node.namedChildren.filter(c => c.type === 'identifier');
13
+ if (identifiers.length >= 2) {
14
+ return identifiers[identifiers.length - 1].text;
15
+ }
16
+ if (identifiers.length === 1) {
17
+ return identifiers[0].text;
18
+ }
19
+ const dottedName = node.namedChildren.find(c => c.type === 'dotted_name');
20
+ return dottedName?.text ?? null;
21
+ }
22
+ // =============================================================================
23
+ // TRAVERSER
24
+ // =============================================================================
25
+ /**
26
+ * Python AST traverser
27
+ *
28
+ * Handles Python AST node types and traversal patterns.
29
+ * Python has a simpler structure than TypeScript/JavaScript:
30
+ * - Functions are defined with 'def' or 'async def'
31
+ * - No variable declarations with functions (unlike JS const x = () => {})
32
+ * - Classes contain methods (which are just functions)
33
+ */
34
+ export class PythonTraverser {
35
+ targetNodeTypes = ['function_definition', 'async_function_definition'];
36
+ containerTypes = [
37
+ 'class_definition', // We extract methods, not the class itself
38
+ ];
39
+ declarationTypes = [];
40
+ functionTypes = ['function_definition', 'async_function_definition'];
41
+ shouldExtractChildren(node) {
42
+ return this.containerTypes.includes(node.type);
43
+ }
44
+ isDeclarationWithFunction(_node) {
45
+ return false;
46
+ }
47
+ getContainerBody(node) {
48
+ if (node.type === 'class_definition') {
49
+ return node.childForFieldName('body');
50
+ }
51
+ return null;
52
+ }
53
+ shouldTraverseChildren(node) {
54
+ return node.type === 'module' || node.type === 'block';
55
+ }
56
+ findParentContainerName(node) {
57
+ let current = node.parent;
58
+ while (current) {
59
+ if (current.type === 'class_definition') {
60
+ const nameNode = current.childForFieldName('name');
61
+ return nameNode?.text;
62
+ }
63
+ current = current.parent;
64
+ }
65
+ return undefined;
66
+ }
67
+ findFunctionInDeclaration(_node) {
68
+ return {
69
+ hasFunction: false,
70
+ functionNode: null,
71
+ };
72
+ }
73
+ }
74
+ // =============================================================================
75
+ // EXPORT EXTRACTOR
76
+ // =============================================================================
77
+ /**
78
+ * Python export extractor
79
+ *
80
+ * Python doesn't have explicit export syntax. All module-level (top-level)
81
+ * declarations are considered exported (importable by other modules):
82
+ * - Classes: class User: ...
83
+ * - Functions: def helper(): ...
84
+ * - Async functions: async def fetch_data(): ...
85
+ */
86
+ export class PythonExportExtractor {
87
+ exportableTypes = new Set([
88
+ 'class_definition',
89
+ 'function_definition',
90
+ 'async_function_definition',
91
+ ]);
92
+ extractExportName(node) {
93
+ if (node.type === 'decorated_definition') {
94
+ const definition = node.childForFieldName('definition');
95
+ if (definition && this.exportableTypes.has(definition.type)) {
96
+ return definition.childForFieldName('name')?.text ?? null;
97
+ }
98
+ return null;
99
+ }
100
+ if (this.exportableTypes.has(node.type)) {
101
+ return node.childForFieldName('name')?.text ?? null;
102
+ }
103
+ return null;
104
+ }
105
+ extractExports(rootNode) {
106
+ const exports = [];
107
+ const seen = new Set();
108
+ const addExport = (name) => {
109
+ if (name && !seen.has(name)) {
110
+ seen.add(name);
111
+ exports.push(name);
112
+ }
113
+ };
114
+ for (let i = 0; i < rootNode.namedChildCount; i++) {
115
+ const child = rootNode.namedChild(i);
116
+ if (!child)
117
+ continue;
118
+ const name = this.extractExportName(child);
119
+ if (name) {
120
+ addExport(name);
121
+ continue;
122
+ }
123
+ // Re-exports via `from .module import Symbol`
124
+ if (child.type === 'import_from_statement') {
125
+ this.extractReExportNames(child, addExport);
126
+ }
127
+ }
128
+ return exports;
129
+ }
130
+ findModulePathIndex(node) {
131
+ for (let i = 0; i < node.namedChildCount; i++) {
132
+ const type = node.namedChild(i)?.type;
133
+ if (type === 'relative_import' || type === 'dotted_name') {
134
+ return i;
135
+ }
136
+ }
137
+ return -1;
138
+ }
139
+ extractReExportNames(node, addExport) {
140
+ const startIndex = this.findModulePathIndex(node);
141
+ if (startIndex === -1)
142
+ return;
143
+ for (let i = startIndex + 1; i < node.namedChildCount; i++) {
144
+ const child = node.namedChild(i);
145
+ if (!child)
146
+ continue;
147
+ if (child.type === 'dotted_name') {
148
+ addExport(child.text);
149
+ }
150
+ else if (child.type === 'aliased_import') {
151
+ const name = extractAliasedSymbolName(child);
152
+ if (name)
153
+ addExport(name);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ // =============================================================================
159
+ // IMPORT EXTRACTOR
160
+ // =============================================================================
161
+ /**
162
+ * Python import extractor
163
+ *
164
+ * Handles:
165
+ * - import os
166
+ * - import os as system
167
+ * - from utils.validate import validateEmail, validatePhone
168
+ * - from typing import Optional as Opt
169
+ */
170
+ export class PythonImportExtractor {
171
+ importNodeTypes = ['import_statement', 'import_from_statement'];
172
+ extractImportPath(node) {
173
+ // Return the raw text for Python imports (used in the imports list)
174
+ return node.text.split('\n')[0];
175
+ }
176
+ processImportSymbols(node) {
177
+ if (node.type === 'import_statement') {
178
+ return this.processPythonImport(node);
179
+ }
180
+ if (node.type === 'import_from_statement') {
181
+ return this.processPythonFromImport(node);
182
+ }
183
+ return null;
184
+ }
185
+ processSimpleImport(child) {
186
+ return {
187
+ importPath: child.text,
188
+ symbols: [child.text],
189
+ };
190
+ }
191
+ processAliasedImport(child) {
192
+ const dottedName = child.namedChildren.find(c => c.type === 'dotted_name');
193
+ const identifiers = child.namedChildren.filter(c => c.type === 'identifier');
194
+ const moduleName = dottedName?.text || identifiers[0]?.text;
195
+ const aliasName = identifiers.length >= 2 ? identifiers[identifiers.length - 1]?.text : identifiers[0]?.text;
196
+ if (!moduleName || !aliasName)
197
+ return null;
198
+ return { importPath: moduleName, symbols: [aliasName] };
199
+ }
200
+ /**
201
+ * Process Python regular import statement.
202
+ * e.g., "import os", "import os as system"
203
+ */
204
+ processPythonImport(node) {
205
+ for (let i = 0; i < node.namedChildCount; i++) {
206
+ const child = node.namedChild(i);
207
+ if (!child)
208
+ continue;
209
+ if (child.type === 'dotted_name' || child.type === 'identifier') {
210
+ return this.processSimpleImport(child);
211
+ }
212
+ if (child.type === 'aliased_import') {
213
+ return this.processAliasedImport(child);
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ findModulePath(node) {
219
+ for (let i = 0; i < node.namedChildCount; i++) {
220
+ const child = node.namedChild(i);
221
+ if (child?.type === 'dotted_name') {
222
+ return { path: child.text, startIndex: i };
223
+ }
224
+ }
225
+ return null;
226
+ }
227
+ collectImportedSymbols(node, startIndex) {
228
+ const symbols = [];
229
+ for (let i = startIndex + 1; i < node.namedChildCount; i++) {
230
+ const child = node.namedChild(i);
231
+ if (!child)
232
+ continue;
233
+ if (child.type === 'dotted_name') {
234
+ symbols.push(child.text);
235
+ }
236
+ else if (child.type === 'aliased_import') {
237
+ const symbolName = extractAliasedSymbolName(child);
238
+ if (symbolName)
239
+ symbols.push(symbolName);
240
+ }
241
+ }
242
+ return symbols;
243
+ }
244
+ /**
245
+ * Process Python from...import statement.
246
+ * e.g., "from utils.validate import validateEmail, validatePhone"
247
+ */
248
+ processPythonFromImport(node) {
249
+ const moduleInfo = this.findModulePath(node);
250
+ if (!moduleInfo)
251
+ return null;
252
+ const symbols = this.collectImportedSymbols(node, moduleInfo.startIndex);
253
+ if (symbols.length === 0)
254
+ return null;
255
+ return { importPath: moduleInfo.path, symbols };
256
+ }
257
+ }
258
+ // =============================================================================
259
+ // SYMBOL EXTRACTOR
260
+ // =============================================================================
261
+ /**
262
+ * Python symbol extractor
263
+ *
264
+ * Handles:
265
+ * - function_definition (def foo():)
266
+ * - async_function_definition (async def foo():)
267
+ * - class_definition (class Foo:)
268
+ *
269
+ * Call sites: call (foo(), obj.method())
270
+ */
271
+ export class PythonSymbolExtractor {
272
+ symbolNodeTypes = [
273
+ 'function_definition',
274
+ 'async_function_definition',
275
+ 'class_definition',
276
+ ];
277
+ extractSymbol(node, content, parentClass) {
278
+ switch (node.type) {
279
+ case 'function_definition':
280
+ case 'async_function_definition':
281
+ return this.extractFunctionInfo(node, content, parentClass);
282
+ case 'class_definition':
283
+ return this.extractClassInfo(node);
284
+ default:
285
+ return null;
286
+ }
287
+ }
288
+ extractCallSite(node) {
289
+ if (node.type !== 'call')
290
+ return null;
291
+ const line = node.startPosition.row + 1;
292
+ const funcNode = node.childForFieldName('function');
293
+ if (!funcNode)
294
+ return null;
295
+ // Direct function call: foo()
296
+ if (funcNode.type === 'identifier') {
297
+ return { symbol: funcNode.text, line, key: `${funcNode.text}:${line}` };
298
+ }
299
+ // Attribute access: obj.method() - extract 'method'
300
+ if (funcNode.type === 'attribute') {
301
+ const attrNode = funcNode.childForFieldName('attribute');
302
+ if (attrNode?.type === 'identifier') {
303
+ return { symbol: attrNode.text, line, key: `${attrNode.text}:${line}` };
304
+ }
305
+ }
306
+ return null;
307
+ }
308
+ extractFunctionInfo(node, content, parentClass) {
309
+ const nameNode = node.childForFieldName('name');
310
+ if (!nameNode)
311
+ return null;
312
+ return {
313
+ name: nameNode.text,
314
+ type: parentClass ? 'method' : 'function',
315
+ startLine: node.startPosition.row + 1,
316
+ endLine: node.endPosition.row + 1,
317
+ parentClass,
318
+ signature: extractSignature(node, content),
319
+ parameters: extractParameters(node, content),
320
+ complexity: calculateComplexity(node),
321
+ };
322
+ }
323
+ extractClassInfo(node) {
324
+ const nameNode = node.childForFieldName('name');
325
+ if (!nameNode)
326
+ return null;
327
+ return {
328
+ name: nameNode.text,
329
+ type: 'class',
330
+ startLine: node.startPosition.row + 1,
331
+ endLine: node.endPosition.row + 1,
332
+ signature: `class ${nameNode.text}`,
333
+ };
334
+ }
335
+ }
336
+ // =============================================================================
337
+ // LANGUAGE DEFINITION
338
+ // =============================================================================
339
+ export const pythonDefinition = {
340
+ id: 'python',
341
+ extensions: ['py'],
342
+ grammar: Python,
343
+ traverser: new PythonTraverser(),
344
+ exportExtractor: new PythonExportExtractor(),
345
+ importExtractor: new PythonImportExtractor(),
346
+ symbolExtractor: new PythonSymbolExtractor(),
347
+ complexity: {
348
+ decisionPoints: [
349
+ 'if_statement',
350
+ 'while_statement',
351
+ 'for_statement',
352
+ 'switch_case',
353
+ 'catch_clause',
354
+ 'ternary_expression',
355
+ 'binary_expression',
356
+ 'elif_clause',
357
+ 'except_clause',
358
+ 'conditional_expression',
359
+ ],
360
+ nestingTypes: ['if_statement', 'for_statement', 'while_statement', 'except_clause'],
361
+ nonNestingTypes: ['elif_clause', 'conditional_expression'],
362
+ lambdaTypes: ['lambda'],
363
+ operatorSymbols: new Set([
364
+ '+',
365
+ '-',
366
+ '*',
367
+ '/',
368
+ '%',
369
+ '**',
370
+ '//',
371
+ '==',
372
+ '!=',
373
+ '<',
374
+ '>',
375
+ '<=',
376
+ '>=',
377
+ '=',
378
+ '+=',
379
+ '-=',
380
+ '*=',
381
+ '/=',
382
+ '%=',
383
+ '**=',
384
+ '//=',
385
+ '&=',
386
+ '|=',
387
+ '^=',
388
+ '<<=',
389
+ '>>=',
390
+ '&',
391
+ '|',
392
+ '^',
393
+ '~',
394
+ '<<',
395
+ '>>',
396
+ '.',
397
+ ':',
398
+ '->',
399
+ '@',
400
+ '(',
401
+ ')',
402
+ '[',
403
+ ']',
404
+ '{',
405
+ '}',
406
+ ]),
407
+ operatorKeywords: new Set([
408
+ 'if',
409
+ 'elif',
410
+ 'else',
411
+ 'for',
412
+ 'while',
413
+ 'match',
414
+ 'case',
415
+ 'return',
416
+ 'raise',
417
+ 'try',
418
+ 'except',
419
+ 'finally',
420
+ 'and',
421
+ 'or',
422
+ 'not',
423
+ 'is',
424
+ 'in',
425
+ 'await',
426
+ 'yield',
427
+ 'break',
428
+ 'continue',
429
+ 'pass',
430
+ 'def',
431
+ 'class',
432
+ 'lambda',
433
+ 'async',
434
+ 'import',
435
+ 'from',
436
+ 'as',
437
+ 'with',
438
+ 'global',
439
+ 'nonlocal',
440
+ 'del',
441
+ 'assert',
442
+ ]),
443
+ },
444
+ symbols: {
445
+ callExpressionTypes: ['call'],
446
+ },
447
+ };
448
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/ast/languages/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { LanguageDefinition } from './types.js';
2
+ /**
3
+ * Canonical list of supported language IDs.
4
+ * SupportedLanguage type is derived from this array.
5
+ * To add a new language: add its ID here, then add its definition to `definitions` below.
6
+ */
7
+ export declare const LANGUAGE_IDS: readonly ["typescript", "javascript", "php", "python", "rust"];
8
+ export type SupportedLanguage = (typeof LANGUAGE_IDS)[number];
9
+ /**
10
+ * Get the full language definition for a supported language.
11
+ *
12
+ * @throws Error if language is not registered
13
+ */
14
+ export declare function getLanguage(language: SupportedLanguage): LanguageDefinition;
15
+ /**
16
+ * Detect which AST-supported language a file belongs to, based on extension.
17
+ *
18
+ * @returns SupportedLanguage or null if not AST-supported
19
+ */
20
+ export declare function detectLanguage(filePath: string): SupportedLanguage | null;
21
+ /**
22
+ * Check if a language is registered (non-throwing).
23
+ */
24
+ export declare function languageExists(language: string): boolean;
25
+ /**
26
+ * Get all registered language definitions.
27
+ */
28
+ export declare function getAllLanguages(): readonly LanguageDefinition[];
29
+ export declare function getSupportedExtensions(): string[];
30
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/ast/languages/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAmBrD;;;;GAIG;AACH,eAAO,MAAM,YAAY,gEAAiE,CAAC;AAC3F,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAmC9D;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,kBAAkB,CAM3E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAGzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,SAAS,kBAAkB,EAAE,CAE/D;AAQD,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAKjD"}