diff -r 927afb7bca2a -r c76e42112584 Parser/Python.asdl --- a/Parser/Python.asdl Sat Jan 05 21:20:29 2013 +0100 +++ b/Parser/Python.asdl Sun Jan 06 21:28:18 2013 +0100 @@ -106,8 +106,11 @@ arguments = (arg* args, identifier? vararg, expr? varargannotation, arg* kwonlyargs, identifier? kwarg, expr? kwargannotation, expr* defaults, - expr* kw_defaults) - arg = (identifier arg, expr? annotation) + expr* kw_defaults, + int? vararg_lineno, int? vararg_col_offset, + int? kwarg_lineno, int? kwarg_col_offset) + arg = (identifier arg, expr? annotation, + int? lineno, int? col_offset) -- keyword arguments supplied to call keyword = (identifier arg, expr value) diff -r 927afb7bca2a -r c76e42112584 Python/ast.c --- a/Python/ast.c Sat Jan 05 21:20:29 2013 +0100 +++ b/Python/ast.c Sun Jan 06 21:28:18 2013 +0100 @@ -1138,7 +1138,7 @@ return NULL; } - return arg(name, annotation, c->c_arena); + return arg(name, annotation, n->n_lineno, n->n_col_offset, c->c_arena); } /* returns -1 if failed to handle keyword only arguments @@ -1193,7 +1193,7 @@ goto error; if (forbidden_name(c, argname, ch, 0)) goto error; - arg = arg(argname, annotation, c->c_arena); + arg = arg(argname, annotation, ch->n_lineno, ch->n_col_offset, c->c_arena); if (!arg) goto error; asdl_seq_SET(kwonlyargs, j++, arg); @@ -1232,6 +1232,7 @@ vfpdef: NAME */ int i, j, k, nposargs = 0, nkwonlyargs = 0; + int vararg_lineno = 0, vararg_col_offset = 0, kwarg_lineno = 0, kwarg_col_offset = 0; int nposdefaults = 0, found_default = 0; asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults; identifier vararg = NULL, kwarg = NULL; @@ -1242,7 +1243,8 @@ if (TYPE(n) == parameters) { if (NCH(n) == 2) /* () as argument list */ return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, c->c_arena); + NULL, vararg_lineno, vararg_col_offset, + kwarg_lineno, kwarg_col_offset, c->c_arena); n = CHILD(n, 1); } assert(TYPE(n) == typedargslist || TYPE(n) == varargslist); @@ -1351,6 +1353,8 @@ vararg = NEW_IDENTIFIER(CHILD(ch, 0)); if (!vararg) return NULL; + vararg_lineno = CHILD(ch, 0)->n_lineno; + vararg_col_offset = CHILD(ch, 0)->n_col_offset; if (forbidden_name(c, vararg, CHILD(ch, 0), 0)) return NULL; if (NCH(ch) > 1) { @@ -1376,6 +1380,8 @@ kwarg = NEW_IDENTIFIER(CHILD(ch, 0)); if (!kwarg) return NULL; + kwarg_lineno = CHILD(ch, 0)->n_lineno; + kwarg_col_offset = CHILD(ch, 0)->n_col_offset; if (NCH(ch) > 1) { /* there is an annotation on the kwarg */ kwargannotation = ast_for_expr(c, CHILD(ch, 2)); @@ -1394,7 +1400,9 @@ } } return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg, - kwargannotation, posdefaults, kwdefaults, c->c_arena); + kwargannotation, posdefaults, kwdefaults, + vararg_lineno, vararg_col_offset, + kwarg_lineno, kwarg_col_offset, c->c_arena); } static expr_ty @@ -1560,7 +1568,7 @@ if (NCH(n) == 3) { args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, c->c_arena); + NULL, 0, 0, 0, 0, c->c_arena); if (!args) return NULL; expression = ast_for_expr(c, CHILD(n, 2)); @@ -2103,15 +2111,19 @@ if (NCH(n) == 2) return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); - else - return ast_for_call(c, CHILD(n, 1), left_expr); + else { + expr_ty tmp = ast_for_call(c, CHILD(n, 1), left_expr); + tmp->lineno = LINENO(n); + tmp->col_offset = n->n_col_offset; + return tmp; + } } else if (TYPE(CHILD(n, 0)) == DOT ) { PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1)); if (!attr_id) return NULL; return Attribute(left_expr, attr_id, Load, - LINENO(n), n->n_col_offset, c->c_arena); + LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena); } else { REQ(CHILD(n, 0), LSQB); @@ -2212,8 +2224,6 @@ tmp = ast_for_trailer(c, ch, e); if (!tmp) return NULL; - tmp->lineno = e->lineno; - tmp->col_offset = e->col_offset; e = tmp; } if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {