From fc9c4c32451dadab4f8a81897e8fc83ae6473d95 Mon Sep 17 00:00:00 2001 From: Lindsey Kuper Date: Tue, 10 Jul 2012 13:44:20 -0700 Subject: Front-end support for default impls in traits. --- src/libsyntax/visit.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'src/libsyntax/visit.rs') diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 5dc42fd4823..be9f76650da 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -62,6 +62,7 @@ type visitor = visit_constr: fn@(@path, span, node_id, E, vt), visit_fn: fn@(fn_kind, fn_decl, blk, span, node_id, E, vt), visit_ty_method: fn@(ty_method, E, vt), + visit_trait_method: fn@(trait_method, E, vt), visit_class_item: fn@(@class_member, E, vt)}; fn default_visitor() -> visitor { @@ -81,6 +82,7 @@ fn default_visitor() -> visitor { visit_constr: |a,b,c,d,e|visit_constr::(a, b, c, d, e), visit_fn: |a,b,c,d,e,f,g|visit_fn::(a, b, c, d, e, f, g), visit_ty_method: |a,b,c|visit_ty_method::(a, b, c), + visit_trait_method: |a,b,c|visit_trait_method::(a, b, c), visit_class_item: |a,b,c|visit_class_item::(a, b, c)}; } @@ -160,7 +162,7 @@ fn visit_item(i: @item, e: E, v: vt) { item_trait(tps, methods) { v.visit_ty_params(tps, e, v); for methods.each |m| { - v.visit_ty_method(m, e, v); + v.visit_trait_method(m, e, v); } } item_mac(m) { visit_mac(m, e, v) } @@ -317,6 +319,17 @@ fn visit_ty_method(m: ty_method, e: E, v: vt) { v.visit_ty(m.decl.output, e, v); } +fn visit_trait_method(m: trait_method, e: E, v: vt) { + alt m { + required(ty_m) { + v.visit_ty_method(ty_m, e, v) + } + provided(m) { + visit_method_helper(m, e, v) + } + } +} + fn visit_block(b: ast::blk, e: E, v: vt) { for b.node.view_items.each |vi| { v.visit_view_item(vi, e, v); } for b.node.stmts.each |s| { v.visit_stmt(s, e, v); } @@ -465,6 +478,7 @@ type simple_visitor = visit_constr: fn@(@path, span, node_id), visit_fn: fn@(fn_kind, fn_decl, blk, span, node_id), visit_ty_method: fn@(ty_method), + visit_trait_method: fn@(trait_method), visit_class_item: fn@(@class_member)}; fn simple_ignore_ty(_t: @ty) {} @@ -487,6 +501,7 @@ fn default_simple_visitor() -> simple_visitor { visit_fn: fn@(_fk: fn_kind, _d: fn_decl, _b: blk, _sp: span, _id: node_id) { }, visit_ty_method: fn@(_m: ty_method) { }, + visit_trait_method: fn@(_m: trait_method) { }, visit_class_item: fn@(_c: @class_member) {} }; } @@ -546,6 +561,11 @@ fn mk_simple_visitor(v: simple_visitor) -> vt<()> { f(ty); visit_ty_method(ty, e, v); } + fn v_trait_method(f: fn@(trait_method), m: trait_method, &&e: (), + v: vt<()>) { + f(m); + visit_trait_method(m, e, v); + } fn v_ty_params(f: fn@(~[ty_param]), ps: ~[ty_param], &&e: (), v: vt<()>) { @@ -596,6 +616,8 @@ fn mk_simple_visitor(v: simple_visitor) -> vt<()> { v_fn(v.visit_fn, a, b, c, d, e, f, g), visit_ty_method: |a,b,c| v_ty_method(v.visit_ty_method, a, b, c), + visit_trait_method: |a,b,c| + v_trait_method(v.visit_trait_method, a, b, c), visit_class_item: |a,b,c| v_class_item(v.visit_class_item, a, b, c) }); -- cgit 1.4.1-3-g733a5