about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-08-03 15:02:01 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-08-03 15:02:53 -0700
commitb65dd9d0908ba75ee4cf128058858aea87e4508a (patch)
tree794ee6f47d188314a2b0256fd954cbcf8219331c /src/libsyntax
parenta805a1fb37443601819604954510cb312a724fe9 (diff)
downloadrust-b65dd9d0908ba75ee4cf128058858aea87e4508a.tar.gz
rust-b65dd9d0908ba75ee4cf128058858aea87e4508a.zip
rustc: Parse, serialize, and deserialize trait inheritance
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs2
-rw-r--r--src/libsyntax/ast_map.rs10
-rw-r--r--src/libsyntax/fold.rs3
-rw-r--r--src/libsyntax/parse/parser.rs12
-rw-r--r--src/libsyntax/print/pprust.rs7
-rw-r--r--src/libsyntax/visit.rs3
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);
         }