Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 0 additions & 80 deletions typemap/type_eval/_apply_generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -405,84 +405,4 @@ def _type_repr(t: Any) -> str:
return repr(t)


# TODO: Potentially most of this could be ripped out. The internals
# don't use this at all, it's only used by format_class.
def _flatten_class_explicit(
cls: type[Any], ctx: _eval_typing.EvalContext
) -> type[_eval_typing._EvalProxy]:
cls_boxed = box(cls)
mro_boxed = cls_boxed.mro

# TODO: I think we want to create the whole mro chain...
# before we evaluate the contents?

# FIXME: right now we flatten out all the attributes... but should we??
# XXX: Yeah, a lot of work is put into copying everything into every
# class and it is not worth it, at all.

new = {}

# Run through the mro and populate everything
for boxed in reversed(mro_boxed):
# We create it early so we can add it to seen, to handle recursion
# XXX: currently we are doing this even for types with no generics...
# that simplifies the flow... - probably keep it this way until
# we stop flattening attributes into every class
name = boxed.cls.__name__
cboxed: Any

args = tuple(boxed.args.values())
args_str = ", ".join(_type_repr(a) for a in args)
fullname = f"{name}[{args_str}]" if args_str else name
cboxed = type(
fullname,
(_eval_typing._EvalProxy,),
{
"__module__": boxed.cls.__module__,
"__name__": fullname,
"__origin__": boxed.cls,
"__local_args__": args,
},
)
new[boxed] = cboxed

annos: dict[str, Any] = {}
dct: dict[str, Any] = {}
sources: dict[str, Any] = {}

cboxed.__local_annotations__, cboxed.__local_defns__ = get_local_defns(
boxed
)
for base in reversed(boxed.mro):
cbase = new[base]
annos.update(cbase.__local_annotations__)
dct.update(cbase.__local_defns__) # uh.
for k in [*cbase.__local_annotations__, *cbase.__local_defns__]:
sources[k] = cbase

cboxed.__defn_names__ = set(dct)
cboxed.__annotations__ = annos
cboxed.__defn_sources__ = sources
cboxed.__generalized_mro__ = [new[b] for b in boxed.mro]

for k, v in dct.items():
setattr(cboxed, k, v)

# Run through the mro again and evaluate everything
for cboxed in new.values():
for k, v in cboxed.__annotations__.items():
cboxed.__annotations__[k] = _eval_typing._eval_types(v, ctx=ctx)

for k in cboxed.__defn_names__:
v = cboxed.__dict__[k]
setattr(cboxed, k, _eval_typing._eval_types(v, ctx=ctx))

return new[cls_boxed]


def flatten_class_explicit(obj: typing.Any):
with _eval_typing._ensure_context() as ctx:
return _flatten_class_explicit(obj, ctx)


flatten_class = flatten_class_new_proto