Skip to content

Commit 0433fb6

Browse files
committed
YapfBear: Catch parse errors and give result
The YapfBear earlier raised an error when the file was not parseable. Now, that error is caught and a Result is given out mentioning that the file has syntax errors and cannot be parsed. Fixes #750
1 parent 0476696 commit 0433fb6

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

bears/python/YapfBear.py

+16-5
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,22 @@ def run(self, filename, file,
144144
options += 'use_tabs = ' + str(not use_spaces)
145145
options = options.format(**locals())
146146

147-
with prepare_file(options.splitlines(keepends=True),
148-
None) as (file_, fname):
149-
corrected = FormatFile(filename,
150-
style_config=fname,
151-
verify=False)[0].splitlines(True)
147+
try:
148+
with prepare_file(options.splitlines(keepends=True),
149+
None) as (file_, fname):
150+
corrected = FormatFile(filename,
151+
style_config=fname,
152+
verify=False)[0].splitlines(True)
153+
except SyntaxError as err:
154+
if isinstance(err, IndentationError):
155+
error_type = "indentation errors (" + err.args[0] + ')'
156+
else:
157+
error_type = "syntax errors"
158+
yield Result.from_values(
159+
self,
160+
"The code cannot be parsed due to {0}.".format(error_type),
161+
filename, line=err.lineno, column=err.offset)
162+
return
152163
diffs = Diff.from_string_arrays(file, corrected).split_diff()
153164
for diff in diffs:
154165
yield Result(self,

tests/python/YapfBearTest.py

+18
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,24 @@ def test_eof_handling(self):
3131
self.check_validity(self.uut, ['a = 2'], valid=True)
3232
self.check_validity(self.uut, ['\n'], valid=True)
3333

34+
def test_invalid_python(self):
35+
# results = self.check_validity(
36+
# self.uut, ['def a():', ' b=1', ' bad indent'], valid=False)
37+
# self.assertEqual(len(results), 1, str(results))
38+
# self.assertIn('unexpected indent', results[0].message)
39+
40+
# results = self.check_validity(
41+
# self.uut, ['def a():', ' b=1', '\ttab error'], valid=False)
42+
# self.assertEqual(len(results), 1, str(results))
43+
# self.assertIn('inconsistent use of tabs and spaces in indentation',
44+
# results[0].message)
45+
46+
results = self.check_validity(
47+
self.uut, ['def a(:', ' b=1', '\ttab error'], valid=False)
48+
self.assertEqual(len(results), 1, str(results))
49+
self.assertIn('inconsistent use of tabs and spaces in indentation',
50+
results[0].message)
51+
3452
def test_valid_python_2(self):
3553
self.check_validity(self.uut, ['print 1\n'], valid=True)
3654

0 commit comments

Comments
 (0)