| 183 | |
| 184 | |
| 185 | class _ModuleBrowser(ast.NodeVisitor): |
| 186 | def __init__(self, module, path, file, tree, inpackage): |
| 187 | self.path = path |
| 188 | self.tree = tree |
| 189 | self.file = file |
| 190 | self.module = module |
| 191 | self.inpackage = inpackage |
| 192 | self.stack = [] |
| 193 | |
| 194 | def visit_ClassDef(self, node): |
| 195 | bases = [] |
| 196 | for base in node.bases: |
| 197 | name = ast.unparse(base) |
| 198 | if name in self.tree: |
| 199 | # We know this super class. |
| 200 | bases.append(self.tree[name]) |
| 201 | elif len(names := name.split(".")) > 1: |
| 202 | # Super class form is module.class: |
| 203 | # look in module for class. |
| 204 | *_, module, class_ = names |
| 205 | if module in _modules: |
| 206 | bases.append(_modules[module].get(class_, name)) |
| 207 | else: |
| 208 | bases.append(name) |
| 209 | |
| 210 | parent = self.stack[-1] if self.stack else None |
| 211 | class_ = Class(self.module, node.name, bases, self.file, node.lineno, |
| 212 | parent=parent, end_lineno=node.end_lineno) |
| 213 | if parent is None: |
| 214 | self.tree[node.name] = class_ |
| 215 | self.stack.append(class_) |
| 216 | self.generic_visit(node) |
| 217 | self.stack.pop() |
| 218 | |
| 219 | def visit_FunctionDef(self, node, *, is_async=False): |
| 220 | parent = self.stack[-1] if self.stack else None |
| 221 | function = Function(self.module, node.name, self.file, node.lineno, |
| 222 | parent, is_async, end_lineno=node.end_lineno) |
| 223 | if parent is None: |
| 224 | self.tree[node.name] = function |
| 225 | self.stack.append(function) |
| 226 | self.generic_visit(node) |
| 227 | self.stack.pop() |
| 228 | |
| 229 | def visit_AsyncFunctionDef(self, node): |
| 230 | self.visit_FunctionDef(node, is_async=True) |
| 231 | |
| 232 | def visit_Import(self, node): |
| 233 | if node.col_offset != 0: |
| 234 | return |
| 235 | |
| 236 | for module in node.names: |
| 237 | try: |
| 238 | try: |
| 239 | _readmodule(module.name, self.path, self.inpackage) |
| 240 | except ImportError: |
| 241 | _readmodule(module.name, []) |
| 242 | except (ImportError, SyntaxError): |
no outgoing calls
no test coverage detected
searching dependent graphs…