David Prince
production: clean source snapshot — no history bloat
71b4454
Raw
History Blame Contribute Delete
1.01 kB
import ast
from typing import Dict, Any
class PythonASTParser:
"""Parses Python source code to extract symbols and import graphs."""
def parse(self, source_code: str) -> Dict[str, Any]:
try:
tree = ast.parse(source_code)
except SyntaxError:
return {"classes": [], "functions": [], "imports": []}
symbols = {"classes": [], "functions": [], "imports": []}
for node in ast.walk(tree):
if isinstance(node, ast.ClassDef):
symbols["classes"].append(node.name)
elif isinstance(node, ast.FunctionDef):
symbols["functions"].append(node.name)
elif isinstance(node, ast.Import):
for alias in node.names:
symbols["imports"].append(alias.name)
elif isinstance(node, ast.ImportFrom):
if node.module:
symbols["imports"].append(node.module)
return symbols