]> git.lizzy.rs Git - rust.git/commitdiff
Bounded protocols work well enough to compile core, but map reduce has too many type...
authorEric Holk <eric.holk@gmail.com>
Wed, 25 Jul 2012 01:00:08 +0000 (18:00 -0700)
committerEric Holk <eric.holk@gmail.com>
Wed, 25 Jul 2012 19:12:25 +0000 (12:12 -0700)
src/libsyntax/ext/pipes/pipec.rs
src/libsyntax/ext/pipes/proto.rs

index a322409e857dcbec7d3460feeee84afeef8a5c78..529a5953dd5137a91c58681fdb29e6938921717d 100644 (file)
@@ -110,7 +110,8 @@ fn gen_send(cx: ext_ctxt) -> @ast::item {
 
             cx.item_fn_poly(self.name(),
                             args_ast,
-                            cx.ty_path_ast_builder(path(next.data_name(), span)
+                            cx.ty_path_ast_builder(path(next.data_name(),
+                                                        span)
                                       .add_tys(next_tys)),
                             self.get_params(),
                             cx.expr_block(body))
@@ -230,7 +231,6 @@ fn to_endpoint_decls(cx: ext_ctxt, dir: direction) -> ~[@ast::item] {
                           self.ty_params));
         }
         else {
-            let ext_cx = cx;
             vec::push(items,
                       cx.item_ty_poly(
                           self.data_name(),
@@ -240,7 +240,7 @@ fn to_endpoint_decls(cx: ext_ctxt, dir: direction) -> ~[@ast::item] {
                               .add_tys(~[cx.ty_path_ast_builder(
                                   (self.proto.name + self.data_name())
                                   .add_tys(cx.ty_vars(self.ty_params))),
-                                         #ast[ty] { buffer }])),
+                                         self.proto.buffer_ty_path(cx)])),
                           self.ty_params));
         };
         items
@@ -288,7 +288,7 @@ fn gen_init(cx: ext_ctxt) -> @ast::item {
 
     fn gen_buffer_init(ext_cx: ext_ctxt) -> @ast::expr {
         ext_cx.rec(self.states.map_to_vec(|s| {
-            let fty = ext_cx.ty_path_ast_builder(path(s.name, s.span));
+            let fty = s.to_ty(ext_cx);
             ext_cx.field_imm(s.name, #ast { pipes::mk_packet::<$(fty)>() })
         }))
     }
@@ -318,19 +318,40 @@ fn gen_init_bounded(ext_cx: ext_ctxt) -> @ast::expr {
         }}
     }
 
+    fn buffer_ty_path(cx: ext_ctxt) -> @ast::ty {
+        let mut params = ~[];
+        for (copy self.states).each |s| {
+            for s.ty_params.each |tp| {
+                if !params.contains(tp) {
+                    vec::push(params, tp);
+                }
+            }
+        }
+
+        cx.ty_path_ast_builder(path(@~"buffer", self.span)
+                               .add_tys(cx.ty_vars(params)))
+    }
+
     fn gen_buffer_type(cx: ext_ctxt) -> @ast::item {
         let ext_cx = cx;
-        cx.item_ty(
+        let mut params = ~[];
+        let fields = do (copy self.states).map_to_vec |s| {
+            for s.ty_params.each |tp| {
+                if !params.contains(tp) {
+                    vec::push(params, tp);
+                }
+            }
+            let ty = s.to_ty(cx);
+            let fty = #ast[ty] {
+                pipes::packet<$(ty)>
+            };
+            cx.ty_field_imm(s.name, fty)
+        };
+
+        cx.item_ty_poly(
             @~"buffer",
-            cx.ty_rec(
-                (copy self.states).map_to_vec(
-                    |s| {
-                        let ty = cx.ty_path_ast_builder(path(s.name, s.span));
-                        let fty = #ast[ty] {
-                            pipes::packet<$(ty)>
-                        };
-                        cx.ty_field_imm(s.name, fty)
-                    })))
+            cx.ty_rec(fields),
+            params)
     }
 
     fn compile(cx: ext_ctxt) -> @ast::item {
index 8fe995de09150a24fdbb023ef5655833f16a60e7..1adff98f31cabea93fa438cc570f3a37280def44 100644 (file)
@@ -74,7 +74,7 @@ enum state {
 }
 
 impl methods for state {
-    fn add_message(name: ident, span: span, 
+    fn add_message(name: ident, span: span,
                    +data: ~[@ast::ty], next: next_state) {
         self.messages.push(message(name, span, data, self,
                                    next));
@@ -88,6 +88,7 @@ fn data_name() -> ident {
         self.name
     }
 
+    /// Returns the type that is used for the messages.
     fn to_ty(cx: ext_ctxt) -> @ast::ty {
         cx.ty_path_ast_builder
             (path(self.name, self.span).add_tys(cx.ty_vars(self.ty_params)))