(self, defn: ClassDef)
| 1961 | self.scope_stack.pop() |
| 1962 | |
| 1963 | def analyze_class(self, defn: ClassDef) -> None: |
| 1964 | fullname = self.qualified_name(defn.name) |
| 1965 | if not defn.info and not self.is_core_builtin_class(defn): |
| 1966 | # Add placeholder so that self-references in base classes can be |
| 1967 | # resolved. We don't want this to cause a deferral, since if there |
| 1968 | # are no incomplete references, we'll replace this with a TypeInfo |
| 1969 | # before returning. |
| 1970 | placeholder = PlaceholderNode(fullname, defn, defn.line, becomes_typeinfo=True) |
| 1971 | self.add_symbol(defn.name, placeholder, defn, can_defer=False) |
| 1972 | |
| 1973 | tag = self.track_incomplete_refs() |
| 1974 | |
| 1975 | # Restore base classes after previous iteration (things like Generic[T] might be removed). |
| 1976 | defn.base_type_exprs.extend(defn.removed_base_type_exprs) |
| 1977 | defn.removed_base_type_exprs.clear() |
| 1978 | |
| 1979 | self.infer_metaclass_and_bases_from_compat_helpers(defn) |
| 1980 | |
| 1981 | bases = defn.base_type_exprs |
| 1982 | bases, tvar_defs, is_protocol = self.clean_up_bases_and_infer_type_variables( |
| 1983 | defn, bases, context=defn |
| 1984 | ) |
| 1985 | |
| 1986 | self.check_type_alias_bases(bases) |
| 1987 | |
| 1988 | for tvd in tvar_defs: |
| 1989 | if isinstance(tvd, TypeVarType) and any( |
| 1990 | has_placeholder(t) for t in [tvd.upper_bound] + tvd.values |
| 1991 | ): |
| 1992 | # Some type variable bounds or values are not ready, we need |
| 1993 | # to re-analyze this class. |
| 1994 | self.defer() |
| 1995 | if has_placeholder(tvd.default): |
| 1996 | # Placeholder values in TypeVarLikeTypes may get substituted in. |
| 1997 | # Defer current target until they are ready. |
| 1998 | self.mark_incomplete(defn.name, defn) |
| 1999 | return |
| 2000 | |
| 2001 | self.analyze_class_keywords(defn) |
| 2002 | bases_result = self.analyze_base_classes(bases) |
| 2003 | if bases_result is None or self.found_incomplete_ref(tag): |
| 2004 | # Something was incomplete. Defer current target. |
| 2005 | self.mark_incomplete(defn.name, defn) |
| 2006 | return |
| 2007 | |
| 2008 | base_types, base_error = bases_result |
| 2009 | if any(isinstance(base, PlaceholderType) for base, _ in base_types): |
| 2010 | # We need to know the TypeInfo of each base to construct the MRO. Placeholder types |
| 2011 | # are okay in nested positions, since they can't affect the MRO. |
| 2012 | self.mark_incomplete(defn.name, defn) |
| 2013 | return |
| 2014 | |
| 2015 | declared_metaclass, should_defer, any_meta = self.get_declared_metaclass( |
| 2016 | defn.name, defn.metaclass |
| 2017 | ) |
| 2018 | if should_defer or self.found_incomplete_ref(tag): |
| 2019 | # Metaclass was not ready. Defer current target. |
| 2020 | self.mark_incomplete(defn.name, defn) |
no test coverage detected