Index: tools/telemetry/third_party/rope/rope/base/simplify.py |
diff --git a/tools/telemetry/third_party/rope/rope/base/simplify.py b/tools/telemetry/third_party/rope/rope/base/simplify.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bc4cade4ab910989e3143c17df1180a2770794b9 |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/rope/base/simplify.py |
@@ -0,0 +1,55 @@ |
+"""A module to ease code analysis |
+ |
+This module is here to help source code analysis. |
+""" |
+import re |
+ |
+from rope.base import codeanalyze, utils |
+ |
+ |
+@utils.cached(7) |
+def real_code(source): |
+ """Simplify `source` for analysis |
+ |
+ It replaces: |
+ |
+ * comments with spaces |
+ * strs with a new str filled with spaces |
+ * implicit and explicit continuations with spaces |
+ * tabs and semicolons with spaces |
+ |
+ The resulting code is a lot easier to analyze if we are interested |
+ only in offsets. |
+ """ |
+ collector = codeanalyze.ChangeCollector(source) |
+ for start, end in ignored_regions(source): |
+ if source[start] == '#': |
+ replacement = ' ' * (end - start) |
+ else: |
+ replacement = '"%s"' % (' ' * (end - start - 2)) |
+ collector.add_change(start, end, replacement) |
+ source = collector.get_changed() or source |
+ collector = codeanalyze.ChangeCollector(source) |
+ parens = 0 |
+ for match in _parens.finditer(source): |
+ i = match.start() |
+ c = match.group() |
+ if c in '({[': |
+ parens += 1 |
+ if c in ')}]': |
+ parens -= 1 |
+ if c == '\n' and parens > 0: |
+ collector.add_change(i, i + 1, ' ') |
+ source = collector.get_changed() or source |
+ return source.replace('\\\n', ' ').replace('\t', ' ').replace(';', '\n') |
+ |
+ |
+@utils.cached(7) |
+def ignored_regions(source): |
+ """Return ignored regions like strings and comments in `source` """ |
+ return [(match.start(), match.end()) for match in _str.finditer(source)] |
+ |
+ |
+_str = re.compile('%s|%s' % (codeanalyze.get_comment_pattern(), |
+ codeanalyze.get_string_pattern())) |
+_parens = re.compile(r'[\({\[\]}\)\n]') |