diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 6c02ece9289ae..d2b56863d1a15 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 0000000000000..b060c7aee49a2 --- /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 or the MIT license +// , 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 0000000000000..1af8629468024 --- /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 or the MIT license +// , 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()); +}