from __future__ import print_function
import argparse
import collections
import fileinput
import os
import re
import sys
_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
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
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())