@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.
- package/dist/ast/chunker.d.ts +30 -0
- package/dist/ast/chunker.d.ts.map +1 -0
- package/dist/ast/chunker.js +310 -0
- package/dist/ast/chunker.js.map +1 -0
- package/dist/ast/complexity/cognitive.d.ts +16 -0
- package/dist/ast/complexity/cognitive.d.ts.map +1 -0
- package/dist/ast/complexity/cognitive.js +137 -0
- package/dist/ast/complexity/cognitive.js.map +1 -0
- package/dist/ast/complexity/cyclomatic.d.ts +12 -0
- package/dist/ast/complexity/cyclomatic.d.ts.map +1 -0
- package/dist/ast/complexity/cyclomatic.js +54 -0
- package/dist/ast/complexity/cyclomatic.js.map +1 -0
- package/dist/ast/complexity/halstead.d.ts +56 -0
- package/dist/ast/complexity/halstead.d.ts.map +1 -0
- package/dist/ast/complexity/halstead.js +196 -0
- package/dist/ast/complexity/halstead.js.map +1 -0
- package/dist/ast/complexity/index.d.ts +13 -0
- package/dist/ast/complexity/index.d.ts.map +1 -0
- package/dist/ast/complexity/index.js +12 -0
- package/dist/ast/complexity/index.js.map +1 -0
- package/dist/ast/extractors/index.d.ts +35 -0
- package/dist/ast/extractors/index.d.ts.map +1 -0
- package/dist/ast/extractors/index.js +41 -0
- package/dist/ast/extractors/index.js.map +1 -0
- package/dist/ast/extractors/symbol-helpers.d.ts +20 -0
- package/dist/ast/extractors/symbol-helpers.d.ts.map +1 -0
- package/dist/ast/extractors/symbol-helpers.js +58 -0
- package/dist/ast/extractors/symbol-helpers.js.map +1 -0
- package/dist/ast/extractors/types.d.ts +108 -0
- package/dist/ast/extractors/types.d.ts.map +1 -0
- package/dist/ast/extractors/types.js +2 -0
- package/dist/ast/extractors/types.js.map +1 -0
- package/dist/ast/languages/javascript.d.ts +134 -0
- package/dist/ast/languages/javascript.d.ts.map +1 -0
- package/dist/ast/languages/javascript.js +787 -0
- package/dist/ast/languages/javascript.js.map +1 -0
- package/dist/ast/languages/php.d.ts +84 -0
- package/dist/ast/languages/php.d.ts.map +1 -0
- package/dist/ast/languages/php.js +452 -0
- package/dist/ast/languages/php.js.map +1 -0
- package/dist/ast/languages/python.d.ts +96 -0
- package/dist/ast/languages/python.d.ts.map +1 -0
- package/dist/ast/languages/python.js +448 -0
- package/dist/ast/languages/python.js.map +1 -0
- package/dist/ast/languages/registry.d.ts +30 -0
- package/dist/ast/languages/registry.d.ts.map +1 -0
- package/dist/ast/languages/registry.js +95 -0
- package/dist/ast/languages/registry.js.map +1 -0
- package/dist/ast/languages/rust.d.ts +113 -0
- package/dist/ast/languages/rust.d.ts.map +1 -0
- package/dist/ast/languages/rust.js +614 -0
- package/dist/ast/languages/rust.js.map +1 -0
- package/dist/ast/languages/types.d.ts +52 -0
- package/dist/ast/languages/types.d.ts.map +1 -0
- package/dist/ast/languages/types.js +2 -0
- package/dist/ast/languages/types.js.map +1 -0
- package/dist/ast/languages/typescript.d.ts +3 -0
- package/dist/ast/languages/typescript.d.ts.map +1 -0
- package/dist/ast/languages/typescript.js +134 -0
- package/dist/ast/languages/typescript.js.map +1 -0
- package/dist/ast/parser.d.ts +29 -0
- package/dist/ast/parser.d.ts.map +1 -0
- package/dist/ast/parser.js +67 -0
- package/dist/ast/parser.js.map +1 -0
- package/dist/ast/symbols.d.ts +74 -0
- package/dist/ast/symbols.d.ts.map +1 -0
- package/dist/ast/symbols.js +171 -0
- package/dist/ast/symbols.js.map +1 -0
- package/dist/ast/traversers/index.d.ts +19 -0
- package/dist/ast/traversers/index.d.ts.map +1 -0
- package/dist/ast/traversers/index.js +21 -0
- package/dist/ast/traversers/index.js.map +1 -0
- package/dist/ast/traversers/types.d.ts +98 -0
- package/dist/ast/traversers/types.d.ts.map +1 -0
- package/dist/ast/traversers/types.js +2 -0
- package/dist/ast/traversers/types.js.map +1 -0
- package/dist/ast/types.d.ts +54 -0
- package/dist/ast/types.d.ts.map +1 -0
- package/dist/ast/types.js +2 -0
- package/dist/ast/types.js.map +1 -0
- package/dist/chunk-only-index.d.ts +25 -0
- package/dist/chunk-only-index.d.ts.map +1 -0
- package/dist/chunk-only-index.js +107 -0
- package/dist/chunk-only-index.js.map +1 -0
- package/dist/chunker.d.ts +12 -0
- package/dist/chunker.d.ts.map +1 -0
- package/dist/chunker.js +98 -0
- package/dist/chunker.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -0
- package/dist/content-hash.d.ts +20 -0
- package/dist/content-hash.d.ts.map +1 -0
- package/dist/content-hash.js +91 -0
- package/dist/content-hash.js.map +1 -0
- package/dist/dependency-analyzer.d.ts +79 -0
- package/dist/dependency-analyzer.d.ts.map +1 -0
- package/dist/dependency-analyzer.js +408 -0
- package/dist/dependency-analyzer.js.map +1 -0
- package/dist/ecosystem-presets.d.ts +32 -0
- package/dist/ecosystem-presets.d.ts.map +1 -0
- package/dist/ecosystem-presets.js +325 -0
- package/dist/ecosystem-presets.js.map +1 -0
- package/dist/gitignore.d.ts +22 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +128 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/insights/chunk-complexity.d.ts +89 -0
- package/dist/insights/chunk-complexity.d.ts.map +1 -0
- package/dist/insights/chunk-complexity.js +332 -0
- package/dist/insights/chunk-complexity.js.map +1 -0
- package/dist/insights/types.d.ts +73 -0
- package/dist/insights/types.d.ts.map +1 -0
- package/dist/insights/types.js +9 -0
- package/dist/insights/types.js.map +1 -0
- package/dist/json-template-chunker.d.ts +12 -0
- package/dist/json-template-chunker.d.ts.map +1 -0
- package/dist/json-template-chunker.js +87 -0
- package/dist/json-template-chunker.js.map +1 -0
- package/dist/liquid-chunker.d.ts +16 -0
- package/dist/liquid-chunker.d.ts.map +1 -0
- package/dist/liquid-chunker.js +274 -0
- package/dist/liquid-chunker.js.map +1 -0
- package/dist/scanner.d.ts +16 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +95 -0
- package/dist/scanner.js.map +1 -0
- package/dist/symbol-extractor.d.ts +18 -0
- package/dist/symbol-extractor.d.ts.map +1 -0
- package/dist/symbol-extractor.js +343 -0
- package/dist/symbol-extractor.js.map +1 -0
- package/dist/test-associations.d.ts +16 -0
- package/dist/test-associations.d.ts.map +1 -0
- package/dist/test-associations.js +43 -0
- package/dist/test-associations.js.map +1 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/path-matching.d.ts +71 -0
- package/dist/utils/path-matching.d.ts.map +1 -0
- package/dist/utils/path-matching.js +258 -0
- package/dist/utils/path-matching.js.map +1 -0
- package/dist/utils/repo-id.d.ts +6 -0
- package/dist/utils/repo-id.d.ts.map +1 -0
- package/dist/utils/repo-id.js +12 -0
- package/dist/utils/repo-id.js.map +1 -0
- 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"}
|