Skip to content

Commit f0be65c

Browse files
committed
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.
1 parent beab6ba commit f0be65c

File tree

1 file changed

+33
-35
lines changed

1 file changed

+33
-35
lines changed

src/comp/syntax/parse/parser.rs

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ fn parse_ty_postfix(ast::ty_ orig_t, &parser p) -> @ast::ty {
425425
if (mut == ast::imm && p.peek() != token::RBRACKET) {
426426
// This is explicit type parameter instantiation.
427427
auto seq = parse_seq_to_end(token::RBRACKET,
428-
some(token::COMMA), parse_ty, p);
428+
some(token::COMMA), parse_ty, p);
429429

430430
alt (orig_t) {
431431
case (ast::ty_path(?pth, ?ann)) {
@@ -597,7 +597,14 @@ fn parse_arg(&parser p) -> ast::arg {
597597
}
598598

599599
fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep,
600-
fn(&parser)->T f, &parser p) -> T[] {
600+
fn(&parser)->T f, &parser p) -> T[] {
601+
auto val = parse_seq_to_before_end(ket, sep, f, p);
602+
p.bump();
603+
ret val;
604+
}
605+
606+
fn parse_seq_to_before_end[T](token::token ket, option::t[token::token] sep,
607+
fn(&parser)->T f, &parser p) -> T[] {
601608
let bool first = true;
602609
let T[] v = ~[];
603610
while (p.peek() != ket) {
@@ -609,7 +616,6 @@ fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep,
609616
}
610617
v += ~[f(p)];
611618
}
612-
expect(p, ket);
613619
ret v;
614620
}
615621

@@ -619,8 +625,9 @@ fn parse_seq[T](token::token bra, token::token ket,
619625
fn(&parser)->T f, &parser p) -> spanned[T[]] {
620626
auto lo = p.get_lo_pos();
621627
expect(p, bra);
622-
auto result = parse_seq_to_end[T](ket, sep, f, p);
628+
auto result = parse_seq_to_before_end[T](ket, sep, f, p);
623629
auto hi = p.get_hi_pos();
630+
p.bump();
624631
ret spanned(lo, hi, result);
625632
}
626633

@@ -702,7 +709,7 @@ fn parse_path_and_ty_param_substs(&parser p) -> ast::path {
702709
if (p.peek() == token::LBRACKET) {
703710
auto seq = parse_seq(token::LBRACKET, token::RBRACKET,
704711
some(token::COMMA), parse_ty, p);
705-
auto hi = p.get_hi_pos();
712+
auto hi = seq.span.hi;
706713
path = spanned(lo, hi, rec(global=path.node.global,
707714
idents=path.node.idents,
708715
types=seq.node));
@@ -785,17 +792,15 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
785792
auto e = parse_expr(p);
786793
ret rec(mut=m, expr=e);
787794
}
788-
auto es =
789-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
790-
parse_elt, p);
795+
auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
796+
parse_elt, p);
791797
hi = es.span.hi;
792798
ex = ast::expr_tup(es.node);
793799
} else if (p.peek() == token::LBRACKET) {
794800
p.bump();
795801
auto mut = parse_mutability(p);
796-
auto es =
797-
parse_seq_to_end(token::RBRACKET, some(token::COMMA),
798-
parse_expr, p);
802+
auto es = parse_seq_to_end(token::RBRACKET, some(token::COMMA),
803+
parse_expr, p);
799804
ex = ast::expr_vec(es, mut, ast::sk_rc);
800805
} else if (p.peek() == token::POUND_LT) {
801806
p.bump();
@@ -814,12 +819,10 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
814819
p.bump();
815820
alt (p.peek()) {
816821
case (token::LBRACKET) { // unique array (temporary)
817-
818822
p.bump();
819823
auto mut = parse_mutability(p);
820-
auto es =
821-
parse_seq_to_end(token::RBRACKET, some(token::COMMA),
822-
parse_expr, p);
824+
auto es = parse_seq_to_end
825+
(token::RBRACKET, some(token::COMMA), parse_expr, p);
823826
ex = ast::expr_vec(es, mut, ast::sk_unique);
824827
}
825828
case (token::LIT_STR(?s)) {
@@ -894,9 +897,8 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
894897
case (_) { ret some(parse_expr(p)); }
895898
}
896899
}
897-
auto es =
898-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
899-
parse_expr_opt, p);
900+
auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
901+
parse_expr_opt, p);
900902
hi = es.span.hi;
901903
ex = ast::expr_bind(e, es.node);
902904
} else if (p.peek() == token::POUND) {
@@ -995,9 +997,8 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
995997
// The rest is a call expression.
996998

997999
let @ast::expr f = parse_self_method(p);
998-
auto es =
999-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1000-
parse_expr, p);
1000+
auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1001+
parse_expr, p);
10011002
hi = es.span.hi;
10021003
ex = ast::expr_call(f, es.node);
10031004
} else if (p.peek() == token::MOD_SEP ||
@@ -1026,8 +1027,8 @@ fn parse_syntax_ext_naked(&parser p, uint lo) -> @ast::expr {
10261027
if (ivec::len(pth.node.idents) == 0u) {
10271028
p.fatal("expected a syntax expander name");
10281029
}
1029-
auto es = parse_seq(token::LPAREN, token::RPAREN,
1030-
some(token::COMMA), parse_expr, p);
1030+
auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1031+
parse_expr, p);
10311032
auto hi = es.span.hi;
10321033
ret mk_mac_expr(p, lo, hi, ast::mac_invoc(pth, es.node, none));
10331034
}
@@ -1053,9 +1054,8 @@ fn parse_dot_or_call_expr_with(&parser p, @ast::expr e) -> @ast::expr {
10531054
} else {
10541055
// Call expr.
10551056

1056-
auto es =
1057-
parse_seq(token::LPAREN, token::RPAREN,
1058-
some(token::COMMA), parse_expr, p);
1057+
auto es = parse_seq(token::LPAREN, token::RPAREN,
1058+
some(token::COMMA), parse_expr, p);
10591059
hi = es.span.hi;
10601060
e = mk_expr(p, lo, hi, ast::expr_call(e, es.node));
10611061
}
@@ -1370,9 +1370,8 @@ fn parse_spawn_expr(&parser p) -> @ast::expr {
13701370
// FIXME: why no full expr?
13711371

13721372
auto fn_expr = parse_bottom_expr(p);
1373-
auto es =
1374-
parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1375-
parse_expr, p);
1373+
auto es = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
1374+
parse_expr, p);
13761375
auto hi = es.span.hi;
13771376
ret mk_expr(p, lo, hi, ast::expr_spawn
13781377
(ast::dom_implicit, option::none, fn_expr, es.node));
@@ -1507,8 +1506,7 @@ fn parse_pat(&parser p) -> @ast::pat {
15071506
alt (p.peek()) {
15081507
case (token::LPAREN) {
15091508
auto f = parse_pat;
1510-
auto a =
1511-
parse_seq(token::LPAREN, token::RPAREN,
1509+
auto a = parse_seq(token::LPAREN, token::RPAREN,
15121510
some(token::COMMA), f, p);
15131511
args = a.node;
15141512
hi = a.span.hi;
@@ -1763,9 +1761,8 @@ fn parse_ty_param(&parser p) -> ast::ty_param { ret parse_ident(p); }
17631761
fn parse_ty_params(&parser p) -> ast::ty_param[] {
17641762
let ast::ty_param[] ty_params = ~[];
17651763
if (p.peek() == token::LBRACKET) {
1766-
ty_params =
1767-
parse_seq(token::LBRACKET, token::RBRACKET,
1768-
some(token::COMMA), parse_ty_param, p).node;
1764+
ty_params = parse_seq(token::LBRACKET, token::RBRACKET,
1765+
some(token::COMMA), parse_ty_param, p).node;
17691766
}
17701767
ret ty_params;
17711768
}
@@ -2116,6 +2113,7 @@ fn parse_item_tag(&parser p, &ast::attribute[] attrs) -> @ast::item {
21162113
auto vlo = p.get_lo_pos();
21172114
p.bump();
21182115
let ast::variant_arg[] args = ~[];
2116+
auto vhi = p.get_hi_pos();
21192117
alt (p.peek()) {
21202118
case (token::LPAREN) {
21212119
auto arg_tys =
@@ -2124,10 +2122,10 @@ fn parse_item_tag(&parser p, &ast::attribute[] attrs) -> @ast::item {
21242122
for (@ast::ty ty in arg_tys.node) {
21252123
args += ~[rec(ty=ty, id=p.get_id())];
21262124
}
2125+
vhi = arg_tys.span.hi;
21272126
}
21282127
case (_) {/* empty */ }
21292128
}
2130-
auto vhi = p.get_hi_pos();
21312129
expect(p, token::SEMI);
21322130
p.get_id();
21332131
auto vr =

0 commit comments

Comments
 (0)