Build inheritance information from AST. Returns: class_bases: dict[str, list[str]] - parent classes for each class class_methods: dict[str, set[str]] - methods directly defined in each class
(tree: ast.Module)
| 408 | |
| 409 | |
| 410 | def _build_inheritance_info(tree: ast.Module) -> tuple[dict, dict]: |
| 411 | """ |
| 412 | Build inheritance information from AST. |
| 413 | |
| 414 | Returns: |
| 415 | class_bases: dict[str, list[str]] - parent classes for each class |
| 416 | class_methods: dict[str, set[str]] - methods directly defined in each class |
| 417 | """ |
| 418 | all_classes = { |
| 419 | node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef) |
| 420 | } |
| 421 | class_bases = {} |
| 422 | class_methods = {} |
| 423 | |
| 424 | for node in ast.walk(tree): |
| 425 | if isinstance(node, ast.ClassDef): |
| 426 | bases = [ |
| 427 | base.id |
| 428 | for base in node.bases |
| 429 | if isinstance(base, ast.Name) and base.id in all_classes |
| 430 | ] |
| 431 | class_bases[node.name] = bases |
| 432 | methods = { |
| 433 | item.name |
| 434 | for item in node.body |
| 435 | if isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)) |
| 436 | } |
| 437 | class_methods[node.name] = methods |
| 438 | |
| 439 | return class_bases, class_methods |
| 440 | |
| 441 | |
| 442 | def _find_method_definition( |
no test coverage detected