]> granicus.if.org Git - python/commitdiff
Issue #17825: Cursor ^ is correctly positioned for SyntaxError and IndentationError.
authorFlorent Xicluna <florent.xicluna@gmail.com>
Wed, 22 Jan 2014 00:33:59 +0000 (01:33 +0100)
committerFlorent Xicluna <florent.xicluna@gmail.com>
Wed, 22 Jan 2014 00:33:59 +0000 (01:33 +0100)
Lib/test/test_traceback.py
Lib/traceback.py
Misc/NEWS

index 8076be8a785fb0d8d5145b1fae304b71caa5159f..d7b183a09523af891acfdde11f9d9caba28e5c37 100644 (file)
@@ -35,6 +35,9 @@ class TracebackCases(unittest.TestCase):
     def syntax_error_bad_indentation(self):
         compile("def spam():\n  print 1\n print 2", "?", "exec")
 
+    def syntax_error_bad_indentation2(self):
+        compile(" print(2)", "?", "exec")
+
     def test_caret(self):
         err = self.get_exception_format(self.syntax_error_with_caret,
                                         SyntaxError)
@@ -111,6 +114,13 @@ def test():
                 os.unlink(os.path.join(testdir, f))
             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):
         # Test that exceptions derived from BaseException are formatted right
         e = KeyboardInterrupt()
index 5ad2838fcfa5fcd2d8cbb6ff4c07b5c8d30cf92c..0a3dd11df68d5e0f302a5fd09f9e0acfad4a9bfa 100644 (file)
@@ -189,11 +189,12 @@ def format_exception_only(etype, value):
         if badline is not None:
             lines.append('    %s\n' % badline.strip())
             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
                 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
 
     lines.append(_format_final_exc_line(stype, value))
index 26bd48543e266a2f707ad3dc44b7d67ea61dcb50..35846b5a0a80818157357bcb67cf92167b9e88d9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -9,6 +9,9 @@ What's New in Python 2.7.7?
 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
   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