def _call_traces_to_function(call_traces, name_transform=lambda x: x): funcs = collections.defaultdict(pytd_utils.OrderedSet) for node, func, sigs, args, kws, retvar in call_traces: # The lengths may be different in the presence of optional and kw args. arg_names = max((sig.get_positional_names() for sig in sigs), key=len) for i in range(len(arg_names)): if not isinstance(func.data, abstract.BoundFunction) or i > 0: arg_names[i] = function.argname(i) arg_types = (a.data.to_type(node) for a in args) ret = pytd_utils.JoinTypes(t.to_type(node) for t in retvar.data) # TODO(kramm): Record these: starargs = None starstarargs = None funcs[func.data.name].add( pytd.Signature(tuple( pytd.Parameter(n, t, False, False, None) for n, t in zip(arg_names, arg_types)) + tuple( pytd.Parameter(name, a.data.to_type(node), False, False, None) for name, a in kws), starargs, starstarargs, ret, exceptions=(), template=())) functions = [] for name, signatures in funcs.items(): functions.append( pytd.Function(name_transform(name), tuple(signatures), pytd.METHOD)) return functions
def _make_pytd_function(self, params, name="f"): pytd_params = [] for i, p in enumerate(params): p_type = pytd.ClassType(p.name) p_type.cls = p pytd_params.append( pytd.Parameter(function.argname(i), p_type, False, False, None)) pytd_sig = pytd.Signature( tuple(pytd_params), None, None, pytd.AnythingType(), (), ()) sig = function.PyTDSignature(name, pytd_sig, self._vm) return abstract.PyTDFunction(name, (sig,), pytd.METHOD, self._vm)