docgen-ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -0
- package/dist/ai/reasoner.d.ts +47 -0
- package/dist/ai/reasoner.d.ts.map +1 -0
- package/dist/ai/reasoner.js +235 -0
- package/dist/ai/reasoner.js.map +1 -0
- package/dist/cli/commands.d.ts +20 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +344 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +141 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/core/analyzers/project.d.ts +8 -0
- package/dist/core/analyzers/project.d.ts.map +1 -0
- package/dist/core/analyzers/project.js +303 -0
- package/dist/core/analyzers/project.js.map +1 -0
- package/dist/core/cache/file-cache.d.ts +26 -0
- package/dist/core/cache/file-cache.d.ts.map +1 -0
- package/dist/core/cache/file-cache.js +110 -0
- package/dist/core/cache/file-cache.js.map +1 -0
- package/dist/core/generators/api.d.ts +11 -0
- package/dist/core/generators/api.d.ts.map +1 -0
- package/dist/core/generators/api.js +105 -0
- package/dist/core/generators/api.js.map +1 -0
- package/dist/core/generators/architecture.d.ts +17 -0
- package/dist/core/generators/architecture.d.ts.map +1 -0
- package/dist/core/generators/architecture.js +180 -0
- package/dist/core/generators/architecture.js.map +1 -0
- package/dist/core/generators/functions.d.ts +11 -0
- package/dist/core/generators/functions.d.ts.map +1 -0
- package/dist/core/generators/functions.js +151 -0
- package/dist/core/generators/functions.js.map +1 -0
- package/dist/core/generators/integrations.d.ts +8 -0
- package/dist/core/generators/integrations.d.ts.map +1 -0
- package/dist/core/generators/integrations.js +53 -0
- package/dist/core/generators/integrations.js.map +1 -0
- package/dist/core/generators/modules.d.ts +11 -0
- package/dist/core/generators/modules.d.ts.map +1 -0
- package/dist/core/generators/modules.js +148 -0
- package/dist/core/generators/modules.js.map +1 -0
- package/dist/core/generators/readme.d.ts +25 -0
- package/dist/core/generators/readme.d.ts.map +1 -0
- package/dist/core/generators/readme.js +193 -0
- package/dist/core/generators/readme.js.map +1 -0
- package/dist/core/generators/registry.d.ts +26 -0
- package/dist/core/generators/registry.d.ts.map +1 -0
- package/dist/core/generators/registry.js +90 -0
- package/dist/core/generators/registry.js.map +1 -0
- package/dist/core/generators/setup.d.ts +8 -0
- package/dist/core/generators/setup.d.ts.map +1 -0
- package/dist/core/generators/setup.js +73 -0
- package/dist/core/generators/setup.js.map +1 -0
- package/dist/core/parsers/javascript.d.ts +12 -0
- package/dist/core/parsers/javascript.d.ts.map +1 -0
- package/dist/core/parsers/javascript.js +389 -0
- package/dist/core/parsers/javascript.js.map +1 -0
- package/dist/core/parsers/python-regex.d.ts +11 -0
- package/dist/core/parsers/python-regex.d.ts.map +1 -0
- package/dist/core/parsers/python-regex.js +337 -0
- package/dist/core/parsers/python-regex.js.map +1 -0
- package/dist/core/parsers/python.d.ts +37 -0
- package/dist/core/parsers/python.d.ts.map +1 -0
- package/dist/core/parsers/python.js +584 -0
- package/dist/core/parsers/python.js.map +1 -0
- package/dist/core/parsers/registry.d.ts +15 -0
- package/dist/core/parsers/registry.d.ts.map +1 -0
- package/dist/core/parsers/registry.js +56 -0
- package/dist/core/parsers/registry.js.map +1 -0
- package/dist/core/pipeline.d.ts +18 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +96 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/types/definitions.d.ts +220 -0
- package/dist/types/definitions.d.ts.map +1 -0
- package/dist/types/definitions.js +10 -0
- package/dist/types/definitions.js.map +1 -0
- package/dist/utils/helpers.d.ts +22 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +176 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/logger.d.ts +28 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +109 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ============================================================================
|
|
4
|
+
* PYTHON PARSER — Tree-Sitter AST
|
|
5
|
+
* ============================================================================
|
|
6
|
+
*
|
|
7
|
+
* Uses web-tree-sitter (WASM) for real AST parsing of Python files.
|
|
8
|
+
* This replaces the regex-based parser with proper structural analysis.
|
|
9
|
+
*
|
|
10
|
+
* WHY tree-sitter instead of regex?
|
|
11
|
+
* - Regex breaks on multi-line strings, nested parens, edge cases
|
|
12
|
+
* - Tree-sitter gives a real parse tree, same as Python's own `ast` module
|
|
13
|
+
* - Handles decorators, async, type hints, f-strings, walrus operator
|
|
14
|
+
* - Zero false positives from code inside strings or comments
|
|
15
|
+
*
|
|
16
|
+
* ARCHITECTURE:
|
|
17
|
+
* 1. Initialize tree-sitter once (WASM load is async, cached after first call)
|
|
18
|
+
* 2. Parse file → SyntaxTree
|
|
19
|
+
* 3. Walk root children looking for: function_definition, class_definition,
|
|
20
|
+
* import_statement, import_from_statement, decorated_definition
|
|
21
|
+
* 4. Extract metadata from each node using field names
|
|
22
|
+
* 5. Return the same AnalyzedFile shape as every other parser
|
|
23
|
+
*
|
|
24
|
+
* FALLBACK: If tree-sitter fails to init (missing WASM, old Node, etc.),
|
|
25
|
+
* we fall back to the regex parser automatically.
|
|
26
|
+
*/
|
|
27
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
30
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
31
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
32
|
+
}
|
|
33
|
+
Object.defineProperty(o, k2, desc);
|
|
34
|
+
}) : (function(o, m, k, k2) {
|
|
35
|
+
if (k2 === undefined) k2 = k;
|
|
36
|
+
o[k2] = m[k];
|
|
37
|
+
}));
|
|
38
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
39
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
40
|
+
}) : function(o, v) {
|
|
41
|
+
o["default"] = v;
|
|
42
|
+
});
|
|
43
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
44
|
+
var ownKeys = function(o) {
|
|
45
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
46
|
+
var ar = [];
|
|
47
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
48
|
+
return ar;
|
|
49
|
+
};
|
|
50
|
+
return ownKeys(o);
|
|
51
|
+
};
|
|
52
|
+
return function (mod) {
|
|
53
|
+
if (mod && mod.__esModule) return mod;
|
|
54
|
+
var result = {};
|
|
55
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
56
|
+
__setModuleDefault(result, mod);
|
|
57
|
+
return result;
|
|
58
|
+
};
|
|
59
|
+
})();
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.parsePythonFileAsync = parsePythonFileAsync;
|
|
62
|
+
exports.parsePythonFile = parsePythonFile;
|
|
63
|
+
const path = __importStar(require("path"));
|
|
64
|
+
const helpers_1 = require("../../utils/helpers");
|
|
65
|
+
const logger_1 = require("../../utils/logger");
|
|
66
|
+
const log = logger_1.logger.child('PythonTS');
|
|
67
|
+
// ─── Tree-Sitter Initialization ──────────────────────────────────────────────
|
|
68
|
+
/**
|
|
69
|
+
* We load tree-sitter lazily and cache the parser instance.
|
|
70
|
+
* This avoids async init at module load time.
|
|
71
|
+
*/
|
|
72
|
+
let parserInstance = null;
|
|
73
|
+
let initFailed = false;
|
|
74
|
+
async function getParser() {
|
|
75
|
+
if (parserInstance)
|
|
76
|
+
return parserInstance;
|
|
77
|
+
if (initFailed)
|
|
78
|
+
return null;
|
|
79
|
+
try {
|
|
80
|
+
const { Parser, Language } = require('web-tree-sitter');
|
|
81
|
+
await Parser.init();
|
|
82
|
+
// Resolve WASM path relative to the package
|
|
83
|
+
const wasmPath = require.resolve('tree-sitter-python/tree-sitter-python.wasm');
|
|
84
|
+
const Python = await Language.load(wasmPath);
|
|
85
|
+
const parser = new Parser();
|
|
86
|
+
parser.setLanguage(Python);
|
|
87
|
+
parserInstance = parser;
|
|
88
|
+
log.info('Tree-sitter Python parser initialized');
|
|
89
|
+
return parser;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
log.warn(`Tree-sitter init failed, will use regex fallback: ${err.message}`);
|
|
93
|
+
initFailed = true;
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Parse a Python file using tree-sitter AST.
|
|
100
|
+
* Falls back to regex parser if tree-sitter unavailable.
|
|
101
|
+
*/
|
|
102
|
+
async function parsePythonFileAsync(filePath, content, rootDir) {
|
|
103
|
+
const parser = await getParser();
|
|
104
|
+
if (!parser) {
|
|
105
|
+
// Fallback to regex parser
|
|
106
|
+
const { parsePythonFile: regexParse } = require('./python-regex');
|
|
107
|
+
return regexParse(filePath, content, rootDir);
|
|
108
|
+
}
|
|
109
|
+
return parseWithTreeSitter(parser, filePath, content, rootDir);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Synchronous wrapper — uses cached parser if available, else regex fallback.
|
|
113
|
+
* This maintains the same signature as the JS parser for the registry.
|
|
114
|
+
*/
|
|
115
|
+
function parsePythonFile(filePath, content, rootDir) {
|
|
116
|
+
if (parserInstance) {
|
|
117
|
+
return parseWithTreeSitter(parserInstance, filePath, content, rootDir);
|
|
118
|
+
}
|
|
119
|
+
// Tree-sitter not ready — use regex fallback.
|
|
120
|
+
// Call parsePythonFileAsync() or warmup() to pre-initialize tree-sitter.
|
|
121
|
+
const { parsePythonFile: regexParse } = require('./python-regex');
|
|
122
|
+
return regexParse(filePath, content, rootDir);
|
|
123
|
+
}
|
|
124
|
+
// ─── Core Parser ─────────────────────────────────────────────────────────────
|
|
125
|
+
function parseWithTreeSitter(parser, filePath, content, rootDir) {
|
|
126
|
+
const relativePath = path.relative(rootDir, filePath);
|
|
127
|
+
const lines = content.split('\n');
|
|
128
|
+
const tree = parser.parse(content);
|
|
129
|
+
const root = tree.rootNode;
|
|
130
|
+
const result = {
|
|
131
|
+
filePath, relativePath, language: 'python',
|
|
132
|
+
lineCount: (0, helpers_1.countLines)(content),
|
|
133
|
+
contentHash: (0, helpers_1.hashContent)(content),
|
|
134
|
+
functions: [], classes: [], imports: [], exports: [],
|
|
135
|
+
apiEndpoints: [], comments: [], parseErrors: [],
|
|
136
|
+
};
|
|
137
|
+
// Walk all top-level children
|
|
138
|
+
for (const child of root.children) {
|
|
139
|
+
try {
|
|
140
|
+
switch (child.type) {
|
|
141
|
+
case 'function_definition':
|
|
142
|
+
result.functions.push(extractFunction(child, lines, []));
|
|
143
|
+
break;
|
|
144
|
+
case 'class_definition':
|
|
145
|
+
result.classes.push(extractClass(child, lines));
|
|
146
|
+
break;
|
|
147
|
+
case 'import_statement':
|
|
148
|
+
result.imports.push(extractImport(child));
|
|
149
|
+
break;
|
|
150
|
+
case 'import_from_statement':
|
|
151
|
+
result.imports.push(extractFromImport(child));
|
|
152
|
+
break;
|
|
153
|
+
case 'decorated_definition': {
|
|
154
|
+
const decorators = extractDecorators(child);
|
|
155
|
+
const inner = child.children.find((c) => c.type === 'function_definition' || c.type === 'class_definition');
|
|
156
|
+
if (inner?.type === 'function_definition') {
|
|
157
|
+
const func = extractFunction(inner, lines, decorators);
|
|
158
|
+
result.functions.push(func);
|
|
159
|
+
// Check for FastAPI/Flask route decorators
|
|
160
|
+
const endpoint = detectEndpoint(decorators, inner, filePath, lines);
|
|
161
|
+
if (endpoint)
|
|
162
|
+
result.apiEndpoints.push(endpoint);
|
|
163
|
+
}
|
|
164
|
+
if (inner?.type === 'class_definition') {
|
|
165
|
+
const cls = extractClass(inner, lines);
|
|
166
|
+
cls.decorators = decorators;
|
|
167
|
+
result.classes.push(cls);
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case 'comment':
|
|
172
|
+
result.comments.push({
|
|
173
|
+
type: 'line',
|
|
174
|
+
text: child.text.replace(/^#\s*/, ''),
|
|
175
|
+
line: child.startPosition.row + 1,
|
|
176
|
+
});
|
|
177
|
+
break;
|
|
178
|
+
case 'expression_statement': {
|
|
179
|
+
// Catch module-level docstrings
|
|
180
|
+
const expr = child.children[0];
|
|
181
|
+
if (expr?.type === 'string') {
|
|
182
|
+
result.comments.push({
|
|
183
|
+
type: 'docstring',
|
|
184
|
+
text: stripQuotes(expr.text),
|
|
185
|
+
line: child.startPosition.row + 1,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
result.parseErrors.push({
|
|
194
|
+
filePath: relativePath,
|
|
195
|
+
line: child.startPosition?.row + 1,
|
|
196
|
+
message: `Node parse error (${child.type}): ${err.message}`,
|
|
197
|
+
severity: 'warning',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Build exports from public functions and classes
|
|
202
|
+
result.exports = inferExports(result.functions, result.classes);
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
// ─── Function Extraction ─────────────────────────────────────────────────────
|
|
206
|
+
function extractFunction(node, lines, decorators) {
|
|
207
|
+
const name = node.childForFieldName('name')?.text || 'anonymous';
|
|
208
|
+
const paramsNode = node.childForFieldName('parameters');
|
|
209
|
+
const returnNode = node.childForFieldName('return_type');
|
|
210
|
+
const bodyNode = node.childForFieldName('body');
|
|
211
|
+
// Check if first keyword is 'async'
|
|
212
|
+
const isAsync = node.children[0]?.type === 'async' ||
|
|
213
|
+
node.children.some((c) => c.type === 'async');
|
|
214
|
+
const startLine = node.startPosition.row + 1;
|
|
215
|
+
const endLine = node.endPosition.row + 1;
|
|
216
|
+
const body = lines.slice(startLine - 1, endLine).join('\n');
|
|
217
|
+
// Extract docstring from body
|
|
218
|
+
const docstring = extractDocstring(bodyNode);
|
|
219
|
+
return {
|
|
220
|
+
name,
|
|
221
|
+
params: extractParams(paramsNode),
|
|
222
|
+
returnType: returnNode ? returnNode.text : undefined,
|
|
223
|
+
isExported: !name.startsWith('_'),
|
|
224
|
+
isAsync,
|
|
225
|
+
startLine,
|
|
226
|
+
endLine,
|
|
227
|
+
complexity: estimateComplexity(bodyNode),
|
|
228
|
+
existingDoc: docstring,
|
|
229
|
+
body: body.length < 2000 ? body : undefined,
|
|
230
|
+
decorators,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// ─── Parameter Extraction ────────────────────────────────────────────────────
|
|
234
|
+
/**
|
|
235
|
+
* Extract parameters from a parameters node.
|
|
236
|
+
*
|
|
237
|
+
* Tree-sitter parameter nodes can be:
|
|
238
|
+
* identifier → simple name
|
|
239
|
+
* typed_parameter → name: Type
|
|
240
|
+
* default_parameter → name = value
|
|
241
|
+
* typed_default_parameter → name: Type = value
|
|
242
|
+
* list_splat_pattern → *args
|
|
243
|
+
* dictionary_splat_pattern → **kwargs
|
|
244
|
+
*/
|
|
245
|
+
function extractParams(paramsNode) {
|
|
246
|
+
if (!paramsNode)
|
|
247
|
+
return [];
|
|
248
|
+
const params = [];
|
|
249
|
+
for (const child of paramsNode.children) {
|
|
250
|
+
switch (child.type) {
|
|
251
|
+
case 'identifier': {
|
|
252
|
+
// Skip 'self' and 'cls'
|
|
253
|
+
if (child.text === 'self' || child.text === 'cls')
|
|
254
|
+
continue;
|
|
255
|
+
params.push({ name: child.text, isOptional: false });
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
case 'typed_parameter': {
|
|
259
|
+
const name = child.children.find((c) => c.type === 'identifier')?.text;
|
|
260
|
+
if (name === 'self' || name === 'cls')
|
|
261
|
+
continue;
|
|
262
|
+
const type = child.childForFieldName('type')?.text;
|
|
263
|
+
if (name)
|
|
264
|
+
params.push({ name, type, isOptional: false });
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
case 'default_parameter': {
|
|
268
|
+
const name = child.childForFieldName('name')?.text;
|
|
269
|
+
const value = child.childForFieldName('value')?.text;
|
|
270
|
+
if (name === 'self' || name === 'cls')
|
|
271
|
+
continue;
|
|
272
|
+
if (name)
|
|
273
|
+
params.push({
|
|
274
|
+
name,
|
|
275
|
+
defaultValue: value ? formatDefaultValue(value) : undefined,
|
|
276
|
+
isOptional: true,
|
|
277
|
+
});
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
case 'typed_default_parameter': {
|
|
281
|
+
const name = child.childForFieldName('name')?.text;
|
|
282
|
+
const type = child.childForFieldName('type')?.text;
|
|
283
|
+
const value = child.childForFieldName('value')?.text;
|
|
284
|
+
if (name === 'self' || name === 'cls')
|
|
285
|
+
continue;
|
|
286
|
+
if (name)
|
|
287
|
+
params.push({
|
|
288
|
+
name, type,
|
|
289
|
+
defaultValue: value ? formatDefaultValue(value) : undefined,
|
|
290
|
+
isOptional: true,
|
|
291
|
+
});
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 'list_splat_pattern': {
|
|
295
|
+
const name = child.children.find((c) => c.type === 'identifier')?.text;
|
|
296
|
+
if (name)
|
|
297
|
+
params.push({ name: `*${name}`, isOptional: true });
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
case 'dictionary_splat_pattern': {
|
|
301
|
+
const name = child.children.find((c) => c.type === 'identifier')?.text;
|
|
302
|
+
if (name)
|
|
303
|
+
params.push({ name: `**${name}`, isOptional: true });
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return params;
|
|
309
|
+
}
|
|
310
|
+
function formatDefaultValue(value) {
|
|
311
|
+
// Keep quotes for strings, raw for everything else
|
|
312
|
+
return value;
|
|
313
|
+
}
|
|
314
|
+
// ─── Class Extraction ────────────────────────────────────────────────────────
|
|
315
|
+
function extractClass(node, lines) {
|
|
316
|
+
const name = node.childForFieldName('name')?.text || 'Anonymous';
|
|
317
|
+
const bodyNode = node.childForFieldName('body');
|
|
318
|
+
const superclassNode = node.childForFieldName('superclasses');
|
|
319
|
+
// Extract superclass(es)
|
|
320
|
+
let superClass;
|
|
321
|
+
if (superclassNode) {
|
|
322
|
+
const bases = superclassNode.children
|
|
323
|
+
.filter((c) => c.type === 'identifier' || c.type === 'attribute')
|
|
324
|
+
.map((c) => c.text);
|
|
325
|
+
superClass = bases[0];
|
|
326
|
+
}
|
|
327
|
+
// Extract methods and properties from class body
|
|
328
|
+
const methods = [];
|
|
329
|
+
const properties = [];
|
|
330
|
+
const seenProps = new Set();
|
|
331
|
+
if (bodyNode) {
|
|
332
|
+
for (const member of bodyNode.children) {
|
|
333
|
+
if (member.type === 'function_definition') {
|
|
334
|
+
const method = extractFunction(member, lines, []);
|
|
335
|
+
method.className = name;
|
|
336
|
+
methods.push(method);
|
|
337
|
+
// Extract self.xxx = from method bodies
|
|
338
|
+
extractSelfAssignments(member, properties, seenProps);
|
|
339
|
+
}
|
|
340
|
+
if (member.type === 'decorated_definition') {
|
|
341
|
+
const decorators = extractDecorators(member);
|
|
342
|
+
const funcNode = member.children.find((c) => c.type === 'function_definition');
|
|
343
|
+
if (funcNode) {
|
|
344
|
+
const method = extractFunction(funcNode, lines, decorators);
|
|
345
|
+
method.className = name;
|
|
346
|
+
methods.push(method);
|
|
347
|
+
extractSelfAssignments(funcNode, properties, seenProps);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Class-level assignments: field: Type = value
|
|
351
|
+
if (member.type === 'expression_statement') {
|
|
352
|
+
const assign = member.children[0];
|
|
353
|
+
if (assign?.type === 'assignment') {
|
|
354
|
+
const left = assign.childForFieldName('left');
|
|
355
|
+
if (left?.type === 'identifier' && !seenProps.has(left.text)) {
|
|
356
|
+
seenProps.add(left.text);
|
|
357
|
+
const typeNode = assign.childForFieldName('type');
|
|
358
|
+
properties.push({
|
|
359
|
+
name: left.text,
|
|
360
|
+
type: typeNode?.text,
|
|
361
|
+
isStatic: false,
|
|
362
|
+
isPrivate: left.text.startsWith('_'),
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
const docstring = extractDocstring(bodyNode);
|
|
370
|
+
return {
|
|
371
|
+
name,
|
|
372
|
+
superClass,
|
|
373
|
+
implements: [],
|
|
374
|
+
methods,
|
|
375
|
+
properties,
|
|
376
|
+
isExported: !name.startsWith('_'),
|
|
377
|
+
startLine: node.startPosition.row + 1,
|
|
378
|
+
endLine: node.endPosition.row + 1,
|
|
379
|
+
existingDoc: docstring,
|
|
380
|
+
decorators: [],
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Walk a function body to find self.xxx = assignments.
|
|
385
|
+
* This is how Python declares instance properties.
|
|
386
|
+
*/
|
|
387
|
+
function extractSelfAssignments(funcNode, properties, seen) {
|
|
388
|
+
const walk = (node) => {
|
|
389
|
+
if (!node)
|
|
390
|
+
return;
|
|
391
|
+
if (node.type === 'assignment') {
|
|
392
|
+
const left = node.childForFieldName('left');
|
|
393
|
+
if (left?.type === 'attribute') {
|
|
394
|
+
const obj = left.childForFieldName('object');
|
|
395
|
+
const attr = left.childForFieldName('attribute');
|
|
396
|
+
if (obj?.text === 'self' && attr && !seen.has(attr.text)) {
|
|
397
|
+
seen.add(attr.text);
|
|
398
|
+
properties.push({
|
|
399
|
+
name: attr.text,
|
|
400
|
+
isStatic: false,
|
|
401
|
+
isPrivate: attr.text.startsWith('_'),
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
for (const child of node.children || []) {
|
|
407
|
+
walk(child);
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
walk(funcNode.childForFieldName('body'));
|
|
411
|
+
}
|
|
412
|
+
// ─── Import Extraction ───────────────────────────────────────────────────────
|
|
413
|
+
function extractImport(node) {
|
|
414
|
+
// import os / import os as alias
|
|
415
|
+
const names = node.children
|
|
416
|
+
.filter((c) => c.type === 'dotted_name' || c.type === 'aliased_import')
|
|
417
|
+
.map((c) => {
|
|
418
|
+
if (c.type === 'aliased_import') {
|
|
419
|
+
return c.childForFieldName('name')?.text || c.text;
|
|
420
|
+
}
|
|
421
|
+
return c.text;
|
|
422
|
+
});
|
|
423
|
+
return {
|
|
424
|
+
source: names[0] || node.text.replace('import ', '').trim(),
|
|
425
|
+
specifiers: [],
|
|
426
|
+
isRelative: false,
|
|
427
|
+
defaultImport: names[0],
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
function extractFromImport(node) {
|
|
431
|
+
const moduleNode = node.childForFieldName('module_name');
|
|
432
|
+
const source = moduleNode?.text || '';
|
|
433
|
+
const specifiers = [];
|
|
434
|
+
for (const child of node.children) {
|
|
435
|
+
if (child.type === 'dotted_name' && child !== moduleNode) {
|
|
436
|
+
specifiers.push(child.text);
|
|
437
|
+
}
|
|
438
|
+
if (child.type === 'aliased_import') {
|
|
439
|
+
specifiers.push(child.childForFieldName('name')?.text || child.text);
|
|
440
|
+
}
|
|
441
|
+
// from x import a, b, c — the names are in an import_list or directly
|
|
442
|
+
if (child.type === 'import_list') {
|
|
443
|
+
for (const item of child.children) {
|
|
444
|
+
if (item.type === 'dotted_name' || item.type === 'identifier') {
|
|
445
|
+
specifiers.push(item.text);
|
|
446
|
+
}
|
|
447
|
+
if (item.type === 'aliased_import') {
|
|
448
|
+
specifiers.push(item.childForFieldName('name')?.text || item.text);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return {
|
|
454
|
+
source,
|
|
455
|
+
specifiers: specifiers.filter(s => s && s !== ',' && s !== '(' && s !== ')'),
|
|
456
|
+
isRelative: source.startsWith('.'),
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
// ─── Decorator Extraction ────────────────────────────────────────────────────
|
|
460
|
+
function extractDecorators(decoratedNode) {
|
|
461
|
+
return decoratedNode.children
|
|
462
|
+
.filter((c) => c.type === 'decorator')
|
|
463
|
+
.map((c) => c.text);
|
|
464
|
+
}
|
|
465
|
+
// ─── Endpoint Detection ──────────────────────────────────────────────────────
|
|
466
|
+
/**
|
|
467
|
+
* Detect FastAPI/Flask route endpoints from decorators.
|
|
468
|
+
*
|
|
469
|
+
* Patterns:
|
|
470
|
+
* @router.get("/path") — FastAPI
|
|
471
|
+
* @app.post("/path") — FastAPI/Flask
|
|
472
|
+
* @app.route("/path", ...) — Flask
|
|
473
|
+
*/
|
|
474
|
+
function detectEndpoint(decorators, funcNode, filePath, lines) {
|
|
475
|
+
const httpMethods = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head'];
|
|
476
|
+
for (const dec of decorators) {
|
|
477
|
+
// FastAPI pattern: @router.get("/path") or @app.post("/path")
|
|
478
|
+
for (const method of httpMethods) {
|
|
479
|
+
const re = new RegExp(`@\\w+\\.${method}\\(["']([^"']+)["']`);
|
|
480
|
+
const match = dec.match(re);
|
|
481
|
+
if (match) {
|
|
482
|
+
const handler = funcNode.childForFieldName('name')?.text || 'unknown';
|
|
483
|
+
const paramsText = funcNode.childForFieldName('parameters')?.text || '';
|
|
484
|
+
const requiresAuth = paramsText.includes('current_user') ||
|
|
485
|
+
(paramsText.includes('Depends') && paramsText.includes('auth'));
|
|
486
|
+
return {
|
|
487
|
+
method: method.toUpperCase(),
|
|
488
|
+
path: match[1],
|
|
489
|
+
handler,
|
|
490
|
+
middleware: [],
|
|
491
|
+
requiresAuth,
|
|
492
|
+
filePath,
|
|
493
|
+
line: funcNode.startPosition.row + 1,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// Flask pattern: @app.route("/path", methods=["GET"])
|
|
498
|
+
const flaskMatch = dec.match(/@\w+\.route\(["']([^"']+)["'](?:.*methods=\[([^\]]+)\])?/);
|
|
499
|
+
if (flaskMatch) {
|
|
500
|
+
const handler = funcNode.childForFieldName('name')?.text || 'unknown';
|
|
501
|
+
const methods = flaskMatch[2]
|
|
502
|
+
? flaskMatch[2].replace(/["'\s]/g, '').split(',')
|
|
503
|
+
: ['GET'];
|
|
504
|
+
// Return first method; caller can expand if needed
|
|
505
|
+
return {
|
|
506
|
+
method: methods[0].toUpperCase(),
|
|
507
|
+
path: flaskMatch[1],
|
|
508
|
+
handler,
|
|
509
|
+
middleware: [],
|
|
510
|
+
requiresAuth: false,
|
|
511
|
+
filePath,
|
|
512
|
+
line: funcNode.startPosition.row + 1,
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return null;
|
|
517
|
+
}
|
|
518
|
+
// ─── Docstring Extraction ────────────────────────────────────────────────────
|
|
519
|
+
function extractDocstring(bodyNode) {
|
|
520
|
+
if (!bodyNode)
|
|
521
|
+
return undefined;
|
|
522
|
+
// First statement in body — if it's a string expression, it's a docstring
|
|
523
|
+
const first = bodyNode.children.find((c) => c.type === 'expression_statement');
|
|
524
|
+
if (!first)
|
|
525
|
+
return undefined;
|
|
526
|
+
const expr = first.children[0];
|
|
527
|
+
if (expr?.type === 'string') {
|
|
528
|
+
return stripQuotes(expr.text);
|
|
529
|
+
}
|
|
530
|
+
return undefined;
|
|
531
|
+
}
|
|
532
|
+
function stripQuotes(text) {
|
|
533
|
+
// Remove triple quotes (""" or ''')
|
|
534
|
+
if (text.startsWith('"""') && text.endsWith('"""')) {
|
|
535
|
+
return text.slice(3, -3).trim();
|
|
536
|
+
}
|
|
537
|
+
if (text.startsWith("'''") && text.endsWith("'''")) {
|
|
538
|
+
return text.slice(3, -3).trim();
|
|
539
|
+
}
|
|
540
|
+
// Single quotes
|
|
541
|
+
if ((text.startsWith('"') && text.endsWith('"')) ||
|
|
542
|
+
(text.startsWith("'") && text.endsWith("'"))) {
|
|
543
|
+
return text.slice(1, -1).trim();
|
|
544
|
+
}
|
|
545
|
+
return text.trim();
|
|
546
|
+
}
|
|
547
|
+
// ─── Complexity Estimation ───────────────────────────────────────────────────
|
|
548
|
+
/**
|
|
549
|
+
* Estimate cyclomatic complexity by counting branching nodes.
|
|
550
|
+
* Tree-sitter makes this trivial — just walk and count.
|
|
551
|
+
*/
|
|
552
|
+
function estimateComplexity(bodyNode) {
|
|
553
|
+
if (!bodyNode)
|
|
554
|
+
return 1;
|
|
555
|
+
let complexity = 1;
|
|
556
|
+
const branchTypes = new Set([
|
|
557
|
+
'if_statement', 'elif_clause', 'for_statement',
|
|
558
|
+
'while_statement', 'except_clause', 'with_statement',
|
|
559
|
+
'conditional_expression', // ternary: x if cond else y
|
|
560
|
+
'boolean_operator', // and / or
|
|
561
|
+
'case_clause', // match/case (Python 3.10+)
|
|
562
|
+
]);
|
|
563
|
+
const walk = (node) => {
|
|
564
|
+
if (branchTypes.has(node.type))
|
|
565
|
+
complexity++;
|
|
566
|
+
for (const child of node.children || []) {
|
|
567
|
+
walk(child);
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
walk(bodyNode);
|
|
571
|
+
return complexity;
|
|
572
|
+
}
|
|
573
|
+
// ─── Export Inference ─────────────────────────────────────────────────────────
|
|
574
|
+
function inferExports(functions, classes) {
|
|
575
|
+
return [
|
|
576
|
+
...functions
|
|
577
|
+
.filter(f => !f.name.startsWith('_'))
|
|
578
|
+
.map(f => ({ name: f.name, type: 'function', isDefault: false })),
|
|
579
|
+
...classes
|
|
580
|
+
.filter(c => !c.name.startsWith('_'))
|
|
581
|
+
.map(c => ({ name: c.name, type: 'class', isDefault: false })),
|
|
582
|
+
];
|
|
583
|
+
}
|
|
584
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/core/parsers/python.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Registry — routes files to the correct language parser.
|
|
3
|
+
*/
|
|
4
|
+
import { AnalyzedFile } from '../../types/definitions';
|
|
5
|
+
export declare function parseFile(filePath: string, rootDir: string): AnalyzedFile | null;
|
|
6
|
+
export declare function canParse(filePath: string): boolean;
|
|
7
|
+
export declare function getSupportedLanguages(): string[];
|
|
8
|
+
export { parseJavaScriptFile } from './javascript';
|
|
9
|
+
export { parsePythonFile, parsePythonFileAsync } from './python';
|
|
10
|
+
/**
|
|
11
|
+
* Pre-initialize tree-sitter for Python (call once at startup).
|
|
12
|
+
* After this, parsePythonFile uses tree-sitter synchronously.
|
|
13
|
+
*/
|
|
14
|
+
export declare function warmup(): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAcvD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUhF;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEjE;;;GAGG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAI5C"}
|