@@ -1067,12 +1067,20 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
1067
1067
}
1068
1068
1069
1069
1070
- // Remainder are line-expr stmts.
1071
-
1072
1070
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
+ }
1076
1084
}
1077
1085
}
1078
1086
p. err ( "expected statement" ) ;
@@ -1147,7 +1155,12 @@ fn stmt_to_expr(@ast.stmt stmt) -> option.t[@ast.expr] {
1147
1155
1148
1156
fn stmt_ends_with_semi ( @ast . stmt stmt) -> bool {
1149
1157
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
+ }
1151
1164
case ( ast. stmt_ret ( _) ) { ret true ; }
1152
1165
case ( ast. stmt_log ( _) ) { ret true ; }
1153
1166
case ( ast. stmt_check_expr ( _) ) { ret true ; }
@@ -1500,6 +1513,23 @@ impure fn parse_effect(parser p) -> ast.effect {
1500
1513
fail;
1501
1514
}
1502
1515
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
+
1503
1533
impure fn parse_item ( parser p) -> @ast . item {
1504
1534
let ast. effect eff = parse_effect ( p) ;
1505
1535
let ast. layer lyr = parse_layer ( p) ;
0 commit comments