Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def VisitClass(self, cls):
"""Visit a class, and change constants to methods where possible."""
new_constants = []
new_methods = list(cls.methods)
adjust_self = visitors.AdjustSelf(force=True)
adjust_self.class_types.append(visitors.ClassAsType(cls))
for const in cls.constants:
c = self._LookupIfSimpleCall(const.type)
if c:
signatures = c.methods[0].signatures
self._processed_count[c.name] += 1
new_method = pytd.Function(const.name, signatures, c.methods[0].kind)
new_methods.append(new_method.Visit(adjust_self))
else:
new_constants.append(const) # keep
return cls.Replace(constants=tuple(new_constants),
methods=tuple(new_methods))
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
sig.annotations[sig.kwargs_name].get_instance_type(node),
False, False, None)
else:
starstar = None
if sig.has_return_annotation:
ret_type = sig.annotations["return"].get_instance_type(node)
else:
ret_type = pytd.NamedType("__builtin__.NoneType")
pytd_sig = pytd.Signature(
params=tuple(params+kwonly),
starargs=star,
starstarargs=starstar,
return_type=ret_type,
exceptions=(),
template=())
return pytd.Function(name, (pytd_sig,), pytd.METHOD)
annot = sig.annotations[sig.kwargs_name]
typ = annot.get_instance_type(node_after)
else:
typ = pytd.NamedType("__builtin__.dict")
starstarargs = pytd.Parameter(sig.kwargs_name, typ, False, True, None)
else:
starstarargs = None
signatures.append(pytd.Signature(
params=tuple(params),
starargs=starargs,
starstarargs=starstarargs,
return_type=ret,
exceptions=(), # TODO(kramm): record exceptions
template=()))
return pytd.Function(name=function_name,
signatures=tuple(signatures),
kind=pytd.METHOD,
flags=pytd.Function.abstract_flag(v.is_abstract))
# If we have only setters and/or deleters, replace them with a single
# method foo(...) -> Any, so that we infer a constant `foo: Any` even if
# the original method signatures are all `foo(...) -> None`. (If we have a
# getter we use its return type, but in the absence of a getter we want to
# fall back on Any since we cannot say anything about what the setter sets
# the type of foo to.)
if decorator.endswith(".setter") or decorator.endswith(".deleter"):
sigs = [sigs[0].Replace(return_type=pytd.AnythingType())]
else:
kind = pytd.METHOD
flags = 0
if is_abstract:
flags |= pytd.Function.IS_ABSTRACT
if is_coroutine:
flags |= pytd.Function.IS_COROUTINE
methods.append(pytd.Function(name, tuple(sigs), kind, flags))
return methods
assert not slots # slots aren't allowed on the module level
assert not aliases # We handle top-level aliases in add_alias_or_constant.
constants.extend(self._constants)
generated_classes = sum(self._generated_classes.values(), [])
classes = generated_classes + classes
functions = _merge_method_signatures(functions)
name_to_class = {c.name: c for c in classes}
aliases = []
for a in self._aliases.values():
t = _maybe_resolve_alias(a, name_to_class)
if t is None:
continue
elif isinstance(t, pytd.Function):
functions.append(t)
elif isinstance(t, pytd.Constant):
constants.append(t)
else:
assert isinstance(t, pytd.Alias)
aliases.append(t)
all_names = ([f.name for f in functions] +
[c.name for c in constants] +
[c.name for c in self._type_params] +
[c.name for c in classes] +
[c.name for c in aliases])
duplicates = [name
for name, count in collections.Counter(all_names).items()
if count >= 2]
if duplicates:
def _convert_member(self, _, pyval, subst=None, node=None):
"""Convert a member as a variable. For lazy lookup."""
subst = subst or {}
node = node or self.vm.root_cfg_node
if isinstance(pyval, pytd.Constant):
return self.vm.convert.constant_to_var(
AsInstance(pyval.type), subst, node)
elif isinstance(pyval, pytd.Function):
c = self.vm.convert.constant_to_value(pyval, subst=subst, node=node)
c.parent = self
return c.to_variable(self.vm.root_cfg_node)
else:
raise AssertionError("Invalid class member %s", pytd.Print(pyval))
def __new__(cls, name, signatures, kind, flags=0):
self = super(Function, cls).__new__(cls, name, signatures, kind, flags)
return self
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