about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTom Lee <github@tomlee.co>2013-05-08 23:13:53 -0700
committerTom Lee <github@tomlee.co>2013-05-09 23:00:03 -0700
commit9042e1e8de522ffa48ce6a543130bc72ea04d517 (patch)
treeb591d257f9a3ea58d7e93cda76ec9db13dd08f94
parentad8e236f32fccf6ec99025e2ba77f79b4c98d399 (diff)
downloadrust-9042e1e8de522ffa48ce6a543130bc72ea04d517.tar.gz
rust-9042e1e8de522ffa48ce6a543130bc72ea04d517.zip
Include static methods on traits in reexports.
-rw-r--r--src/librustc/metadata/encoder.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index 6c02ece9289..d2b56863d1a 100644
--- a/src/librustc/metadata/encoder.rs
+++ b/src/librustc/metadata/encoder.rs
@@ -363,6 +363,47 @@ fn encode_path(ecx: @EncodeContext,
     ebml_w.end_tag();
 }
 
+fn encode_reexported_static_method(ecx: @EncodeContext,
+                                   ebml_w: &mut writer::Encoder,
+                                   exp: &middle::resolve::Export2,
+                                   m: @ty::method) {
+    debug!("(encode static trait method) reexport '%s::%s'",
+            *exp.name, *ecx.tcx.sess.str_of(m.ident));
+    ebml_w.start_tag(tag_items_data_item_reexport);
+    ebml_w.start_tag(tag_items_data_item_reexport_def_id);
+    ebml_w.wr_str(def_to_str(m.def_id));
+    ebml_w.end_tag();
+    ebml_w.start_tag(tag_items_data_item_reexport_name);
+    ebml_w.wr_str(*exp.name + "::" + *ecx.tcx.sess.str_of(m.ident));
+    ebml_w.end_tag();
+    ebml_w.end_tag();
+}
+
+fn encode_reexported_static_methods(ecx: @EncodeContext,
+                                    ebml_w: &mut writer::Encoder,
+                                    mod_path: &[ast_map::path_elt],
+                                    exp: &middle::resolve::Export2) {
+    match ecx.tcx.trait_methods_cache.find(&exp.def_id) {
+        Some(methods) => {
+            match ecx.tcx.items.find(&exp.def_id.node) {
+                Some(&ast_map::node_item(_, path)) => {
+                    if mod_path != *path {
+                        for methods.each |&m| {
+                            if m.self_ty  == ast::sty_static {
+                                encode_reexported_static_method(ecx,
+                                                                ebml_w,
+                                                                exp, m);
+                            }
+                        }
+                    }
+                }
+                _ => {}
+            }
+        }
+        _ => {}
+    }
+}
+
 fn encode_info_for_mod(ecx: @EncodeContext,
                        ebml_w: &mut writer::Encoder,
                        md: &_mod,
@@ -413,6 +454,7 @@ fn encode_info_for_mod(ecx: @EncodeContext,
                 ebml_w.wr_str(*exp.name);
                 ebml_w.end_tag();
                 ebml_w.end_tag();
+                encode_reexported_static_methods(ecx, ebml_w, path, exp);
             }
         }
         None => {