r190935 - Simplify clang-format-diff.py using new clang-format options.

Nico Weber thakis at chromium.org
Wed Sep 18 19:08:51 PDT 2013


On Wed, Sep 18, 2013 at 5:14 AM, Daniel Jasper <djasper at google.com> wrote:

> Author: djasper
> Date: Wed Sep 18 07:14:09 2013
> New Revision: 190935
>
> URL: http://llvm.org/viewvc/llvm-project?rev=190935&view=rev
> Log:
> Simplify clang-format-diff.py using new clang-format options.
>
> clang-format's -lines parameter makes this significantly easier.
>
> Modified:
>     cfe/trunk/tools/clang-format/clang-format-diff.py
>
> Modified: cfe/trunk/tools/clang-format/clang-format-diff.py
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-format/clang-format-diff.py?rev=190935&r1=190934&r2=190935&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/clang-format/clang-format-diff.py (original)
> +++ cfe/trunk/tools/clang-format/clang-format-diff.py Wed Sep 18 07:14:09
> 2013
> @@ -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.
>

ObjC is .m, ObjC++ is .mm. Also, no .c?


> +    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__':
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130918/ef639734/attachment.html>


More information about the cfe-commits mailing list