Skip to content

Commit 72da3a8

Browse files
williamwen42aisk
authored andcommitted
gh-106922: Support multi-line error locations in traceback (attempt 2) (#112097)
1 parent b6200d4 commit 72da3a8

File tree

9 files changed

+709
-127
lines changed

9 files changed

+709
-127
lines changed

Doc/library/traceback.rst

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -523,36 +523,41 @@ The output for the example would look similar to this:
523523
*** print_tb:
524524
File "<doctest...>", line 10, in <module>
525525
lumberjack()
526+
~~~~~~~~~~^^
526527
*** print_exception:
527528
Traceback (most recent call last):
528529
File "<doctest...>", line 10, in <module>
529530
lumberjack()
531+
~~~~~~~~~~^^
530532
File "<doctest...>", line 4, in lumberjack
531533
bright_side_of_life()
534+
~~~~~~~~~~~~~~~~~~~^^
532535
IndexError: tuple index out of range
533536
*** print_exc:
534537
Traceback (most recent call last):
535538
File "<doctest...>", line 10, in <module>
536539
lumberjack()
540+
~~~~~~~~~~^^
537541
File "<doctest...>", line 4, in lumberjack
538542
bright_side_of_life()
543+
~~~~~~~~~~~~~~~~~~~^^
539544
IndexError: tuple index out of range
540545
*** format_exc, first and last line:
541546
Traceback (most recent call last):
542547
IndexError: tuple index out of range
543548
*** format_exception:
544549
['Traceback (most recent call last):\n',
545-
' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n',
546-
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n',
550+
' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
551+
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
547552
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n',
548553
'IndexError: tuple index out of range\n']
549554
*** extract_tb:
550555
[<FrameSummary file <doctest...>, line 10 in <module>>,
551556
<FrameSummary file <doctest...>, line 4 in lumberjack>,
552557
<FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
553558
*** format_tb:
554-
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n',
555-
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n',
559+
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
560+
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
556561
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n']
557562
*** tb_lineno: 10
558563

Lib/test/test_doctest.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2922,6 +2922,9 @@ def test_unicode(): """
29222922
Traceback (most recent call last):
29232923
File ...
29242924
exec(compile(example.source, filename, "single",
2925+
~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2926+
compileflags, True), test.globs)
2927+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
29252928
File "<doctest foo-bär@baz[0]>", line 1, in <module>
29262929
raise Exception('clé')
29272930
Exception: clé

Lib/test/test_exceptions.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2080,14 +2080,15 @@ def test_multiline_not_highlighted(self):
20802080
""",
20812081
[
20822082
' 1 < 2 and',
2083+
' 3 > 4',
20832084
'AssertionError',
20842085
],
20852086
),
20862087
]
20872088
for source, expected in cases:
20882089
with self.subTest(source):
20892090
result = self.write_source(source)
2090-
self.assertEqual(result[-2:], expected)
2091+
self.assertEqual(result[-len(expected):], expected)
20912092

20922093

20932094
class SyntaxErrorTests(unittest.TestCase):

Lib/test/test_repl.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,11 @@ def foo(x):
161161
output = kill_python(p)
162162
self.assertEqual(p.returncode, 0)
163163

164-
traceback_lines = output.splitlines()[-7:-1]
164+
traceback_lines = output.splitlines()[-8:-1]
165165
expected_lines = [
166166
' File "<stdin>", line 1, in <module>',
167167
' foo(0)',
168+
' ~~~^^^',
168169
' File "<stdin>", line 2, in foo',
169170
' 1 / x',
170171
' ~~^~~',

Lib/test/test_sys.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,17 +1115,19 @@ def check(tracebacklimit, expected):
11151115
b'Traceback (most recent call last):',
11161116
b' File "<string>", line 8, in <module>',
11171117
b' f2()',
1118+
b' ~~^^',
11181119
b' File "<string>", line 6, in f2',
11191120
b' f1()',
1121+
b' ~~^^',
11201122
b' File "<string>", line 4, in f1',
11211123
b' 1 / 0',
11221124
b' ~~^~~',
11231125
b'ZeroDivisionError: division by zero'
11241126
]
11251127
check(10, traceback)
11261128
check(3, traceback)
1127-
check(2, traceback[:1] + traceback[3:])
1128-
check(1, traceback[:1] + traceback[5:])
1129+
check(2, traceback[:1] + traceback[4:])
1130+
check(1, traceback[:1] + traceback[7:])
11291131
check(0, [traceback[-1]])
11301132
check(-1, [traceback[-1]])
11311133
check(1<<1000, traceback)

0 commit comments

Comments
 (0)