stderr_text = stderr.decode('utf-8')
self.assertIn(f"Did you mean '{expected_kw}'", stderr_text)
+ def test_no_keyword_suggestion_for_comma_errors(self):
+ # When the parser identifies a missing comma, don't suggest
+ # bogus keyword replacements like 'print' -> 'not'
+ code = '''\
+import sys
+print(
+ "line1"
+ "line2"
+ file=sys.stderr
+)
+'''
+ source = textwrap.dedent(code).strip()
+ rc, stdout, stderr = assert_python_failure('-c', source)
+ stderr_text = stderr.decode('utf-8')
+ self.assertIn("Perhaps you forgot a comma", stderr_text)
+ self.assertNotIn("Did you mean", stderr_text)
+
@requires_debug_ranges()
@force_not_colorized_test_class
class PurePythonTracebackErrorCaretTests(
if len(error_code) > 1024:
return
+ # If the original code doesn't raise SyntaxError, we can't validate
+ # that a keyword replacement actually fixes anything
+ try:
+ codeop.compile_command(error_code, symbol="exec", flags=codeop.PyCF_ONLY_AST)
+ except SyntaxError:
+ pass # Good - the original code has a syntax error we might fix
+ else:
+ return # Original code compiles or is incomplete - can't validate fixes
+
error_lines = error_code.splitlines()
tokens = tokenize.generate_tokens(io.StringIO(error_code).readline)
tokens_left_to_process = 10
--- /dev/null
+Fix incorrect keyword suggestions for syntax errors in :mod:`traceback`. The
+keyword typo suggestion mechanism would incorrectly suggest replacements when
+the extracted source code was incomplete rather than containing an actual typo.
+Patch by Pablo Galindo.