mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
SF patch #1007189, multi-line imports, for instance:
"from blah import (foo, bar baz, bongo)"
This commit is contained in:
parent
876032e570
commit
1a4ddaecc7
14 changed files with 1394 additions and 1181 deletions
|
@ -839,6 +839,7 @@ VALIDATER(expr_stmt); VALIDATER(power);
|
|||
VALIDATER(print_stmt); VALIDATER(del_stmt);
|
||||
VALIDATER(return_stmt); VALIDATER(list_iter);
|
||||
VALIDATER(raise_stmt); VALIDATER(import_stmt);
|
||||
VALIDATER(import_name); VALIDATER(import_from);
|
||||
VALIDATER(global_stmt); VALIDATER(list_if);
|
||||
VALIDATER(assert_stmt); VALIDATER(list_for);
|
||||
VALIDATER(exec_stmt); VALIDATER(compound_stmt);
|
||||
|
@ -1714,55 +1715,100 @@ validate_dotted_as_name(node *tree)
|
|||
}
|
||||
|
||||
|
||||
/* import_stmt:
|
||||
*
|
||||
* 'import' dotted_as_name (',' dotted_as_name)*
|
||||
* | 'from' dotted_name 'import' ('*' | import_as_name (',' import_as_name)*)
|
||||
/* dotted_as_name (',' dotted_as_name)* */
|
||||
static int
|
||||
validate_dotted_as_names(node *tree)
|
||||
{
|
||||
int nch = NCH(tree);
|
||||
int res = is_odd(nch) && validate_dotted_as_name(CHILD(tree, 0));
|
||||
int i;
|
||||
|
||||
for (i = 1; res && (i < nch); i += 2)
|
||||
res = (validate_comma(CHILD(tree, i))
|
||||
&& validate_dotted_as_name(CHILD(tree, i + 1)));
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
/* import_as_name (',' import_as_name)* [','] */
|
||||
static int
|
||||
validate_import_as_names(node *tree)
|
||||
{
|
||||
int nch = NCH(tree);
|
||||
int res = validate_import_as_name(CHILD(tree, 0));
|
||||
int i;
|
||||
|
||||
for (i = 1; res && (i + 1 < nch); i += 2)
|
||||
res = (validate_comma(CHILD(tree, i))
|
||||
&& validate_import_as_name(CHILD(tree, i + 1)));
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
/* 'import' dotted_as_names */
|
||||
static int
|
||||
validate_import_name(node *tree)
|
||||
{
|
||||
return (validate_ntype(tree, import_name)
|
||||
&& validate_numnodes(tree, 2, "import_name")
|
||||
&& validate_name(CHILD(tree, 0), "import")
|
||||
&& validate_dotted_as_names(CHILD(tree, 1)));
|
||||
}
|
||||
|
||||
|
||||
/* 'from' dotted_name 'import' ('*' | '(' import_as_names ')' |
|
||||
* import_as_names
|
||||
*/
|
||||
static int
|
||||
validate_import_from(node *tree)
|
||||
{
|
||||
int nch = NCH(tree);
|
||||
int res = validate_ntype(tree, import_from)
|
||||
&& (nch >= 4)
|
||||
&& validate_name(CHILD(tree, 0), "from")
|
||||
&& validate_dotted_name(CHILD(tree, 1))
|
||||
&& validate_name(CHILD(tree, 2), "import");
|
||||
|
||||
if (res && TYPE(CHILD(tree, 3)) == LPAR)
|
||||
res = ((nch == 6)
|
||||
&& validate_lparen(CHILD(tree, 3))
|
||||
&& validate_import_as_names(CHILD(tree, 4))
|
||||
&& validate_rparen(CHILD(tree, 5)));
|
||||
else if (res && TYPE(CHILD(tree, 3)) != STAR)
|
||||
res = validate_import_as_names(CHILD(tree, 3));
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
/* import_stmt: import_name | import_from */
|
||||
static int
|
||||
validate_import_stmt(node *tree)
|
||||
{
|
||||
int nch = NCH(tree);
|
||||
int res = (validate_ntype(tree, import_stmt)
|
||||
&& (nch >= 2) && is_even(nch)
|
||||
&& validate_ntype(CHILD(tree, 0), NAME));
|
||||
int res = validate_numnodes(tree, 1, "import_stmt");
|
||||
|
||||
if (res && (strcmp(STR(CHILD(tree, 0)), "import") == 0)) {
|
||||
int j;
|
||||
if (res) {
|
||||
int ntype = TYPE(CHILD(tree, 0));
|
||||
|
||||
res = validate_dotted_as_name(CHILD(tree, 1));
|
||||
for (j = 2; res && (j < nch); j += 2)
|
||||
res = (validate_comma(CHILD(tree, j))
|
||||
&& validate_dotted_as_name(CHILD(tree, j + 1)));
|
||||
}
|
||||
else if (res && (res = validate_name(CHILD(tree, 0), "from"))) {
|
||||
res = ((nch >= 4) && is_even(nch)
|
||||
&& validate_dotted_name(CHILD(tree, 1))
|
||||
&& validate_name(CHILD(tree, 2), "import"));
|
||||
if (nch == 4) {
|
||||
if (TYPE(CHILD(tree, 3)) == import_as_name)
|
||||
res = validate_import_as_name(CHILD(tree, 3));
|
||||
else
|
||||
res = validate_star(CHILD(tree, 3));
|
||||
}
|
||||
if (ntype == import_name || ntype == import_from)
|
||||
res = validate_node(CHILD(tree, 0));
|
||||
else {
|
||||
/* 'from' dotted_name 'import' import_as_name
|
||||
* (',' import_as_name)+
|
||||
*/
|
||||
int j;
|
||||
res = validate_import_as_name(CHILD(tree, 3));
|
||||
for (j = 4; res && (j < nch); j += 2)
|
||||
res = (validate_comma(CHILD(tree, j))
|
||||
&& validate_import_as_name(CHILD(tree, j + 1)));
|
||||
res = 0;
|
||||
err_string("illegal import_stmt child type");
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (nch == 1) {
|
||||
res = 0;
|
||||
|
||||
PyErr_Format(parser_error,
|
||||
"Unrecognized child node of import_stmt: %d.",
|
||||
TYPE(CHILD(tree, 0)));
|
||||
}
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int
|
||||
validate_global_stmt(node *tree)
|
||||
{
|
||||
|
@ -2823,6 +2869,12 @@ validate_node(node *tree)
|
|||
case import_stmt:
|
||||
res = validate_import_stmt(tree);
|
||||
break;
|
||||
case import_name:
|
||||
res = validate_import_name(tree);
|
||||
break;
|
||||
case import_from:
|
||||
res = validate_import_from(tree);
|
||||
break;
|
||||
case global_stmt:
|
||||
res = validate_global_stmt(tree);
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue