Index: tools/telemetry/third_party/rope/rope/base/ast.py |
diff --git a/tools/telemetry/third_party/rope/rope/base/ast.py b/tools/telemetry/third_party/rope/rope/base/ast.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d43c83c55bed265f936352df2393c52d059d81d4 |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/rope/base/ast.py |
@@ -0,0 +1,76 @@ |
+import _ast |
+from _ast import * |
+ |
+from rope.base import fscommands |
+ |
+try: |
+ unicode |
+except NameError: |
+ unicode = str |
+ |
+ |
+def parse(source, filename='<string>'): |
+ # NOTE: the raw string should be given to `compile` function |
+ if isinstance(source, unicode): |
+ source = fscommands.unicode_to_file_data(source) |
+ if b'\r' in source: |
+ source = source.replace(b'\r\n', b'\n').replace(b'\r', b'\n') |
+ if not source.endswith(b'\n'): |
+ source += b'\n' |
+ try: |
+ return compile(source, filename, 'exec', _ast.PyCF_ONLY_AST) |
+ except (TypeError, ValueError) as e: |
+ error = SyntaxError() |
+ error.lineno = 1 |
+ error.filename = filename |
+ error.msg = str(e) |
+ raise error |
+ |
+ |
+def walk(node, walker): |
+ """Walk the syntax tree""" |
+ method_name = '_' + node.__class__.__name__ |
+ method = getattr(walker, method_name, None) |
+ if method is not None: |
+ if isinstance(node, _ast.ImportFrom) and node.module is None: |
+ # In python < 2.7 ``node.module == ''`` for relative imports |
+ # but for python 2.7 it is None. Generalizing it to ''. |
+ node.module = '' |
+ return method(node) |
+ for child in get_child_nodes(node): |
+ walk(child, walker) |
+ |
+ |
+def get_child_nodes(node): |
+ if isinstance(node, _ast.Module): |
+ return node.body |
+ result = [] |
+ if node._fields is not None: |
+ for name in node._fields: |
+ child = getattr(node, name) |
+ if isinstance(child, list): |
+ for entry in child: |
+ if isinstance(entry, _ast.AST): |
+ result.append(entry) |
+ if isinstance(child, _ast.AST): |
+ result.append(child) |
+ return result |
+ |
+ |
+def call_for_nodes(node, callback, recursive=False): |
+ """If callback returns `True` the child nodes are skipped""" |
+ result = callback(node) |
+ if recursive and not result: |
+ for child in get_child_nodes(node): |
+ call_for_nodes(child, callback, recursive) |
+ |
+ |
+def get_children(node): |
+ result = [] |
+ if node._fields is not None: |
+ for name in node._fields: |
+ if name in ['lineno', 'col_offset']: |
+ continue |
+ child = getattr(node, name) |
+ result.append(child) |
+ return result |