mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-142236: Fix incorrect keyword suggestions for syntax errors (#142328)
The keyword typo suggestion mechanism in traceback would incorrectly suggest replacements when the extracted source code was merely incomplete rather than containing an actual typo. For example, when a missing comma caused a syntax error, the system would suggest replacing 'print' with 'not' because the incomplete code snippet happened to pass validation. The fix adds a validation step that first checks whether the original extracted code raises a SyntaxError. If the code compiles successfully or is simply incomplete (compile_command returns None), the function returns early since there is no way to verify that a keyword replacement would actually fix the problem.
This commit is contained in:
parent
07eff899d8
commit
ed4f78a4b3
3 changed files with 30 additions and 0 deletions
|
|
@ -1784,6 +1784,23 @@ def test_keyword_suggestions_from_command_string(self):
|
|||
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(
|
||||
|
|
|
|||
|
|
@ -1340,6 +1340,15 @@ def _find_keyword_typos(self):
|
|||
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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue