(self, o: ClassDef)
| 829 | return self.resolve_name(name) |
| 830 | |
| 831 | def visit_class_def(self, o: ClassDef) -> None: |
| 832 | self._class_stack.append(o) |
| 833 | self.method_names = find_method_names(o.defs.body) |
| 834 | sep: int | None = None |
| 835 | if self.is_top_level() and self._state != EMPTY: |
| 836 | sep = len(self._output) |
| 837 | self.add("\n") |
| 838 | decorators = self.get_class_decorators(o) |
| 839 | for d in decorators: |
| 840 | self.add(f"{self._indent}@{d}\n") |
| 841 | self.record_name(o.name) |
| 842 | base_types = self.get_base_types(o) |
| 843 | if base_types: |
| 844 | for base in base_types: |
| 845 | self.import_tracker.require_name(base) |
| 846 | if self.analyzed and o.info.is_enum: |
| 847 | self.processing_enum = True |
| 848 | if isinstance(o.metaclass, (NameExpr, MemberExpr)): |
| 849 | meta = o.metaclass.accept(AliasPrinter(self)) |
| 850 | base_types.append("metaclass=" + meta) |
| 851 | elif self.analyzed and o.info.is_abstract and not o.info.is_protocol: |
| 852 | base_types.append("metaclass=abc.ABCMeta") |
| 853 | self.import_tracker.add_import("abc") |
| 854 | self.import_tracker.require_name("abc") |
| 855 | bases = f"({', '.join(base_types)})" if base_types else "" |
| 856 | type_args = self.format_type_args(o) |
| 857 | self.add(f"{self._indent}class {o.name}{type_args}{bases}:\n") |
| 858 | self.indent() |
| 859 | if self._include_docstrings and o.docstring: |
| 860 | docstring = mypy.util.quote_docstring(o.docstring) |
| 861 | self.add(f"{self._indent}{docstring}\n") |
| 862 | n = len(self._output) |
| 863 | self._vars.append([]) |
| 864 | if self.analyzed and (spec := find_dataclass_transform_spec(o)): |
| 865 | self.processing_dataclass = True |
| 866 | self.dataclass_field_specifier = spec.field_specifiers |
| 867 | super().visit_class_def(o) |
| 868 | self.dedent() |
| 869 | self._vars.pop() |
| 870 | self._vars[-1].append(o.name) |
| 871 | if len(self._output) == n: |
| 872 | if self._state == EMPTY_CLASS and sep is not None: |
| 873 | self._output[sep] = "" |
| 874 | if not (self._include_docstrings and o.docstring): |
| 875 | self._output[-1] = self._output[-1][:-1] + " ...\n" |
| 876 | self._state = EMPTY_CLASS |
| 877 | else: |
| 878 | self._state = CLASS |
| 879 | self.method_names = set() |
| 880 | self.processing_dataclass = False |
| 881 | self.dataclass_field_specifier = () |
| 882 | self._class_stack.pop(-1) |
| 883 | self.processing_enum = False |
| 884 | |
| 885 | def get_base_types(self, cdef: ClassDef) -> list[str]: |
| 886 | """Get list of base classes for a class.""" |
nothing calls this directly
no test coverage detected