Skip to content

Commit 6e6aa88

Browse files
committed
---
yaml --- r: 1165 b: refs/heads/master c: b42f49b h: refs/heads/master i: 1163: 8037c03 v: v3
1 parent fd0ad64 commit 6e6aa88

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 53d5b112080f2908acf01bba418fdf3568f490f7
2+
refs/heads/master: b42f49bf99cb9d4a50000742df55683f8ad82d74

trunk/src/comp/front/parser.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,12 +1067,20 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
10671067
}
10681068

10691069

1070-
// Remainder are line-expr stmts.
1071-
10721070
case (_) {
1073-
auto e = parse_expr(p);
1074-
auto hi = p.get_span();
1075-
ret @spanned(lo, hi, ast.stmt_expr(e));
1071+
if (peeking_at_item(p)) {
1072+
// Might be a local item decl.
1073+
auto i = parse_item(p);
1074+
auto hi = i.span;
1075+
auto decl = @spanned(lo, hi, ast.decl_item(i));
1076+
ret @spanned(lo, hi, ast.stmt_decl(decl));
1077+
1078+
} else {
1079+
// Remainder are line-expr stmts.
1080+
auto e = parse_expr(p);
1081+
auto hi = p.get_span();
1082+
ret @spanned(lo, hi, ast.stmt_expr(e));
1083+
}
10761084
}
10771085
}
10781086
p.err("expected statement");
@@ -1147,7 +1155,12 @@ fn stmt_to_expr(@ast.stmt stmt) -> option.t[@ast.expr] {
11471155

11481156
fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
11491157
alt (stmt.node) {
1150-
case (ast.stmt_decl(_)) { ret true; } // FIXME
1158+
case (ast.stmt_decl(?d)) {
1159+
alt (d.node) {
1160+
case (ast.decl_local(_)) { ret true; }
1161+
case (ast.decl_item(_)) { ret false; }
1162+
}
1163+
}
11511164
case (ast.stmt_ret(_)) { ret true; }
11521165
case (ast.stmt_log(_)) { ret true; }
11531166
case (ast.stmt_check_expr(_)) { ret true; }
@@ -1500,6 +1513,23 @@ impure fn parse_effect(parser p) -> ast.effect {
15001513
fail;
15011514
}
15021515

1516+
fn peeking_at_item(parser p) -> bool {
1517+
alt (p.peek()) {
1518+
case (token.STATE) { ret true; }
1519+
case (token.GC) { ret true; }
1520+
case (token.IMPURE) { ret true; }
1521+
case (token.UNSAFE) { ret true; }
1522+
case (token.CONST) { ret true; }
1523+
case (token.FN) { ret true; }
1524+
case (token.MOD) { ret true; }
1525+
case (token.TYPE) { ret true; }
1526+
case (token.TAG) { ret true; }
1527+
case (token.OBJ) { ret true; }
1528+
case (_) { ret false; }
1529+
}
1530+
ret false;
1531+
}
1532+
15031533
impure fn parse_item(parser p) -> @ast.item {
15041534
let ast.effect eff = parse_effect(p);
15051535
let ast.layer lyr = parse_layer(p);

0 commit comments

Comments
 (0)