MCPcopy Index your code
hub / github.com/python/mypy / analyze_class

Method analyze_class

mypy/semanal.py:1963–2057  ·  view source on GitHub ↗
(self, defn: ClassDef)

Source from the content-addressed store, hash-verified

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)

Callers 1

visit_class_defMethod · 0.95

Calls 15

qualified_nameMethod · 0.95
is_core_builtin_classMethod · 0.95
add_symbolMethod · 0.95
track_incomplete_refsMethod · 0.95
deferMethod · 0.95
mark_incompleteMethod · 0.95
analyze_base_classesMethod · 0.95
found_incomplete_refMethod · 0.95

Tested by

no test coverage detected