| 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 |