Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/arguments.py
1415 views
import rope.base.evaluate1from rope.base import ast234class Arguments(object):5"""A class for evaluating parameters passed to a function67You can use the `create_arguments` factory. It handles implicit8first arguments.910"""1112def __init__(self, args, scope):13self.args = args14self.scope = scope15self.instance = None1617def get_arguments(self, parameters):18result = []19for pyname in self.get_pynames(parameters):20if pyname is None:21result.append(None)22else:23result.append(pyname.get_object())24return result2526def get_pynames(self, parameters):27result = [None] * max(len(parameters), len(self.args))28for index, arg in enumerate(self.args):29if isinstance(arg, ast.keyword) and arg.arg in parameters:30result[parameters.index(arg.arg)] = self._evaluate(arg.value)31else:32result[index] = self._evaluate(arg)33return result3435def get_instance_pyname(self):36if self.args:37return self._evaluate(self.args[0])3839def _evaluate(self, ast_node):40return rope.base.evaluate.eval_node(self.scope, ast_node)414243def create_arguments(primary, pyfunction, call_node, scope):44"""A factory for creating `Arguments`"""45args = list(call_node.args)46args.extend(call_node.keywords)47called = call_node.func48# XXX: Handle constructors49if _is_method_call(primary, pyfunction) and \50isinstance(called, ast.Attribute):51args.insert(0, called.value)52return Arguments(args, scope)535455class ObjectArguments(object):5657def __init__(self, pynames):58self.pynames = pynames5960def get_arguments(self, parameters):61result = []62for pyname in self.pynames:63if pyname is None:64result.append(None)65else:66result.append(pyname.get_object())67return result6869def get_pynames(self, parameters):70return self.pynames7172def get_instance_pyname(self):73return self.pynames[0]74class MixedArguments(object):7576def __init__(self, pyname, arguments, scope):77"""`argumens` is an instance of `Arguments`"""78self.pyname = pyname79self.args = arguments8081def get_pynames(self, parameters):82return [self.pyname] + self.args.get_pynames(parameters[1:])8384def get_arguments(self, parameters):85result = []86for pyname in self.get_pynames(parameters):87if pyname is None:88result.append(None)89else:90result.append(pyname.get_object())91return result9293def get_instance_pyname(self):94return self.pyname959697def _is_method_call(primary, pyfunction):98if primary is None:99return False100pyobject = primary.get_object()101if isinstance(pyobject.get_type(), rope.base.pyobjects.PyClass) and \102isinstance(pyfunction, rope.base.pyobjects.PyFunction) and \103isinstance(pyfunction.parent, rope.base.pyobjects.PyClass):104return True105if isinstance(pyobject.get_type(), rope.base.pyobjects.AbstractClass) and \106isinstance(pyfunction, rope.base.builtins.BuiltinFunction):107return True108return False109110111