mirror of https://github.com/python/cpython
bpo-46237: Fix the line number of tokenizer errors inside f-strings (GH-30463)
This commit is contained in:
parent
d81182b8ec
commit
6fa8b2ceee
|
@ -268,6 +268,18 @@ class ExceptionTests(unittest.TestCase):
|
||||||
check("(1+)", 1, 4)
|
check("(1+)", 1, 4)
|
||||||
check("[interesting\nfoo()\n", 1, 1)
|
check("[interesting\nfoo()\n", 1, 1)
|
||||||
check(b"\xef\xbb\xbf#coding: utf8\nprint('\xe6\x88\x91')\n", 0, -1)
|
check(b"\xef\xbb\xbf#coding: utf8\nprint('\xe6\x88\x91')\n", 0, -1)
|
||||||
|
check("""f'''
|
||||||
|
{
|
||||||
|
(123_a)
|
||||||
|
}'''""", 3, 17)
|
||||||
|
check("""f'''
|
||||||
|
{
|
||||||
|
f\"\"\"
|
||||||
|
{
|
||||||
|
(123_a)
|
||||||
|
}
|
||||||
|
\"\"\"
|
||||||
|
}'''""", 5, 17)
|
||||||
|
|
||||||
# Errors thrown by symtable.c
|
# Errors thrown by symtable.c
|
||||||
check('x = [(yield i) for i in range(3)]', 1, 7)
|
check('x = [(yield i) for i in range(3)]', 1, 7)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix the line number of tokenizer errors inside f-strings. Patch by Pablo
|
||||||
|
Galindo.
|
|
@ -179,10 +179,10 @@ initialize_token(Parser *p, Token *token, const char *start, const char *end, in
|
||||||
int col_offset = (start != NULL && start >= line_start) ? (int)(start - line_start) : -1;
|
int col_offset = (start != NULL && start >= line_start) ? (int)(start - line_start) : -1;
|
||||||
int end_col_offset = (end != NULL && end >= p->tok->line_start) ? (int)(end - p->tok->line_start) : -1;
|
int end_col_offset = (end != NULL && end >= p->tok->line_start) ? (int)(end - p->tok->line_start) : -1;
|
||||||
|
|
||||||
token->lineno = p->starting_lineno + lineno;
|
token->lineno = lineno;
|
||||||
token->col_offset = p->tok->lineno == 1 ? p->starting_col_offset + col_offset : col_offset;
|
token->col_offset = p->tok->lineno == p->starting_lineno ? p->starting_col_offset + col_offset : col_offset;
|
||||||
token->end_lineno = p->starting_lineno + end_lineno;
|
token->end_lineno = end_lineno;
|
||||||
token->end_col_offset = p->tok->lineno == 1 ? p->starting_col_offset + end_col_offset : end_col_offset;
|
token->end_col_offset = p->tok->lineno == p->starting_lineno ? p->starting_col_offset + end_col_offset : end_col_offset;
|
||||||
|
|
||||||
p->fill += 1;
|
p->fill += 1;
|
||||||
|
|
||||||
|
|
|
@ -392,11 +392,14 @@ fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
Py_INCREF(p->tok->filename);
|
Py_INCREF(p->tok->filename);
|
||||||
|
|
||||||
tok->filename = p->tok->filename;
|
tok->filename = p->tok->filename;
|
||||||
|
tok->lineno = t->lineno + lines - 1;
|
||||||
|
|
||||||
Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version,
|
Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version,
|
||||||
NULL, p->arena);
|
NULL, p->arena);
|
||||||
p2->starting_lineno = t->lineno + lines - 1;
|
|
||||||
|
p2->starting_lineno = t->lineno + lines;
|
||||||
p2->starting_col_offset = t->col_offset + cols;
|
p2->starting_col_offset = t->col_offset + cols;
|
||||||
|
|
||||||
expr = _PyPegen_run_parser(p2);
|
expr = _PyPegen_run_parser(p2);
|
||||||
|
|
Loading…
Reference in New Issue