diff options
author | Daniel Jasper <djasper@google.com> | 2013-09-18 12:14:09 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-09-18 12:14:09 +0000 |
commit | dcab7fbb830ffc06cfa088a76dcfc3b2b2b869e4 (patch) | |
tree | 81eba16837f7411ebcb779e3a013664e55803df4 /clang/tools | |
parent | 1f5d74d8aed0ad3c014e1a883be60640df40246c (diff) | |
download | llvm-dcab7fbb830ffc06cfa088a76dcfc3b2b2b869e4.zip llvm-dcab7fbb830ffc06cfa088a76dcfc3b2b2b869e4.tar.gz llvm-dcab7fbb830ffc06cfa088a76dcfc3b2b2b869e4.tar.bz2 |
Simplify clang-format-diff.py using new clang-format options.
clang-format's -lines parameter makes this significantly easier.
llvm-svn: 190935
Diffstat (limited to 'clang/tools')
-rwxr-xr-x | clang/tools/clang-format/clang-format-diff.py | 85 |
1 files changed, 26 insertions, 59 deletions
diff --git a/clang/tools/clang-format/clang-format-diff.py b/clang/tools/clang-format/clang-format-diff.py index 89fa052..cb8d942 100755 --- a/clang/tools/clang-format/clang-format-diff.py +++ b/clang/tools/clang-format/clang-format-diff.py @@ -31,55 +31,6 @@ import sys binary = 'clang-format' -def getOffsetLength(filename, line_number, line_count): - """ - Calculates the field offset and length based on line number and count. - """ - offset = 0 - length = 0 - with open(filename, 'r') as f: - for line in f: - if line_number > 1: - offset += len(line) - line_number -= 1 - elif line_count > 0: - length += len(line) - line_count -= 1 - else: - break - return offset, length - - -def formatRange(r, style): - """ - Formats range 'r' according to style 'style'. - """ - filename, line_number, line_count = r - # FIXME: Add other types containing C++/ObjC code. - if not (filename.endswith(".cpp") or filename.endswith(".cc") or - filename.endswith(".h")): - return - - offset, length = getOffsetLength(filename, line_number, line_count) - with open(filename, 'r') as f: - text = f.read() - command = [binary, '-offset', str(offset), '-length', str(length)] - if style: - command.extend(['-style', style]) - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - stdin=subprocess.PIPE) - stdout, stderr = p.communicate(input=text) - if stderr: - print stderr - return - if not stdout: - print 'Segfault occurred while formatting', filename - print 'Please report a bug on llvm.org/bugs.' - return - with open(filename, 'w') as f: - f.write(stdout) - - def main(): parser = argparse.ArgumentParser(description= 'Reformat changed lines in diff.') @@ -91,9 +42,9 @@ def main(): 'formatting style to apply (LLVM, Google, Chromium, Mozilla, WebKit)') args = parser.parse_args() + # Extract changed lines for each file. filename = None - ranges = [] - + lines_by_file = {} for line in sys.stdin: match = re.search('^\+\+\+\ (.*?/){%s}(\S*)' % args.p, line) if match: @@ -101,17 +52,33 @@ def main(): if filename == None: continue + # FIXME: Add other types containing C++/ObjC code. + if not (filename.endswith(".cpp") or filename.endswith(".cc") or + filename.endswith(".h")): + continue + match = re.search('^@@.*\+(\d+)(,(\d+))?', line) if match: - line_count = 1 + start_line = int(match.group(1)) + end_line = start_line if match.group(3): - line_count = int(match.group(3)) - ranges.append((filename, int(match.group(1)), line_count)) - - # Reverse the ranges so that the reformatting does not influence file offsets. - for r in reversed(ranges): - # Do the actual formatting. - formatRange(r, args.style) + end_line = start_line + int(match.group(3)) + lines_by_file.setdefault(filename, []).extend( + ['-lines', str(start_line) + ':' + str(end_line)]) + + # Reformat files containing changes in place. + for filename, lines in lines_by_file.iteritems(): + command = [binary, '-i', filename] + command.extend(lines) + if args.style: + command.extend(['-style', style]) + p = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + stdin=subprocess.PIPE) + stdout, stderr = p.communicate() + if stderr: + print stderr + return if __name__ == '__main__': |