summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Rix <tom.rix@sony.com>2019-01-23 09:43:06 -0800
committerKim Gräsman <kim.grasman@gmail.com>2019-01-30 21:06:46 +0100
commit8b63d319e9ff0829b905b013002af6c8048b564c (patch)
tree3ca503307a8349c1fc226da85c85e5f9135f3242
parent6e4330dfcf36c3c2b9a7f2dfa02df6081bd4f868 (diff)
Reduce spurious line separator changes.
A diff of the original and change file should show only changes related to the includes and/or forward declarations. In files that have line separators that do not match the FileInfo.linesep, those line will be changed. So instead of stripping a file's line separators, reuse them. For any new line, use the FileInfo.linesep. Also, do not add a new line separator at the end of a file.
-rwxr-xr-xfix_includes.py23
-rwxr-xr-xfix_includes_test.py25
2 files changed, 30 insertions, 18 deletions
diff --git a/fix_includes.py b/fix_includes.py
index c696e3f..f0b67c0 100755
--- a/fix_includes.py
+++ b/fix_includes.py
@@ -581,7 +581,12 @@ def _ReadFile(filename, fileinfo):
try:
with open(filename, 'rb') as f:
content = f.read()
- return content.decode(fileinfo.encoding).splitlines()
+ # Call splitlines with True to keep the original line
+ # endings. Later in WriteFile, they will be used as-is.
+ # This will reduce spurious changes to the original files.
+ # The lines we add will have the linesep determined by
+ # FileInfo.
+ return content.decode(fileinfo.encoding).splitlines(True)
except (IOError, OSError) as why:
print("Skipping '%s': %s" % (filename, why))
return None
@@ -591,7 +596,8 @@ def _WriteFile(filename, fileinfo, file_lines):
"""Write the given file-lines to the file."""
try:
with open(filename, 'wb') as f:
- content = fileinfo.linesep.join(file_lines) + fileinfo.linesep
+ # file_lines already have line endings, so join with ''.
+ content = ''.join(file_lines)
content = content.encode(fileinfo.encoding)
f.write(content)
except (IOError, OSError) as why:
@@ -2048,7 +2054,7 @@ def _GetSymbolNameFromForwardDeclareLine(line):
return symbol_name
-def FixFileLines(iwyu_record, file_lines, flags):
+def FixFileLines(iwyu_record, file_lines, flags, fileinfo):
"""Applies one block of lines from the iwyu output script.
Called once we have read all the lines from the iwyu output script
@@ -2067,6 +2073,7 @@ def FixFileLines(iwyu_record, file_lines, flags):
flags: commandline flags, as parsed by optparse. We use
flags.safe_headers to turn off deleting lines, and use the
other flags indirectly (via calls to other routines).
+ fileinfo: FileInfo for the current file.
Returns:
An array of 'fixed' source code lines, after modifications as
@@ -2156,20 +2163,24 @@ def FixFileLines(iwyu_record, file_lines, flags):
# 'namespace foo { class Bar; }\n' -> 'namespace foo {\nclass Bar;\n}'
# along with collecting multiple classes in the same namespace.
new_lines = _NormalizeNamespaceForwardDeclareLines(new_lines)
+
+ # Add line separators to the new lines.
+ new_lines = [nl.rstrip() + fileinfo.linesep for nl in new_lines]
+
output_lines.extend(new_lines)
line_number = current_reorder_span[1] # go to end of span
return [line for line in output_lines if line is not None]
-def FixOneFile(iwyu_record, file_contents, flags):
+def FixOneFile(iwyu_record, file_contents, flags, fileinfo):
"""Parse a file guided by an iwyu_record and flags and apply IWYU fixes.
Returns two lists of lines (old, fixed).
"""
file_lines = ParseOneFile(file_contents, iwyu_record)
old_lines = [fl.line for fl in file_lines
if fl is not None and fl.line is not None]
- fixed_lines = FixFileLines(iwyu_record, file_lines, flags)
+ fixed_lines = FixFileLines(iwyu_record, file_lines, flags, fileinfo)
return old_lines, fixed_lines
@@ -2201,7 +2212,7 @@ def FixManyFiles(iwyu_records, flags):
continue
print(">>> Fixing #includes in '%s'" % iwyu_record.filename)
- old_lines, fixed_lines = FixOneFile(iwyu_record, file_contents, flags)
+ old_lines, fixed_lines = FixOneFile(iwyu_record, file_contents, flags, fileinfo)
if old_lines == fixed_lines:
print("No changes in file %s" % iwyu_record.filename)
continue
diff --git a/fix_includes_test.py b/fix_includes_test.py
index 1592b7c..9433d7d 100755
--- a/fix_includes_test.py
+++ b/fix_includes_test.py
@@ -107,10 +107,11 @@ class FixIncludesBase(unittest.TestCase):
for (filename, contents) in file_contents_map.items():
before_contents = []
expected_after_contents = []
- for line in contents.splitlines():
+ for line in contents.splitlines(True):
m = remove_re.search(line)
if m:
- before_contents.append(line[:m.start()])
+ # The trailing line separator is stripped, so append a '\n'.
+ before_contents.append(line[:m.start()] + '\n')
elif line.startswith('///+'):
expected_after_contents.append(line[len('///+'):])
else:
@@ -3576,7 +3577,7 @@ int main() { return 0; }
"""
self.RegisterFileContents({'sort': infile})
num_files_modified = fix_includes.SortIncludesInFiles(['sort'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -3604,7 +3605,7 @@ int main() { return 0; }
self.RegisterFileContents({'f1': infile1, 'f2': infile2})
num_files_modified = fix_includes.SortIncludesInFiles(['f1', 'f2'],
self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(2, num_files_modified)
@@ -3689,7 +3690,7 @@ The full include-list for barrier_includes.h:
self.RegisterFileContents({'me/subdir0/foo.cc': infile})
num_files_modified = fix_includes.SortIncludesInFiles(
['me/subdir0/foo.cc'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -3709,7 +3710,7 @@ The full include-list for barrier_includes.h:
self.RegisterFileContents({'me/subdir0/foo.cc': infile})
num_files_modified = fix_includes.SortIncludesInFiles(
['me/subdir0/foo.cc'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -3726,7 +3727,7 @@ The full include-list for barrier_includes.h:
self.RegisterFileContents({'foo.cc': infile})
num_files_modified = fix_includes.SortIncludesInFiles(
['foo.cc'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -3745,7 +3746,7 @@ The full include-list for barrier_includes.h:
self.RegisterFileContents({'me/subdir0/foo.cc': infile})
num_files_modified = fix_includes.SortIncludesInFiles(
['me/subdir0/foo.cc'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -3797,7 +3798,7 @@ The full include-list for barrier_includes.h:
self.flags.separate_project_includes = '<tld>'
num_files_modified = fix_includes.SortIncludesInFiles(['me/subdir0/foo.cc'],
self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -3823,7 +3824,7 @@ The full include-list for barrier_includes.h:
self.flags.separate_project_includes = 'me/subdir0'
num_files_modified = fix_includes.SortIncludesInFiles(['me/subdir0/foo.cc'],
self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -4200,7 +4201,7 @@ namespace A { class AC; } // A
self.flags.reorder = True
num_files_modified = fix_includes.SortIncludesInFiles(
['inclusions_reordered.cc'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)
@@ -4250,7 +4251,7 @@ namespace A { class AC; } // A
self.flags.reorder = False
num_files_modified = fix_includes.SortIncludesInFiles(
['inclusions_not_reordered.cc'], self.flags)
- self.assertListEqual(expected_output.strip().split('\n'),
+ self.assertListEqual(expected_output.splitlines(True),
self.actual_after_contents)
self.assertEqual(1, num_files_modified)