diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-08-03 15:02:01 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-08-03 15:02:53 -0700 |
| commit | b65dd9d0908ba75ee4cf128058858aea87e4508a (patch) | |
| tree | 794ee6f47d188314a2b0256fd954cbcf8219331c /src/libsyntax | |
| parent | a805a1fb37443601819604954510cb312a724fe9 (diff) | |
| download | rust-b65dd9d0908ba75ee4cf128058858aea87e4508a.tar.gz rust-b65dd9d0908ba75ee4cf128058858aea87e4508a.zip | |
rustc: Parse, serialize, and deserialize trait inheritance
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ast_map.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 3 |
6 files changed, 31 insertions, 6 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 1b60cb6c47b..34144a9f031 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -724,7 +724,7 @@ enum item_ { /* dtor is optional */ option<class_dtor> ), - item_trait(~[ty_param], ~[trait_method]), + item_trait(~[ty_param], ~[@trait_ref], ~[trait_method]), item_impl(~[ty_param], ~[@trait_ref], /* traits this impl implements */ @ty, /* self */ diff --git a/src/libsyntax/ast_map.rs b/src/libsyntax/ast_map.rs index acd20951328..c8daae0982d 100644 --- a/src/libsyntax/ast_map.rs +++ b/src/libsyntax/ast_map.rs @@ -231,7 +231,15 @@ fn map_item(i: @item, cx: ctx, v: vt) { // only need to handle methods do vec::iter(ms) |m| { map_method(d_id, p, m, cx); } } - item_trait(tps, methods) { + item_trait(tps, traits, methods) { + // Map trait refs to their parent classes. This is + // so we can find the self_ty + for traits.each |p| { + cx.map.insert(p.ref_id, node_item(i, item_path)); + // This is so we can look up the right things when + // encoding/decoding + cx.map.insert(p.impl_id, node_item(i, item_path)); + } for methods.each |tm| { let id = ast_util::trait_method_to_ty_method(tm).id; let d_id = ast_util::local_def(i.id); diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index bbf6df468f8..5fa9c584bc4 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -279,8 +279,9 @@ fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ { fld.fold_ty(ty), vec::map(methods, |x| fld.fold_method(x))) } - item_trait(tps, methods) { + item_trait(tps, traits, methods) { item_trait(fold_ty_params(tps, fld), + vec::map(traits, |p| fold_trait_ref(p, fld)), /* FIXME (#2543) */ copy methods) } item_mac(m) { diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 417d973ee0d..5f2ea6f42f6 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2278,8 +2278,18 @@ class parser { let ident = self.parse_ident(); self.parse_region_param(); let tps = self.parse_ty_params(); + + // Parse traits, if necessary. + let traits; + if self.token == token::COLON { + self.bump(); + traits = self.parse_trait_ref_list(token::LBRACE); + } else { + traits = ~[]; + } + let meths = self.parse_trait_methods(); - (ident, item_trait(tps, meths), none) + (ident, item_trait(tps, traits, meths), none) } // Parses four variants (with the region/type params always optional): diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index feea800b44c..c4b643de8d7 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -590,10 +590,15 @@ fn print_item(s: ps, &&item: @ast::item) { } bclose(s, item.span); } - ast::item_trait(tps, methods) { + ast::item_trait(tps, traits, methods) { head(s, ~"trait"); word(s.s, *item.ident); print_type_params(s, tps); + if vec::len(traits) != 0u { + word_space(s, ~":"); + commasep(s, inconsistent, traits, |s, p| + print_path(s, p.path, false)); + } word(s.s, ~" "); bopen(s); for methods.each |meth| { print_trait_method(s, meth); } diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index f2159af34e7..61cbba5fc1f 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -162,8 +162,9 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) { ast_util::local_def(i.id), e, v) }; } - item_trait(tps, methods) { + item_trait(tps, traits, methods) { v.visit_ty_params(tps, e, v); + for traits.each |p| { visit_path(p.path, e, v); } for methods.each |m| { v.visit_trait_method(m, e, v); } |
