Issue #17825: Cursor ^ is correctly positioned for SyntaxError and IndentationError.

This commit is contained in:
Florent Xicluna 2014-01-22 01:33:59 +01:00
parent 70df667dfe
commit edfd9addf6
3 changed files with 17 additions and 3 deletions

View File

@ -35,6 +35,9 @@ class TracebackCases(unittest.TestCase):
def syntax_error_bad_indentation(self): def syntax_error_bad_indentation(self):
compile("def spam():\n print 1\n print 2", "?", "exec") compile("def spam():\n print 1\n print 2", "?", "exec")
def syntax_error_bad_indentation2(self):
compile(" print(2)", "?", "exec")
def test_caret(self): def test_caret(self):
err = self.get_exception_format(self.syntax_error_with_caret, err = self.get_exception_format(self.syntax_error_with_caret,
SyntaxError) SyntaxError)
@ -111,6 +114,13 @@ def test():
os.unlink(os.path.join(testdir, f)) os.unlink(os.path.join(testdir, f))
os.rmdir(testdir) os.rmdir(testdir)
err = self.get_exception_format(self.syntax_error_bad_indentation2,
IndentationError)
self.assertEqual(len(err), 4)
self.assertEqual(err[1].strip(), "print(2)")
self.assertIn("^", err[2])
self.assertEqual(err[1].find("p"), err[2].find("^"))
def test_base_exception(self): def test_base_exception(self):
# Test that exceptions derived from BaseException are formatted right # Test that exceptions derived from BaseException are formatted right
e = KeyboardInterrupt() e = KeyboardInterrupt()

View File

@ -189,11 +189,12 @@ def format_exception_only(etype, value):
if badline is not None: if badline is not None:
lines.append(' %s\n' % badline.strip()) lines.append(' %s\n' % badline.strip())
if offset is not None: if offset is not None:
caretspace = badline.rstrip('\n')[:offset].lstrip() caretspace = badline.rstrip('\n')
offset = min(len(caretspace), offset) - 1
caretspace = caretspace[:offset].lstrip()
# non-space whitespace (likes tabs) must be kept for alignment # non-space whitespace (likes tabs) must be kept for alignment
caretspace = ((c.isspace() and c or ' ') for c in caretspace) caretspace = ((c.isspace() and c or ' ') for c in caretspace)
# only three spaces to account for offset1 == pos 0 lines.append(' %s^\n' % ''.join(caretspace))
lines.append(' %s^\n' % ''.join(caretspace))
value = msg value = msg
lines.append(_format_final_exc_line(stype, value)) lines.append(_format_final_exc_line(stype, value))

View File

@ -9,6 +9,9 @@ What's New in Python 2.7.7?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #17825: Cursor "^" is correctly positioned for SyntaxError and
IndentationError.
- Issue #19081: When a zipimport .zip file in sys.path being imported from - Issue #19081: When a zipimport .zip file in sys.path being imported from
is modified during the lifetime of the Python process after zipimport has is modified during the lifetime of the Python process after zipimport has
already cached the zip's table of contents we detect this and recover already cached the zip's table of contents we detect this and recover