| Index: tools/telemetry/third_party/rope/rope/refactor/sourceutils.py
|
| diff --git a/tools/telemetry/third_party/rope/rope/refactor/sourceutils.py b/tools/telemetry/third_party/rope/rope/refactor/sourceutils.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9b842906636f5348579f796b40c6dd4a24e3d6d9
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/rope/refactor/sourceutils.py
|
| @@ -0,0 +1,91 @@
|
| +from rope.base import codeanalyze
|
| +
|
| +
|
| +def get_indents(lines, lineno):
|
| + return codeanalyze.count_line_indents(lines.get_line(lineno))
|
| +
|
| +
|
| +def find_minimum_indents(source_code):
|
| + result = 80
|
| + lines = source_code.split('\n')
|
| + for line in lines:
|
| + if line.strip() == '':
|
| + continue
|
| + result = min(result, codeanalyze.count_line_indents(line))
|
| + return result
|
| +
|
| +
|
| +def indent_lines(source_code, amount):
|
| + if amount == 0:
|
| + return source_code
|
| + lines = source_code.splitlines(True)
|
| + result = []
|
| + for l in lines:
|
| + if l.strip() == '':
|
| + result.append('\n')
|
| + continue
|
| + if amount < 0:
|
| + indents = codeanalyze.count_line_indents(l)
|
| + result.append(max(0, indents + amount) * ' ' + l.lstrip())
|
| + else:
|
| + result.append(' ' * amount + l)
|
| + return ''.join(result)
|
| +
|
| +
|
| +def fix_indentation(code, new_indents):
|
| + """Change the indentation of `code` to `new_indents`"""
|
| + min_indents = find_minimum_indents(code)
|
| + return indent_lines(code, new_indents - min_indents)
|
| +
|
| +
|
| +def add_methods(pymodule, class_scope, methods_sources):
|
| + source_code = pymodule.source_code
|
| + lines = pymodule.lines
|
| + insertion_line = class_scope.get_end()
|
| + if class_scope.get_scopes():
|
| + insertion_line = class_scope.get_scopes()[-1].get_end()
|
| + insertion_offset = lines.get_line_end(insertion_line)
|
| + methods = '\n\n' + '\n\n'.join(methods_sources)
|
| + indented_methods = fix_indentation(
|
| + methods, get_indents(lines, class_scope.get_start()) +
|
| + get_indent(pymodule.pycore.project))
|
| + result = []
|
| + result.append(source_code[:insertion_offset])
|
| + result.append(indented_methods)
|
| + result.append(source_code[insertion_offset:])
|
| + return ''.join(result)
|
| +
|
| +
|
| +def get_body(pyfunction):
|
| + """Return unindented function body"""
|
| + # FIXME scope = pyfunction.get_scope()
|
| + pymodule = pyfunction.get_module()
|
| + start, end = get_body_region(pyfunction)
|
| + return fix_indentation(pymodule.source_code[start:end], 0)
|
| +
|
| +
|
| +def get_body_region(defined):
|
| + """Return the start and end offsets of function body"""
|
| + scope = defined.get_scope()
|
| + pymodule = defined.get_module()
|
| + lines = pymodule.lines
|
| + node = defined.get_ast()
|
| + start_line = node.lineno
|
| + if defined.get_doc() is None:
|
| + start_line = node.body[0].lineno
|
| + elif len(node.body) > 1:
|
| + start_line = node.body[1].lineno
|
| + start = lines.get_line_start(start_line)
|
| + scope_start = pymodule.logical_lines.logical_line_in(scope.start)
|
| + if scope_start[1] >= start_line:
|
| + # a one-liner!
|
| + # XXX: what if colon appears in a string
|
| + start = pymodule.source_code.index(':', start) + 1
|
| + while pymodule.source_code[start].isspace():
|
| + start += 1
|
| + end = min(lines.get_line_end(scope.end) + 1, len(pymodule.source_code))
|
| + return start, end
|
| +
|
| +
|
| +def get_indent(project):
|
| + return project.prefs.get('indent_size', 4)
|
|
|