#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Script to apply fixits generated by clang. This is to work around the fact
# that clang's -Xclang -fixit-recompile flag, which automatically applies fixits
# and recompiles, doesn't work well with parallel invocations of clang.
#
# Usage:
# 1. Enable parseable fixits and disable warnings as errors. Instructions for
#    doing this vary based on the build environment, but for GN, warnings as
#    errors can be disabled by setting treat_warnings_as_errors = false
#    Enabling parseable fixits requires editing build/config/compiler/BUILD.gn
#    and adding `-fdiagnostics-parseable-fixits` to cflags.
# 2. Build everything and capture the output:
#      ninja -C <build_directory> &> generated-fixits
# 3. Apply the fixits with this script:
#      python apply_fixits.py -p <build_directory> < generated-fixits

from __future__ import print_function

import argparse
import collections
import fileinput
import os
import re
import sys

# fix-it:"../../base/threading/sequenced_worker_pool.h":{341:3-341:11}:""
# Note that the file path is relative to the build directory.
_FIXIT_RE = re.compile(r'^fix-it:"(?P<file>.+?)":'
                       r'{(?P<start_line>\d+?):(?P<start_col>\d+?)-'
                       r'(?P<end_line>\d+?):(?P<end_col>\d+?)}:'
                       r'"(?P<text>.*?)"$')

FixIt = collections.namedtuple(
    'FixIt', ('start_line', 'start_col', 'end_line', 'end_col', 'text'))


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument(
      '-p',
      required=True,
      help='path to the build directory to complete relative paths in fixits')
  args = parser.parse_args()

  fixits = collections.defaultdict(list)
  for line in fileinput.input(['-']):
    if not line.startswith('fix-it:'):
      continue
    m = _FIXIT_RE.match(line)
    if not m:
      continue
    # The negative line numbers are a cheap hack so we can sort things in line
    # order but reverse column order. Applying the fixits in reverse order makes
    # things simpler, since offsets won't have to be adjusted as the text is
    # changed.
    fixits[m.group('file')].append(FixIt(
        int(m.group('start_line')), -int(m.group('start_col')), int(m.group(
            'end_line')), -int(m.group('end_col')), m.group('text')))
  for k, v in fixits.iteritems():
    v.sort()
    with open(os.path.join(args.p, k), 'rb+') as f:
      lines = f.readlines()
      last_fixit = None
      for fixit in v:
        if fixit.start_line != fixit.end_line:
          print('error: multiline fixits not supported! file: %s, fixit: %s' %
                (k, fixit))
          sys.exit(1)
        if fixit == last_fixit:
          continue
        last_fixit = fixit
        # The line/column numbers emitted in fixit hints start at 1, so offset
        # is appropriately.
        line = lines[fixit.start_line - 1]
        lines[fixit.start_line - 1] = (line[:-fixit.start_col - 1] + fixit.text
                                       + line[-fixit.end_col - 1:])
      f.seek(0)
      f.truncate()
      f.writelines(lines)


if __name__ == '__main__':
  sys.exit(main())
