Index: tools/telemetry/third_party/rope/rope/base/arguments.py |
diff --git a/tools/telemetry/third_party/rope/rope/base/arguments.py b/tools/telemetry/third_party/rope/rope/base/arguments.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7ba43640663f56918921fb668285b897a1deaefa |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/rope/base/arguments.py |
@@ -0,0 +1,111 @@ |
+import rope.base.evaluate |
+from rope.base import ast |
+ |
+ |
+class Arguments(object): |
+ """A class for evaluating parameters passed to a function |
+ |
+ You can use the `create_arguments` factory. It handles implicit |
+ first arguments. |
+ |
+ """ |
+ |
+ def __init__(self, args, scope): |
+ self.args = args |
+ self.scope = scope |
+ self.instance = None |
+ |
+ def get_arguments(self, parameters): |
+ result = [] |
+ for pyname in self.get_pynames(parameters): |
+ if pyname is None: |
+ result.append(None) |
+ else: |
+ result.append(pyname.get_object()) |
+ return result |
+ |
+ def get_pynames(self, parameters): |
+ result = [None] * max(len(parameters), len(self.args)) |
+ for index, arg in enumerate(self.args): |
+ if isinstance(arg, ast.keyword) and arg.arg in parameters: |
+ result[parameters.index(arg.arg)] = self._evaluate(arg.value) |
+ else: |
+ result[index] = self._evaluate(arg) |
+ return result |
+ |
+ def get_instance_pyname(self): |
+ if self.args: |
+ return self._evaluate(self.args[0]) |
+ |
+ def _evaluate(self, ast_node): |
+ return rope.base.evaluate.eval_node(self.scope, ast_node) |
+ |
+ |
+def create_arguments(primary, pyfunction, call_node, scope): |
+ """A factory for creating `Arguments`""" |
+ args = list(call_node.args) |
+ args.extend(call_node.keywords) |
+ called = call_node.func |
+ # XXX: Handle constructors |
+ if _is_method_call(primary, pyfunction) and \ |
+ isinstance(called, ast.Attribute): |
+ args.insert(0, called.value) |
+ return Arguments(args, scope) |
+ |
+ |
+class ObjectArguments(object): |
+ |
+ def __init__(self, pynames): |
+ self.pynames = pynames |
+ |
+ def get_arguments(self, parameters): |
+ result = [] |
+ for pyname in self.pynames: |
+ if pyname is None: |
+ result.append(None) |
+ else: |
+ result.append(pyname.get_object()) |
+ return result |
+ |
+ def get_pynames(self, parameters): |
+ return self.pynames |
+ |
+ def get_instance_pyname(self): |
+ return self.pynames[0] |
+ |
+ |
+class MixedArguments(object): |
+ |
+ def __init__(self, pyname, arguments, scope): |
+ """`argumens` is an instance of `Arguments`""" |
+ self.pyname = pyname |
+ self.args = arguments |
+ |
+ def get_pynames(self, parameters): |
+ return [self.pyname] + self.args.get_pynames(parameters[1:]) |
+ |
+ def get_arguments(self, parameters): |
+ result = [] |
+ for pyname in self.get_pynames(parameters): |
+ if pyname is None: |
+ result.append(None) |
+ else: |
+ result.append(pyname.get_object()) |
+ return result |
+ |
+ def get_instance_pyname(self): |
+ return self.pyname |
+ |
+ |
+def _is_method_call(primary, pyfunction): |
+ if primary is None: |
+ return False |
+ pyobject = primary.get_object() |
+ if isinstance(pyobject.get_type(), rope.base.pyobjects.PyClass) and \ |
+ isinstance(pyfunction, rope.base.pyobjects.PyFunction) and \ |
+ isinstance(pyfunction.parent, rope.base.pyobjects.PyClass): |
+ return True |
+ if isinstance(pyobject.get_type(), rope.base.pyobjects.AbstractClass) and \ |
+ isinstance(pyfunction, rope.base.builtins.BuiltinFunction): |
+ return True |
+ return False |