about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-05-11 00:43:51 -0700
committerbors <bors@rust-lang.org>2013-05-11 00:43:51 -0700
commit18a47f9580c0757f76d6b56081931d10a7859b18 (patch)
treee860694d1ab5c3d494453be925cfbb9e87c78720
parentd43d3e538c42798db0706983ba7696b44f6764eb (diff)
parent1e241ce52bbba72e1641f44f83ced0bfea4717f9 (diff)
downloadrust-18a47f9580c0757f76d6b56081931d10a7859b18.tar.gz
rust-18a47f9580c0757f76d6b56081931d10a7859b18.zip
auto merge of #6384 : thomaslee/rust/issue-4202, r=catamorphism
This fixes the issue described in #4202.

From what I understood of the code, when we reexport a trait in a submodule using e.g. "pub use foo::SomeTrait", we were not previously making an effort to reexport the static methods on that trait.

I'm new to the Rust code base (and the Rust language itself) so my approach may not be kosher, but this patch works by changing the encoder to include the static methods associated with traits.

I couldn't see any tests for this area of the code, so I didn't really have any examples to go by. If tests are needed, I'm happy to work through that if I can get some assistance to do so.
-rw-r--r--src/librustc/metadata/encoder.rs42
-rw-r--r--src/test/auxiliary/mod_trait_with_static_methods_lib.rs22
-rw-r--r--src/test/run-pass/trait_with_static_methods_cross_crate.rs19
3 files changed, 83 insertions, 0 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index 2666c52f1ee..9fa0ad438cc 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 => {
diff --git a/src/test/auxiliary/mod_trait_with_static_methods_lib.rs b/src/test/auxiliary/mod_trait_with_static_methods_lib.rs
new file mode 100644
index 00000000000..b060c7aee49
--- /dev/null
+++ b/src/test/auxiliary/mod_trait_with_static_methods_lib.rs
@@ -0,0 +1,22 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+pub use sub_foo::Foo;
+
+pub mod sub_foo {
+    pub trait Foo {
+        pub fn foo() -> Self;
+    }
+
+    impl Foo for int {
+        pub fn foo() -> int { 42 }
+    }
+}
+
diff --git a/src/test/run-pass/trait_with_static_methods_cross_crate.rs b/src/test/run-pass/trait_with_static_methods_cross_crate.rs
new file mode 100644
index 00000000000..1af86294680
--- /dev/null
+++ b/src/test/run-pass/trait_with_static_methods_cross_crate.rs
@@ -0,0 +1,19 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// xfail-fast
+// aux-build:mod_trait_with_static_methods_lib.rs
+extern mod mod_trait_with_static_methods_lib;
+
+use mod_trait_with_static_methods_lib::Foo;
+
+pub fn main() {
+    assert!(42 == Foo::foo());
+}