Allow import directives in any block

Closes #49
This commit is contained in:
Marijn Haverbeke 2011-11-23 20:57:34 +01:00
parent 03f6060e80
commit e98286b594
9 changed files with 114 additions and 83 deletions

View file

@ -76,9 +76,8 @@ tag meta_item_ {
type blk = spanned<blk_>;
type blk_ =
{stmts: [@stmt], expr: option::t<@expr>, id: node_id,
rules: blk_check_mode};
type blk_ = {view_items: [@view_item], stmts: [@stmt], expr: option::t<@expr>,
id: node_id, rules: blk_check_mode};
type pat = {id: node_id, node: pat_, span: span};

View file

@ -199,7 +199,7 @@ fn block_from_expr(e: @expr) -> blk {
fn default_block(stmts1: [@stmt], expr1: option::t<@expr>, id1: node_id) ->
blk_ {
ret {stmts: stmts1, expr: expr1, id: id1, rules: default_blk};
{view_items: [], stmts: stmts1, expr: expr1, id: id1, rules: default_blk}
}
fn obj_field_from_anon_obj_field(f: anon_obj_field) -> obj_field {

View file

@ -247,7 +247,8 @@ fn noop_fold_method(m: method_, fld: ast_fold) -> method_ {
fn noop_fold_block(b: blk_, fld: ast_fold) -> blk_ {
ret {stmts: vec::map(fld.fold_stmt, b.stmts),
ret {view_items: vec::map(fld.fold_view_item, b.view_items),
stmts: vec::map(fld.fold_stmt, b.stmts),
expr: option::map(fld.fold_expr, b.expr),
id: b.id,
rules: b.rules};

View file

@ -1697,8 +1697,8 @@ fn parse_block_no_value(p: parser) -> ast::blk {
// necessary, and this should take a qualifier.
// some blocks start with "#{"...
fn parse_block_tail(p: parser, lo: uint, s: ast::blk_check_mode) -> ast::blk {
let stmts: [@ast::stmt] = [];
let expr: option::t<@ast::expr> = none;
let view_items = [], stmts = [], expr = none;
while is_word(p, "import") { view_items += [parse_view_item(p)]; }
while p.peek() != token::RBRACE {
alt p.peek() {
token::SEMI. {
@ -1736,7 +1736,8 @@ fn parse_block_tail(p: parser, lo: uint, s: ast::blk_check_mode) -> ast::blk {
}
let hi = p.get_hi_pos();
p.bump();
let bloc = {stmts: stmts, expr: expr, id: p.get_id(), rules: s};
let bloc = {view_items: view_items, stmts: stmts, expr: expr,
id: p.get_id(), rules: s};
ret spanned(lo, hi, bloc);
}

View file

@ -200,7 +200,8 @@ fn visit_fn<E>(f: _fn, _tp: [ty_param], _sp: span, _i: fn_ident, _id: node_id,
}
fn visit_block<E>(b: ast::blk, e: E, v: vt<E>) {
for s: @stmt in b.node.stmts { v.visit_stmt(s, e, v); }
for vi in b.node.view_items { v.visit_view_item(vi, e, v); }
for s in b.node.stmts { v.visit_stmt(s, e, v); }
visit_expr_opt(b.node.expr, e, v);
}