]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-104741: Add line number attribute to indentation error exception (#104743)
authorMarta Gómez Macías <mgmacias@google.com>
Mon, 22 May 2023 11:30:18 +0000 (13:30 +0200)
committerGitHub <noreply@github.com>
Mon, 22 May 2023 11:30:18 +0000 (11:30 +0000)
Lib/test/test_tabnanny.py
Lib/test/test_tokenize.py
Python/Python-tokenize.c

index dac47318011d9dd4191edf4b742242127719255b..aa700118f735d904113d5ff498f80ee9b7866c0c 100644 (file)
@@ -317,7 +317,7 @@ class TestCommandLine(TestCase):
         with TemporaryPyFile(SOURCE_CODES["wrong_indented"]) as file_path:
             stderr  = f"{file_path!r}: Token Error: "
             stderr += ('unindent does not match any outer indentation level'
-                    ' (<tokenize>, line 3)')
+                       ' (<string>, line 3)')
             self.validate_cmd(file_path, stderr=stderr, expect_failure=True)
 
     def test_with_error_free_file(self):
index dda7243bfa19fe4bb36abf23543d05cc12fbbc5c..8e7ab3d4b7b57832dc5c7e1cb2870b389b548967 100644 (file)
@@ -92,9 +92,18 @@ def k(x):
         readline = BytesIO(indent_error_file).readline
         with self.assertRaisesRegex(IndentationError,
                                     "unindent does not match any "
-                                    "outer indentation level"):
+                                    "outer indentation level") as e:
             for tok in tokenize(readline):
                 pass
+        self.assertEqual(e.exception.lineno, 3)
+        self.assertEqual(e.exception.filename, '<string>')
+        self.assertEqual(e.exception.end_lineno, None)
+        self.assertEqual(e.exception.end_offset, None)
+        self.assertEqual(
+            e.exception.msg,
+            'unindent does not match any outer indentation level')
+        self.assertEqual(e.exception.offset, 9)
+        self.assertEqual(e.exception.text, '  x += 5\n')
 
     def test_int(self):
         # Ordinary integers and binary operators
index 43b44be94583ee0bd6d7d466ec15a554d4f254c8..f7e32d3af9a9f7796348f97cf827d23f0eb31650 100644 (file)
@@ -89,11 +89,9 @@ _tokenizer_error(struct tok_state *tok)
             }
             return -1;
         case E_DEDENT:
-            PyErr_Format(PyExc_IndentationError,
-                        "unindent does not match any outer indentation level "
-                        "(<tokenize>, line %d)",
-                        tok->lineno);
-            return -1;
+            msg = "unindent does not match any outer indentation level";
+            errtype = PyExc_IndentationError;
+            break;
         case E_INTR:
             if (!PyErr_Occurred()) {
                 PyErr_SetNone(PyExc_KeyboardInterrupt);
@@ -131,7 +129,12 @@ _tokenizer_error(struct tok_state *tok)
         goto exit;
     }
 
-    tmp = Py_BuildValue("(OnnOii)", tok->filename, tok->lineno, 0, error_line, 0, 0);
+    Py_ssize_t offset = _PyPegen_byte_offset_to_character_offset(error_line, tok->inp - tok->buf);
+    if (offset == -1) {
+        result = -1;
+        goto exit;
+    }
+    tmp = Py_BuildValue("(OnnOOO)", tok->filename, tok->lineno, offset, error_line, Py_None, Py_None);
     if (!tmp) {
         result = -1;
         goto exit;