check("(1+)", 1, 4)
check("[interesting\nfoo()\n", 1, 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
check('x = [(yield i) for i in range(3)]', 1, 7)
--- /dev/null
+Fix the line number of tokenizer errors inside f-strings. Patch by Pablo
+Galindo.
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;
- token->lineno = p->starting_lineno + lineno;
- token->col_offset = p->tok->lineno == 1 ? p->starting_col_offset + col_offset : col_offset;
- token->end_lineno = p->starting_lineno + end_lineno;
- token->end_col_offset = p->tok->lineno == 1 ? p->starting_col_offset + end_col_offset : end_col_offset;
+ token->lineno = lineno;
+ token->col_offset = p->tok->lineno == p->starting_lineno ? p->starting_col_offset + col_offset : col_offset;
+ token->end_lineno = end_lineno;
+ token->end_col_offset = p->tok->lineno == p->starting_lineno ? p->starting_col_offset + end_col_offset : end_col_offset;
p->fill += 1;
return NULL;
}
Py_INCREF(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,
NULL, p->arena);
- p2->starting_lineno = t->lineno + lines - 1;
+
+ p2->starting_lineno = t->lineno + lines;
p2->starting_col_offset = t->col_offset + cols;
expr = _PyPegen_run_parser(p2);