From de118d79b603b84e2911527a586f7716b750c5fa Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 10 Dec 2010 18:08:32 -0800 Subject: rustc: Resolve pattern bindings --- src/comp/front/parser.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/comp/front/parser.rs') diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index f8db2f71..decb28e1 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -817,8 +817,9 @@ impure fn parse_alt_expr(parser p) -> @ast.expr { expect(p, token.LPAREN); auto pat = parse_pat(p); expect(p, token.RPAREN); + auto index = index_arm(pat); auto block = parse_block(p); - arms += vec(rec(pat=pat, block=block)); + arms += vec(rec(pat=pat, block=block, index=index)); } case (token.RBRACE) { /* empty */ } case (?tok) { @@ -1082,6 +1083,24 @@ fn index_block(vec[@ast.stmt] stmts, option.t[@ast.expr] expr) -> ast.block_ { ret rec(stmts=stmts, expr=expr, index=index); } +fn index_arm(@ast.pat pat) -> hashmap[ast.ident,ast.def_id] { + fn do_index_arm(&hashmap[ast.ident,ast.def_id] index, @ast.pat pat) { + alt (pat.node) { + case (ast.pat_bind(?i, ?def_id, _)) { index.insert(i, def_id); } + case (ast.pat_wild(_)) { /* empty */ } + case (ast.pat_tag(_, ?pats, _)) { + for (@ast.pat p in pats) { + do_index_arm(index, p); + } + } + } + } + + auto index = new_str_hash[ast.def_id](); + do_index_arm(index, pat); + ret index; +} + fn stmt_to_expr(@ast.stmt stmt) -> option.t[@ast.expr] { alt (stmt.node) { case (ast.stmt_expr(?e)) { ret some[@ast.expr](e); } -- cgit v1.2.3