summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
authorTomas R <tomas.roun8@gmail.com>2023-10-31 21:02:42 (GMT)
committerGitHub <noreply@github.com>2023-10-31 21:02:42 (GMT)
commit453e96e3020d38cfcaebf82b24cb681c6384fa82 (patch)
treeb6b2cd480808d77e219d6aec46d9a6e055720b4b /Parser
parentfaa5f6053d7334a3ecc513c64947ac026439c03a (diff)
downloadcpython-453e96e3020d38cfcaebf82b24cb681c6384fa82.zip
cpython-453e96e3020d38cfcaebf82b24cb681c6384fa82.tar.gz
cpython-453e96e3020d38cfcaebf82b24cb681c6384fa82.tar.bz2
gh-111420: Allow type comments in parenthesized `with` statements (#111468)
Diffstat (limited to 'Parser')
-rw-r--r--Parser/parser.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/Parser/parser.c b/Parser/parser.c
index f367cf9..ca8e9d0 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -6483,7 +6483,7 @@ for_stmt_rule(Parser *p)
// with_stmt:
// | invalid_with_stmt_indent
-// | 'with' '(' ','.with_item+ ','? ')' ':' block
+// | 'with' '(' ','.with_item+ ','? ')' ':' TYPE_COMMENT? block
// | 'with' ','.with_item+ ':' TYPE_COMMENT? block
// | 'async' 'with' '(' ','.with_item+ ','? ')' ':' block
// | 'async' 'with' ','.with_item+ ':' TYPE_COMMENT? block
@@ -6528,12 +6528,12 @@ with_stmt_rule(Parser *p)
D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ',
p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_with_stmt_indent"));
}
- { // 'with' '(' ','.with_item+ ','? ')' ':' block
+ { // 'with' '(' ','.with_item+ ','? ')' ':' TYPE_COMMENT? block
if (p->error_indicator) {
p->level--;
return NULL;
}
- D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block"));
+ D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' TYPE_COMMENT? block"));
Token * _keyword;
Token * _literal;
Token * _literal_1;
@@ -6542,6 +6542,7 @@ with_stmt_rule(Parser *p)
UNUSED(_opt_var); // Silence compiler warnings
asdl_withitem_seq* a;
asdl_stmt_seq* b;
+ void *tc;
if (
(_keyword = _PyPegen_expect_token(p, 629)) // token='with'
&&
@@ -6555,10 +6556,12 @@ with_stmt_rule(Parser *p)
&&
(_literal_2 = _PyPegen_expect_token(p, 11)) // token=':'
&&
+ (tc = _PyPegen_expect_token(p, TYPE_COMMENT), !p->error_indicator) // TYPE_COMMENT?
+ &&
(b = block_rule(p)) // block
)
{
- D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block"));
+ D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' TYPE_COMMENT? block"));
Token *_token = _PyPegen_get_last_nonnwhitespace_token(p);
if (_token == NULL) {
p->level--;
@@ -6568,7 +6571,7 @@ with_stmt_rule(Parser *p)
UNUSED(_end_lineno); // Only used by EXTRA macro
int _end_col_offset = _token->end_col_offset;
UNUSED(_end_col_offset); // Only used by EXTRA macro
- _res = CHECK_VERSION ( stmt_ty , 9 , "Parenthesized context managers are" , _PyAST_With ( a , b , NULL , EXTRA ) );
+ _res = CHECK_VERSION ( stmt_ty , 9 , "Parenthesized context managers are" , _PyAST_With ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) );
if (_res == NULL && PyErr_Occurred()) {
p->error_indicator = 1;
p->level--;
@@ -6578,7 +6581,7 @@ with_stmt_rule(Parser *p)
}
p->mark = _mark;
D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ',
- p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block"));
+ p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' TYPE_COMMENT? block"));
}
{ // 'with' ','.with_item+ ':' TYPE_COMMENT? block
if (p->error_indicator) {