Commit d57f26c7 authored by Sanyam Khurana's avatar Sanyam Khurana Committed by Nick Coghlan

bpo-32028: Fix suggestions for indented print statements (GH-4688)

The suggested replacement for print statements previously failed to account
for leading whitespace and hence could end up including unwanted text in
the proposed call to the print builtin.

Patch by Sanyam Khurana.
parent 6690bb9f
......@@ -156,6 +156,15 @@ class TestPy2MigrationHint(unittest.TestCase):
self.assertIn('print("Hello World", end=" ")', str(context.exception))
def test_string_with_leading_whitespace(self):
python2_print_str = '''if 1:
print "Hello World"
'''
with self.assertRaises(SyntaxError) as context:
exec(python2_print_str)
self.assertIn('print("Hello World")', str(context.exception))
def test_stream_redirection_hint_for_py2_migration(self):
# Test correct hint produced for Py2 redirection syntax
with self.assertRaises(TypeError) as context:
......
Leading whitespace is now correctly ignored when generating suggestions
for converting Py2 print statements to Py3 builtin print function calls.
Patch by Sanyam Khurana.
......@@ -2846,17 +2846,23 @@ _set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start)
// PRINT_OFFSET is to remove `print ` word from the data.
const int PRINT_OFFSET = 6;
Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
PyObject *data = PyUnicode_Substring(self->text, PRINT_OFFSET, text_len);
const int STRIP_BOTH = 2;
// Issue 32028: Handle case when whitespace is used with print call
PyObject *initial_data = _PyUnicode_XStrip(self->text, STRIP_BOTH, strip_sep_obj);
if (initial_data == NULL) {
Py_DECREF(strip_sep_obj);
return -1;
}
Py_ssize_t text_len = PyUnicode_GET_LENGTH(initial_data);
PyObject *data = PyUnicode_Substring(initial_data, PRINT_OFFSET, text_len);
Py_DECREF(initial_data);
if (data == NULL) {
Py_DECREF(strip_sep_obj);
return -1;
}
PyObject *new_data = _PyUnicode_XStrip(data, 2, strip_sep_obj);
PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj);
Py_DECREF(data);
Py_DECREF(strip_sep_obj);
if (new_data == NULL) {
return -1;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment