diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index 5acffb85472..600a76c0738 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -110,13 +110,15 @@ type block = spanned[block_]; type block_ = rec(vec[@stmt] stmts, option::t[@expr] expr, node_id id); -type pat = spanned[pat_]; +type pat = rec(node_id id, + pat_ node, + span span); tag pat_ { - pat_wild(node_id); - pat_bind(ident, node_id); - pat_lit(@lit, node_id); - pat_tag(path, vec[@pat], node_id); + pat_wild; + pat_bind(ident); + pat_lit(@lit); + pat_tag(path, vec[@pat]); } tag mutability { mut; imm; maybe_mut; } diff --git a/src/comp/front/fold.rs b/src/comp/front/fold.rs index f200278e8df..0fc884d67c3 100644 --- a/src/comp/front/fold.rs +++ b/src/comp/front/fold.rs @@ -252,12 +252,12 @@ fn noop_fold_arm(&arm a, ast_fold fld) -> arm { fn noop_fold_pat(&pat_ p, ast_fold fld) -> pat_ { ret alt (p) { - case (pat_wild(_)) { p } - case (pat_bind(?id, ?d)) { pat_bind(fld.fold_ident(id), d)} - case (pat_lit(_, _)) { p } - case (pat_tag(?pth, ?pats, ?nid)) { - pat_tag(fld.fold_path(pth), map(fld.fold_pat, pats), nid) - } + case (pat_wild) { p } + case (pat_bind(?ident)) { pat_bind(fld.fold_ident(ident))} + case (pat_lit(_)) { p } + case (pat_tag(?pth, ?pats)) { + pat_tag(fld.fold_path(pth), map(fld.fold_pat, pats)) + } }; } @@ -616,7 +616,7 @@ fn make_fold(&ast_fold_precursor afp) -> ast_fold { ret afp.fold_arm(x, f); } fn f_pat(&ast_fold_precursor afp, ast_fold f, &@pat x) -> @pat { - ret @rec(node=afp.fold_pat(x.node, f), span=x.span); + ret @rec(id=x.id, node=afp.fold_pat(x.node, f), span=x.span); } fn f_decl(&ast_fold_precursor afp, ast_fold f, &@decl x) -> @decl { ret @rec(node=afp.fold_decl(x.node, f), span=x.span); diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index c4f368a4a2f..ce68be6b246 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1396,7 +1396,7 @@ fn parse_pat(&parser p) -> @ast::pat { alt (p.peek()) { case (token::UNDERSCORE) { p.bump(); - pat = ast::pat_wild(p.get_id()); + pat = ast::pat_wild; } case (token::QUES) { p.bump(); @@ -1404,8 +1404,7 @@ fn parse_pat(&parser p) -> @ast::pat { case (token::IDENT(?id, _)) { hi = p.get_hi_pos(); p.bump(); - pat = - ast::pat_bind(p.get_str(id), p.get_id()); + pat = ast::pat_bind(p.get_str(id)); } case (?tok) { p.fatal("expected identifier after '?' in pattern but " + @@ -1418,7 +1417,7 @@ fn parse_pat(&parser p) -> @ast::pat { if (!is_ident(tok) || is_word(p, "true") || is_word(p, "false")) { auto lit = parse_lit(p); hi = lit.span.hi; - pat = ast::pat_lit(@lit, p.get_id()); + pat = ast::pat_lit(@lit); } else { auto tag_path = parse_path_and_ty_param_substs(p); hi = tag_path.span.hi; @@ -1434,11 +1433,11 @@ fn parse_pat(&parser p) -> @ast::pat { } case (_) { args = []; } } - pat = ast::pat_tag(tag_path, args, p.get_id()); + pat = ast::pat_tag(tag_path, args); } } } - ret @spanned(lo, hi, pat); + ret @rec(id=p.get_id(), node=pat, span=rec(lo=lo, hi=hi)); } fn parse_local_full(&option::t[@ast::ty] tyopt, &parser p) diff --git a/src/comp/middle/alias.rs b/src/comp/middle/alias.rs index 7bab6269af9..f911aac6733 100644 --- a/src/comp/middle/alias.rs +++ b/src/comp/middle/alias.rs @@ -291,8 +291,8 @@ fn arm_defnums(&ast::arm arm) -> vec[node_id] { auto dnums = []; fn walk_pat(&mutable vec[node_id] found, &@ast::pat p) { alt (p.node) { - case (ast::pat_bind(_, ?id)) { vec::push(found, id); } - case (ast::pat_tag(_, ?children, _)) { + case (ast::pat_bind(_)) { vec::push(found, p.id); } + case (ast::pat_tag(_, ?children)) { for (@ast::pat child in children) { walk_pat(found, child); } } case (_) { } diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index f6a5b6413d0..0fdf9219246 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -301,14 +301,14 @@ fn resolve_names(&@env e, &@ast::crate c) { } fn walk_pat(&env e, &scopes sc, &@ast::pat pat) { alt (pat.node) { - case (ast::pat_tag(?p, ?children, ?id)) { + case (ast::pat_tag(?p, ?children)) { auto fnd = lookup_path_strict(e, sc, p.span, p.node.idents, ns_value); if (option::is_some(fnd)) { alt (option::get(fnd)) { case (ast::def_variant(?did, ?vid)) { - e.def_map.insert(id, option::get(fnd)); + e.def_map.insert(pat.id, option::get(fnd)); for (@ast::pat child in children) { walk_pat(e, sc, child); } @@ -694,14 +694,14 @@ fn lookup_in_ty_params(&ident name, &vec[ast::ty_param] ty_params) -> fn lookup_in_pat(&ident name, &ast::pat pat) -> option::t[def] { alt (pat.node) { - case (ast::pat_bind(?p_name, ?id)) { + case (ast::pat_bind(?p_name)) { if (str::eq(p_name, name)) { - ret some(ast::def_binding(local_def(id))); + ret some(ast::def_binding(local_def(pat.id))); } } - case (ast::pat_wild(_)) { } - case (ast::pat_lit(_, _)) { } - case (ast::pat_tag(_, ?pats, _)) { + case (ast::pat_wild) { } + case (ast::pat_lit(_)) { } + case (ast::pat_tag(_, ?pats)) { for (@ast::pat p in pats) { auto found = lookup_in_pat(name, *p); if (!option::is_none(found)) { ret found; } @@ -1248,8 +1248,8 @@ fn check_arm(@env e, &ast::arm a, &() x, &vt[()] v) { visit::visit_arm(a, x, v); fn walk_pat(checker ch, &@ast::pat p) { alt (p.node) { - case (ast::pat_bind(?name, _)) { add_name(ch, p.span, name); } - case (ast::pat_tag(_, ?children, _)) { + case (ast::pat_bind(?name)) { add_name(ch, p.span, name); } + case (ast::pat_tag(_, ?children)) { for (@ast::pat child in children) { walk_pat(ch, child); } } case (_) { } diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 8797d05a51f..d05f65d5fd7 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -4629,19 +4629,19 @@ fn trans_do_while(&@block_ctxt cx, &ast::block body, &@ast::expr cond) -> fn trans_pat_match(&@block_ctxt cx, &@ast::pat pat, ValueRef llval, &@block_ctxt next_cx) -> result { alt (pat.node) { - case (ast::pat_wild(_)) { ret rslt(cx, llval); } - case (ast::pat_bind(_, _)) { ret rslt(cx, llval); } - case (ast::pat_lit(?lt, ?id)) { - auto lllit = trans_lit(cx.fcx.lcx.ccx, *lt, id); - auto lltype = ty::node_id_to_type(cx.fcx.lcx.ccx.tcx, id); + case (ast::pat_wild) { ret rslt(cx, llval); } + case (ast::pat_bind(_)) { ret rslt(cx, llval); } + case (ast::pat_lit(?lt)) { + auto lllit = trans_lit(cx.fcx.lcx.ccx, *lt, pat.id); + auto lltype = ty::node_id_to_type(cx.fcx.lcx.ccx.tcx, pat.id); auto lleq = trans_compare(cx, ast::eq, lltype, llval, lllit); auto matched_cx = new_sub_block_ctxt(lleq.bcx, "matched_cx"); lleq.bcx.build.CondBr(lleq.val, matched_cx.llbb, next_cx.llbb); ret rslt(matched_cx, llval); } - case (ast::pat_tag(?ident, ?subpats, ?id)) { + case (ast::pat_tag(?ident, ?subpats)) { auto vdef = - ast::variant_def_ids(cx.fcx.lcx.ccx.tcx.def_map.get(id)); + ast::variant_def_ids(cx.fcx.lcx.ccx.tcx.def_map.get(pat.id)); auto variants = ty::tag_variants(cx.fcx.lcx.ccx.tcx, vdef._0); auto matched_cx = new_sub_block_ctxt(cx, "matched_cx"); auto llblobptr = llval; @@ -4675,7 +4675,7 @@ fn trans_pat_match(&@block_ctxt cx, &@ast::pat pat, ValueRef llval, } } auto ty_params = ty::node_id_to_type_params - (cx.fcx.lcx.ccx.tcx, id); + (cx.fcx.lcx.ccx.tcx, pat.id); if (vec::len(subpats) > 0u) { auto i = 0; for (@ast::pat subpat in subpats) { @@ -4702,29 +4702,29 @@ fn trans_pat_match(&@block_ctxt cx, &@ast::pat pat, ValueRef llval, fn trans_pat_binding(&@block_ctxt cx, &@ast::pat pat, ValueRef llval, bool bind_alias) -> result { alt (pat.node) { - case (ast::pat_wild(_)) { ret rslt(cx, llval); } - case (ast::pat_lit(_, _)) { ret rslt(cx, llval); } - case (ast::pat_bind(?name, ?id)) { + case (ast::pat_wild) { ret rslt(cx, llval); } + case (ast::pat_lit(_)) { ret rslt(cx, llval); } + case (ast::pat_bind(?name)) { if (bind_alias) { - cx.fcx.lllocals.insert(id, llval); + cx.fcx.lllocals.insert(pat.id, llval); ret rslt(cx, llval); } else { - auto t = node_id_type(cx.fcx.lcx.ccx, id); + auto t = node_id_type(cx.fcx.lcx.ccx, pat.id); auto rslt = alloc_ty(cx, t); auto dst = rslt.val; auto bcx = rslt.bcx; maybe_name_value(cx.fcx.lcx.ccx, dst, name); - bcx.fcx.lllocals.insert(id, dst); + bcx.fcx.lllocals.insert(pat.id, dst); bcx.cleanups += [clean(bind drop_slot(_, dst, t))]; ret copy_val(bcx, INIT, dst, llval, t); } } - case (ast::pat_tag(_, ?subpats, ?id)) { + case (ast::pat_tag(_, ?subpats)) { if (vec::len[@ast::pat](subpats) == 0u) { ret rslt(cx, llval); } // Get the appropriate variant for this tag. auto vdef = - ast::variant_def_ids(cx.fcx.lcx.ccx.tcx.def_map.get(id)); + ast::variant_def_ids(cx.fcx.lcx.ccx.tcx.def_map.get(pat.id)); auto llblobptr = llval; if (vec::len(ty::tag_variants(cx.fcx.lcx.ccx.tcx, vdef._0))!=1u) { auto lltagptr = cx.build.PointerCast @@ -4732,7 +4732,7 @@ fn trans_pat_binding(&@block_ctxt cx, &@ast::pat pat, ValueRef llval, llblobptr = cx.build.GEP(lltagptr, [C_int(0), C_int(1)]); } auto ty_param_substs = - ty::node_id_to_type_params(cx.fcx.lcx.ccx.tcx, id); + ty::node_id_to_type_params(cx.fcx.lcx.ccx.tcx, pat.id); auto this_cx = cx; auto i = 0; for (@ast::pat subpat in subpats) { diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 1b7e7878964..254fd130681 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -99,7 +99,6 @@ export mo_val; export mo_alias; export mt; export node_type_table; -export pat_node_id; export pat_ty; export cname; export rename; @@ -1850,7 +1849,7 @@ fn block_ty(&ctxt cx, &ast::block b) -> t { // Returns the type of a pattern as a monotype. Like @expr_ty, this function // doesn't provide type parameter substitutions. fn pat_ty(&ctxt cx, &@ast::pat pat) -> t { - ret node_id_to_monotype(cx, pat_node_id(pat)); + ret node_id_to_monotype(cx, pat.id); } @@ -1888,16 +1887,6 @@ fn stmt_node_id(&@ast::stmt s) -> ast::node_id { } } -fn pat_node_id(&@ast::pat p) -> ast::node_id { - alt (p.node) { - case (ast::pat_wild(?id)) { ret id; } - case (ast::pat_bind(_, ?id)) { ret id; } - case (ast::pat_lit(_, ?id)) { ret id; } - case (ast::pat_tag(_, _, ?id)) { ret id; } - } -} - - // Expression utilities fn field_num(&session::session sess, &span sp, &ast::ident id) -> uint { let uint accum = 0u; diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 41a2daf0e44..785393e13c9 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1056,7 +1056,7 @@ mod writeback { resolve_type_vars_for_node(fcx, b.span, b.node.id); } fn visit_pat_pre(@fn_ctxt fcx, &@ast::pat p) { - resolve_type_vars_for_node(fcx, p.span, ty::pat_node_id(p)); + resolve_type_vars_for_node(fcx, p.span, p.id); } fn visit_local_pre(@fn_ctxt fcx, &@ast::local l) { auto var_id = lookup_local(fcx, l.span, l.node.id); @@ -1196,9 +1196,9 @@ fn gather_locals(&@crate_ctxt ccx, &ast::fn_decl decl, &ast::block body, hashmap[ast::node_id, ast::ident] local_names, @mutable int nvi, &@ast::pat p) { alt (p.node) { - case (ast::pat_bind(?ident, ?id)) { + case (ast::pat_bind(?ident)) { assign(ccx.tcx, vb, locals, local_names, nvi, - id, ident, none[ty::t]); + p.id, ident, none[ty::t]); } case (_) {/* no-op */ } } @@ -1249,24 +1249,23 @@ fn check_lit(@crate_ctxt ccx, &@ast::lit lit) -> ty::t { // their types immediately. fn check_pat(&@fn_ctxt fcx, &@ast::pat pat, ty::t expected) { alt (pat.node) { - case (ast::pat_wild(?id)) { - write::ty_only_fixup(fcx, id, expected); + case (ast::pat_wild) { + write::ty_only_fixup(fcx, pat.id, expected); } - case (ast::pat_lit(?lt, ?id)) { + case (ast::pat_lit(?lt)) { auto typ = check_lit(fcx.ccx, lt); typ = demand::simple(fcx, pat.span, expected, typ); - write::ty_only_fixup(fcx, id, typ); + write::ty_only_fixup(fcx, pat.id, typ); } - case (ast::pat_bind(?name, ?id)) { - auto vid = lookup_local(fcx, pat.span, id); + case (ast::pat_bind(?name)) { + auto vid = lookup_local(fcx, pat.span, pat.id); auto typ = ty::mk_var(fcx.ccx.tcx, vid); typ = demand::simple(fcx, pat.span, expected, typ); - write::ty_only_fixup(fcx, id, typ); + write::ty_only_fixup(fcx, pat.id, typ); } - case (ast::pat_tag(?path, ?subpats, ?id)) { + case (ast::pat_tag(?path, ?subpats)) { // Typecheck the path. - - auto v_def = lookup_def(fcx, path.span, id); + auto v_def = lookup_def(fcx, path.span, pat.id); auto v_def_ids = ast::variant_def_ids(v_def); auto tag_tpt = ty::lookup_item_type(fcx.ccx.tcx, v_def_ids._0); auto path_tpot = instantiate_path(fcx, path, tag_tpt, pat.span); @@ -1341,7 +1340,7 @@ fn check_pat(&@fn_ctxt fcx, &@ast::pat pat, ty::t expected) { "" } else { "s" })); } - write::ty_fixup(fcx, id, path_tpot); + write::ty_fixup(fcx, pat.id, path_tpot); } } } diff --git a/src/comp/middle/visit.rs b/src/comp/middle/visit.rs index 7956752b856..c87373c4ff8 100644 --- a/src/comp/middle/visit.rs +++ b/src/comp/middle/visit.rs @@ -190,7 +190,7 @@ fn visit_constr[E](&@constr c, &E e, &vt[E] v) { fn visit_pat[E](&@pat p, &E e, &vt[E] v) { alt (p.node) { - case (pat_tag(?path, ?children, _)) { + case (pat_tag(?path, ?children)) { for (@ty tp in path.node.types) { vt(v).visit_ty(tp, e, v); } for (@pat child in children) { vt(v).visit_pat(child, e, v); } } diff --git a/src/comp/middle/walk.rs b/src/comp/middle/walk.rs index 66db8fa07fe..598c6d68f78 100644 --- a/src/comp/middle/walk.rs +++ b/src/comp/middle/walk.rs @@ -185,7 +185,7 @@ fn walk_ty(&ast_visitor v, @ast::ty t) { fn walk_pat(&ast_visitor v, &@ast::pat p) { v.visit_pat_pre(p); alt (p.node) { - case (ast::pat_tag(?path, ?children, _)) { + case (ast::pat_tag(?path, ?children)) { for (@ast::ty tp in path.node.types) { walk_ty(v, tp); } for (@ast::pat child in children) { walk_pat(v, child); } } diff --git a/src/comp/pretty/pprust.rs b/src/comp/pretty/pprust.rs index 1a53c6758dc..04f7522a7d8 100644 --- a/src/comp/pretty/pprust.rs +++ b/src/comp/pretty/pprust.rs @@ -1016,10 +1016,10 @@ fn print_path(&ps s, &ast::path path) { fn print_pat(&ps s, &@ast::pat pat) { maybe_print_comment(s, pat.span.lo); alt (pat.node) { - case (ast::pat_wild(_)) { word(s.s, "_"); } - case (ast::pat_bind(?id, _)) { word(s.s, "?" + id); } - case (ast::pat_lit(?lit, _)) { print_literal(s, lit); } - case (ast::pat_tag(?path, ?args, _)) { + case (ast::pat_wild) { word(s.s, "_"); } + case (ast::pat_bind(?id)) { word(s.s, "?" + id); } + case (ast::pat_lit(?lit)) { print_literal(s, lit); } + case (ast::pat_tag(?path, ?args)) { print_path(s, path); if (vec::len(args) > 0u) { popen(s); @@ -1033,7 +1033,7 @@ fn print_pat(&ps s, &@ast::pat pat) { alt (s.mode) { case (mo_identified) { space(s.s); - synth_comment(s, int::to_str(ty::pat_node_id(pat), 10u)); + synth_comment(s, int::to_str(pat.id, 10u)); } case (_) {/* no-op */ } }