bpo-40334: Reproduce error message for type comments on bare '*' in the new parser (GH-20151)
This commit is contained in:
parent
d71a6492db
commit
75b863aa97
|
@ -661,6 +661,7 @@ invalid_parameters:
|
||||||
RAISE_SYNTAX_ERROR("non-default argument follows default argument") }
|
RAISE_SYNTAX_ERROR("non-default argument follows default argument") }
|
||||||
invalid_star_etc:
|
invalid_star_etc:
|
||||||
| '*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") }
|
| '*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") }
|
||||||
|
| '*' ',' TYPE_COMMENT { RAISE_SYNTAX_ERROR("bare * has associated type comment") }
|
||||||
invalid_lambda_star_etc:
|
invalid_lambda_star_etc:
|
||||||
| '*' (':' | ',' (':' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") }
|
| '*' (':' | ',' (':' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") }
|
||||||
invalid_double_type_comments:
|
invalid_double_type_comments:
|
||||||
|
|
|
@ -178,6 +178,16 @@ SyntaxError: invalid syntax
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
SyntaxError: invalid syntax
|
SyntaxError: invalid syntax
|
||||||
|
|
||||||
|
>>> import ast; ast.parse('''
|
||||||
|
... def f(
|
||||||
|
... *, # type: int
|
||||||
|
... a, # type: int
|
||||||
|
... ):
|
||||||
|
... pass
|
||||||
|
... ''', type_comments=True)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
SyntaxError: bare * has associated type comment
|
||||||
|
|
||||||
|
|
||||||
From ast_for_funcdef():
|
From ast_for_funcdef():
|
||||||
|
|
||||||
|
|
|
@ -12041,7 +12041,7 @@ invalid_parameters_rule(Parser *p)
|
||||||
return _res;
|
return _res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// invalid_star_etc: '*' (')' | ',' (')' | '**'))
|
// invalid_star_etc: '*' (')' | ',' (')' | '**')) | '*' ',' TYPE_COMMENT
|
||||||
static void *
|
static void *
|
||||||
invalid_star_etc_rule(Parser *p)
|
invalid_star_etc_rule(Parser *p)
|
||||||
{
|
{
|
||||||
|
@ -12071,6 +12071,27 @@ invalid_star_etc_rule(Parser *p)
|
||||||
}
|
}
|
||||||
p->mark = _mark;
|
p->mark = _mark;
|
||||||
}
|
}
|
||||||
|
{ // '*' ',' TYPE_COMMENT
|
||||||
|
Token * _literal;
|
||||||
|
Token * _literal_1;
|
||||||
|
Token * type_comment_var;
|
||||||
|
if (
|
||||||
|
(_literal = _PyPegen_expect_token(p, 16)) // token='*'
|
||||||
|
&&
|
||||||
|
(_literal_1 = _PyPegen_expect_token(p, 12)) // token=','
|
||||||
|
&&
|
||||||
|
(type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT'
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_res = RAISE_SYNTAX_ERROR ( "bare * has associated type comment" );
|
||||||
|
if (_res == NULL && PyErr_Occurred()) {
|
||||||
|
p->error_indicator = 1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
p->mark = _mark;
|
||||||
|
}
|
||||||
_res = NULL;
|
_res = NULL;
|
||||||
done:
|
done:
|
||||||
return _res;
|
return _res;
|
||||||
|
|
|
@ -431,25 +431,6 @@ error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) {
|
|
||||||
int kwarg_unpacking = 0;
|
|
||||||
for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) {
|
|
||||||
keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i);
|
|
||||||
if (!keyword->arg) {
|
|
||||||
kwarg_unpacking = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *msg = NULL;
|
|
||||||
if (kwarg_unpacking) {
|
|
||||||
msg = "positional argument follows keyword argument unpacking";
|
|
||||||
} else {
|
|
||||||
msg = "positional argument follows keyword argument";
|
|
||||||
}
|
|
||||||
|
|
||||||
return RAISE_SYNTAX_ERROR(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static const char *
|
static const char *
|
||||||
token_name(int type)
|
token_name(int type)
|
||||||
|
@ -2100,3 +2081,22 @@ _PyPegen_get_invalid_target(expr_ty e)
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) {
|
||||||
|
int kwarg_unpacking = 0;
|
||||||
|
for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) {
|
||||||
|
keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i);
|
||||||
|
if (!keyword->arg) {
|
||||||
|
kwarg_unpacking = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *msg = NULL;
|
||||||
|
if (kwarg_unpacking) {
|
||||||
|
msg = "positional argument follows keyword argument unpacking";
|
||||||
|
} else {
|
||||||
|
msg = "positional argument follows keyword argument";
|
||||||
|
}
|
||||||
|
|
||||||
|
return RAISE_SYNTAX_ERROR(msg);
|
||||||
|
}
|
||||||
|
|
|
@ -256,13 +256,13 @@ asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *);
|
||||||
asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *);
|
asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *);
|
||||||
expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *);
|
expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *);
|
||||||
asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *);
|
asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *);
|
||||||
void *_PyPegen_arguments_parsing_error(Parser *, expr_ty);
|
|
||||||
int _PyPegen_check_barry_as_flufl(Parser *);
|
int _PyPegen_check_barry_as_flufl(Parser *);
|
||||||
mod_ty _PyPegen_make_module(Parser *, asdl_seq *);
|
mod_ty _PyPegen_make_module(Parser *, asdl_seq *);
|
||||||
|
|
||||||
// Error reporting helpers
|
// Error reporting helpers
|
||||||
|
|
||||||
expr_ty _PyPegen_get_invalid_target(expr_ty e);
|
expr_ty _PyPegen_get_invalid_target(expr_ty e);
|
||||||
|
void *_PyPegen_arguments_parsing_error(Parser *, expr_ty);
|
||||||
|
|
||||||
|
|
||||||
void *_PyPegen_parse(Parser *);
|
void *_PyPegen_parse(Parser *);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue