| 193 | self.stack = [] |
| 194 | |
| 195 | def visit_ClassDef(self, node): |
| 196 | bases = [] |
| 197 | for base in node.bases: |
| 198 | name = ast.unparse(base) |
| 199 | if name in self.tree: |
| 200 | # We know this super class. |
| 201 | bases.append(self.tree[name]) |
| 202 | elif len(names := name.split(".")) > 1: |
| 203 | # Super class form is module.class: |
| 204 | # look in module for class. |
| 205 | *_, module, class_ = names |
| 206 | if module in _modules: |
| 207 | bases.append(_modules[module].get(class_, name)) |
| 208 | else: |
| 209 | bases.append(name) |
| 210 | |
| 211 | parent = self.stack[-1] if self.stack else None |
| 212 | class_ = Class(self.module, node.name, bases, self.file, node.lineno, |
| 213 | parent=parent, end_lineno=node.end_lineno) |
| 214 | if parent is None: |
| 215 | self.tree[node.name] = class_ |
| 216 | self.stack.append(class_) |
| 217 | self.generic_visit(node) |
| 218 | self.stack.pop() |
| 219 | |
| 220 | def visit_FunctionDef(self, node, *, is_async=False): |
| 221 | parent = self.stack[-1] if self.stack else None |