in library/compiler/static.py [0:0]
def _visitFunc(self, node: Union[FunctionDef, AsyncFunctionDef]) -> None:
scope = BindingScope(node)
for decorator in node.decorator_list:
self.visit(decorator)
cur_scope = self.scope
if (
not node.decorator_list
and isinstance(cur_scope, ClassDef)
and node.args.args
):
# Handle type of "self"
klass = self.cur_mod.resolve_name(cur_scope.name)
if isinstance(klass, Class):
self.set_param(node.args.args[0], klass, scope)
else:
self.set_param(node.args.args[0], DYNAMIC_TYPE, scope)
for arg in node.args.posonlyargs:
ann = arg.annotation
if ann:
self.visit(ann)
arg_type = self.cur_mod.resolve_annotation(ann) or DYNAMIC_TYPE
elif arg.arg in scope.decl_types:
# Already handled self
continue
else:
arg_type = DYNAMIC_TYPE
self.set_param(arg, arg_type, scope)
for arg in node.args.args:
ann = arg.annotation
if ann:
self.visit(ann)
arg_type = self.cur_mod.resolve_annotation(ann) or DYNAMIC_TYPE
elif arg.arg in scope.decl_types:
# Already handled self
continue
else:
arg_type = DYNAMIC_TYPE
self.set_param(arg, arg_type, scope)
if node.args.defaults:
for default in node.args.defaults:
self.visit(default)
if node.args.kw_defaults:
for default in node.args.kw_defaults:
if default is not None:
self.visit(default)
vararg = node.args.vararg
if vararg:
ann = vararg.annotation
if ann:
self.visit(ann)
self.set_param(vararg, TUPLE_EXACT_TYPE, scope)
for arg in node.args.kwonlyargs:
ann = arg.annotation
if ann:
self.visit(ann)
arg_type = self.cur_mod.resolve_annotation(ann) or DYNAMIC_TYPE
else:
arg_type = DYNAMIC_TYPE
self.set_param(arg, arg_type, scope)
kwarg = node.args.kwarg
if kwarg:
ann = kwarg.annotation
if ann:
self.visit(ann)
self.set_param(kwarg, DICT_EXACT_TYPE, scope)
returns = None if node.args in self.cur_mod.dynamic_returns else node.returns
if returns:
# We store the return type on the node for the function as we otherwise
# don't need to store type information for it
expected = self.cur_mod.resolve_annotation(returns) or DYNAMIC_TYPE
self.set_type(node, expected.instance)
self.visit(returns)
else:
self.set_type(node, DYNAMIC)
self.scopes.append(scope)
for stmt in node.body:
self.visit(stmt)
self.scopes.pop()