Skip to content

Commit 48cc116

Browse files
committed
Parse anonymous objs in statement position
Closes #761
1 parent 451ec03 commit 48cc116

File tree

1 file changed

+21
-32
lines changed

1 file changed

+21
-32
lines changed

src/comp/syntax/parse/parser.rs

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -883,8 +883,7 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
883883

884884
// We don't need to pull ".node" out of fields because it's not a
885885
// "spanned".
886-
let ob: ast::anon_obj =
887-
{fields: fields, methods: meths, inner_obj: inner_obj};
886+
let ob = {fields: fields, methods: meths, inner_obj: inner_obj};
888887
ex = ast::expr_anon_obj(ob);
889888
} else if (eat_word(p, "bind")) {
890889
let e = parse_expr_res(p, RESTRICT_NO_CALL_EXPRS);
@@ -1554,27 +1553,20 @@ fn parse_source_stmt(p: &parser) -> @ast::stmt {
15541553
// If we have attributes then we should have an item
15551554
if ivec::len(item_attrs) > 0u {
15561555
alt maybe_item {
1557-
got_item(_) {/* fallthrough */ }
1556+
some(_) {/* fallthrough */ }
15581557
_ { ret p.fatal("expected item"); }
15591558
}
15601559
}
15611560

15621561

15631562
alt maybe_item {
1564-
got_item(i) {
1563+
some(i) {
15651564
let hi = i.span.hi;
15661565
let decl = @spanned(lo, hi, ast::decl_item(i));
15671566
ret @spanned(lo, hi, ast::stmt_decl(decl, p.get_id()));
15681567
}
1569-
fn_no_item. { // parse_item will have already skipped "fn"
1570-
1571-
let e = parse_fn_expr(p, ast::proto_fn);
1572-
e = parse_dot_or_call_expr_with(p, e);
1573-
ret @spanned(lo, e.span.hi, ast::stmt_expr(e, p.get_id()));
1574-
}
1575-
no_item. {
1568+
none. {
15761569
// Remainder are line-expr stmts.
1577-
15781570
let e = parse_expr(p);
15791571
ret @spanned(lo, e.span.hi, ast::stmt_expr(e, p.get_id()));
15801572
}
@@ -1873,7 +1865,7 @@ fn parse_mod_items(p: &parser, term: token::token,
18731865
let attrs = initial_attrs + parse_outer_attributes(p);
18741866
initial_attrs = ~[];
18751867
alt parse_item(p, attrs) {
1876-
got_item(i) { items += ~[i]; }
1868+
some(i) { items += ~[i]; }
18771869
_ {
18781870
p.fatal("expected item but found " +
18791871
token::to_str(p.get_reader(), p.peek()));
@@ -2082,37 +2074,34 @@ fn parse_auth(p: &parser) -> ast::_auth {
20822074
fail;
20832075
}
20842076

2085-
tag parsed_item { got_item(@ast::item); no_item; fn_no_item; }
2086-
2087-
fn parse_item(p: &parser, attrs: &ast::attribute[]) -> parsed_item {
2077+
fn parse_item(p: &parser, attrs: &ast::attribute[]) -> option::t[@ast::item] {
20882078
if eat_word(p, "const") {
2089-
ret got_item(parse_item_const(p, attrs));
2090-
} else if (eat_word(p, "fn")) {
2091-
// This is an anonymous function
2092-
2093-
if p.peek() == token::LPAREN { ret fn_no_item; }
2094-
ret got_item(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_fn,
2079+
ret some(parse_item_const(p, attrs));
2080+
} else if (is_word(p, "fn") && p.look_ahead(1u) != token::LPAREN) {
2081+
p.bump();
2082+
ret some(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_fn,
20952083
attrs));
20962084
} else if (eat_word(p, "pred")) {
2097-
ret got_item(parse_item_fn_or_iter(p, ast::pure_fn, ast::proto_fn,
2085+
ret some(parse_item_fn_or_iter(p, ast::pure_fn, ast::proto_fn,
20982086
attrs));
20992087
} else if (eat_word(p, "iter")) {
2100-
ret got_item(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_iter,
2088+
ret some(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_iter,
21012089
attrs));
21022090
} else if (eat_word(p, "mod")) {
2103-
ret got_item(parse_item_mod(p, attrs));
2091+
ret some(parse_item_mod(p, attrs));
21042092
} else if (eat_word(p, "native")) {
2105-
ret got_item(parse_item_native_mod(p, attrs));
2093+
ret some(parse_item_native_mod(p, attrs));
21062094
}
21072095
if eat_word(p, "type") {
2108-
ret got_item(parse_item_type(p, attrs));
2096+
ret some(parse_item_type(p, attrs));
21092097
} else if (eat_word(p, "tag")) {
2110-
ret got_item(parse_item_tag(p, attrs));
2111-
} else if (eat_word(p, "obj")) {
2112-
ret got_item(parse_item_obj(p, attrs));
2098+
ret some(parse_item_tag(p, attrs));
2099+
} else if (is_word(p, "obj") && p.look_ahead(1u) != token::LPAREN) {
2100+
p.bump();
2101+
ret some(parse_item_obj(p, attrs));
21132102
} else if (eat_word(p, "resource")) {
2114-
ret got_item(parse_item_res(p, attrs));
2115-
} else { ret no_item; }
2103+
ret some(parse_item_res(p, attrs));
2104+
} else { ret none; }
21162105
}
21172106

21182107
// A type to distingush between the parsing of item attributes or syntax

0 commit comments

Comments
 (0)