Fix span information returned by parser::parse_seq

Its hi pos used to be the end of the token after the sequence. It now
properly reports the end of the closing token.
This commit is contained in:
Marijn Haverbeke 2011-07-25 14:04:37 +02:00
parent beab6ba8aa
commit f0be65cb50

View file

@ -598,6 +598,13 @@ fn parse_arg(&parser p) -> ast::arg {
fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep, fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep,
fn(&parser)->T f, &parser p) -> T[] { fn(&parser)->T f, &parser p) -> T[] {
auto val = parse_seq_to_before_end(ket, sep, f, p);
p.bump();
ret val;
}
fn parse_seq_to_before_end[T](token::token ket, option::t[token::token] sep,
fn(&parser)->T f, &parser p) -> T[] {
let bool first = true; let bool first = true;
let T[] v = ~[]; let T[] v = ~[];
while (p.peek() != ket) { while (p.peek() != ket) {
@ -609,7 +616,6 @@ fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep,
} }
v += ~[f(p)]; v += ~[f(p)];
} }
expect(p, ket);
ret v; ret v;
} }
@ -619,8 +625,9 @@ fn parse_seq[T](token::token bra, token::token ket,
fn(&parser)->T f, &parser p) -> spanned[T[]] { fn(&parser)->T f, &parser p) -> spanned[T[]] {
auto lo = p.get_lo_pos(); auto lo = p.get_lo_pos();
expect(p, bra); expect(p, bra);
auto result = parse_seq_to_end[T](ket, sep, f, p); auto result = parse_seq_to_before_end[T](ket, sep, f, p);
auto hi = p.get_hi_pos(); auto hi = p.get_hi_pos();
p.bump();
ret spanned(lo, hi, result); ret spanned(lo, hi, result);
} }
@ -702,7 +709,7 @@ fn parse_path_and_ty_param_substs(&parser p) -> ast::path {
if (p.peek() == token::LBRACKET) { if (p.peek() == token::LBRACKET) {
auto seq = parse_seq(token::LBRACKET, token::RBRACKET, auto seq = parse_seq(token::LBRACKET, token::RBRACKET,
some(token::COMMA), parse_ty, p); some(token::COMMA), parse_ty, p);
auto hi = p.get_hi_pos(); auto hi = seq.span.hi;
path = spanned(lo, hi, rec(global=path.node.global, path = spanned(lo, hi, rec(global=path.node.global,
idents=path.node.idents, idents=path.node.idents,
types=seq.node)); types=seq.node));
@ -785,16 +792,14 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
auto e = parse_expr(p); auto e = parse_expr(p);
ret rec(mut=m, expr=e); ret rec(mut=m, expr=e);
} }
auto es = auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_elt, p); parse_elt, p);
hi = es.span.hi; hi = es.span.hi;
ex = ast::expr_tup(es.node); ex = ast::expr_tup(es.node);
} else if (p.peek() == token::LBRACKET) { } else if (p.peek() == token::LBRACKET) {
p.bump(); p.bump();
auto mut = parse_mutability(p); auto mut = parse_mutability(p);
auto es = auto es = parse_seq_to_end(token::RBRACKET, some(token::COMMA),
parse_seq_to_end(token::RBRACKET, some(token::COMMA),
parse_expr, p); parse_expr, p);
ex = ast::expr_vec(es, mut, ast::sk_rc); ex = ast::expr_vec(es, mut, ast::sk_rc);
} else if (p.peek() == token::POUND_LT) { } else if (p.peek() == token::POUND_LT) {
@ -814,12 +819,10 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
p.bump(); p.bump();
alt (p.peek()) { alt (p.peek()) {
case (token::LBRACKET) { // unique array (temporary) case (token::LBRACKET) { // unique array (temporary)
p.bump(); p.bump();
auto mut = parse_mutability(p); auto mut = parse_mutability(p);
auto es = auto es = parse_seq_to_end
parse_seq_to_end(token::RBRACKET, some(token::COMMA), (token::RBRACKET, some(token::COMMA), parse_expr, p);
parse_expr, p);
ex = ast::expr_vec(es, mut, ast::sk_unique); ex = ast::expr_vec(es, mut, ast::sk_unique);
} }
case (token::LIT_STR(?s)) { case (token::LIT_STR(?s)) {
@ -894,8 +897,7 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
case (_) { ret some(parse_expr(p)); } case (_) { ret some(parse_expr(p)); }
} }
} }
auto es = auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_expr_opt, p); parse_expr_opt, p);
hi = es.span.hi; hi = es.span.hi;
ex = ast::expr_bind(e, es.node); ex = ast::expr_bind(e, es.node);
@ -995,8 +997,7 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
// The rest is a call expression. // The rest is a call expression.
let @ast::expr f = parse_self_method(p); let @ast::expr f = parse_self_method(p);
auto es = auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_expr, p); parse_expr, p);
hi = es.span.hi; hi = es.span.hi;
ex = ast::expr_call(f, es.node); ex = ast::expr_call(f, es.node);
@ -1026,8 +1027,8 @@ fn parse_syntax_ext_naked(&parser p, uint lo) -> @ast::expr {
if (ivec::len(pth.node.idents) == 0u) { if (ivec::len(pth.node.idents) == 0u) {
p.fatal("expected a syntax expander name"); p.fatal("expected a syntax expander name");
} }
auto es = parse_seq(token::LPAREN, token::RPAREN, auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
some(token::COMMA), parse_expr, p); parse_expr, p);
auto hi = es.span.hi; auto hi = es.span.hi;
ret mk_mac_expr(p, lo, hi, ast::mac_invoc(pth, es.node, none)); ret mk_mac_expr(p, lo, hi, ast::mac_invoc(pth, es.node, none));
} }
@ -1053,8 +1054,7 @@ fn parse_dot_or_call_expr_with(&parser p, @ast::expr e) -> @ast::expr {
} else { } else {
// Call expr. // Call expr.
auto es = auto es = parse_seq(token::LPAREN, token::RPAREN,
parse_seq(token::LPAREN, token::RPAREN,
some(token::COMMA), parse_expr, p); some(token::COMMA), parse_expr, p);
hi = es.span.hi; hi = es.span.hi;
e = mk_expr(p, lo, hi, ast::expr_call(e, es.node)); e = mk_expr(p, lo, hi, ast::expr_call(e, es.node));
@ -1370,8 +1370,7 @@ fn parse_spawn_expr(&parser p) -> @ast::expr {
// FIXME: why no full expr? // FIXME: why no full expr?
auto fn_expr = parse_bottom_expr(p); auto fn_expr = parse_bottom_expr(p);
auto es = auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_expr, p); parse_expr, p);
auto hi = es.span.hi; auto hi = es.span.hi;
ret mk_expr(p, lo, hi, ast::expr_spawn ret mk_expr(p, lo, hi, ast::expr_spawn
@ -1507,8 +1506,7 @@ fn parse_pat(&parser p) -> @ast::pat {
alt (p.peek()) { alt (p.peek()) {
case (token::LPAREN) { case (token::LPAREN) {
auto f = parse_pat; auto f = parse_pat;
auto a = auto a = parse_seq(token::LPAREN, token::RPAREN,
parse_seq(token::LPAREN, token::RPAREN,
some(token::COMMA), f, p); some(token::COMMA), f, p);
args = a.node; args = a.node;
hi = a.span.hi; hi = a.span.hi;
@ -1763,8 +1761,7 @@ fn parse_ty_param(&parser p) -> ast::ty_param { ret parse_ident(p); }
fn parse_ty_params(&parser p) -> ast::ty_param[] { fn parse_ty_params(&parser p) -> ast::ty_param[] {
let ast::ty_param[] ty_params = ~[]; let ast::ty_param[] ty_params = ~[];
if (p.peek() == token::LBRACKET) { if (p.peek() == token::LBRACKET) {
ty_params = ty_params = parse_seq(token::LBRACKET, token::RBRACKET,
parse_seq(token::LBRACKET, token::RBRACKET,
some(token::COMMA), parse_ty_param, p).node; some(token::COMMA), parse_ty_param, p).node;
} }
ret ty_params; ret ty_params;
@ -2116,6 +2113,7 @@ fn parse_item_tag(&parser p, &ast::attribute[] attrs) -> @ast::item {
auto vlo = p.get_lo_pos(); auto vlo = p.get_lo_pos();
p.bump(); p.bump();
let ast::variant_arg[] args = ~[]; let ast::variant_arg[] args = ~[];
auto vhi = p.get_hi_pos();
alt (p.peek()) { alt (p.peek()) {
case (token::LPAREN) { case (token::LPAREN) {
auto arg_tys = auto arg_tys =
@ -2124,10 +2122,10 @@ fn parse_item_tag(&parser p, &ast::attribute[] attrs) -> @ast::item {
for (@ast::ty ty in arg_tys.node) { for (@ast::ty ty in arg_tys.node) {
args += ~[rec(ty=ty, id=p.get_id())]; args += ~[rec(ty=ty, id=p.get_id())];
} }
vhi = arg_tys.span.hi;
} }
case (_) {/* empty */ } case (_) {/* empty */ }
} }
auto vhi = p.get_hi_pos();
expect(p, token::SEMI); expect(p, token::SEMI);
p.get_id(); p.get_id();
auto vr = auto vr =