From e02716e6d3a65bde24f49207274a74a22790a201 Mon Sep 17 00:00:00 2001 From: Tom Lee Date: Sat, 11 May 2013 21:46:30 -0700 Subject: [PATCH 1/3] Reexport static trait methods on traits in the same module. --- src/librustc/metadata/encoder.rs | 6 ++++-- .../auxiliary/mod_trait_with_static_methods_lib.rs | 10 ++++++++++ .../run-pass/trait_with_static_methods_cross_crate.rs | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 8c21998768e95..78adee4b4f2f1 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -386,8 +386,10 @@ fn encode_reexported_static_methods(ecx: @EncodeContext, 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 { + Some(&ast_map::node_item(item, path)) => { + let interner = ecx.tcx.sess.parse_sess.interner; + let original_name = ecx.tcx.sess.str_of(item.ident); + if mod_path != *path || *exp.name != *original_name { for methods.each |&m| { if m.explicit_self == ast::sty_static { encode_reexported_static_method(ecx, diff --git a/src/test/auxiliary/mod_trait_with_static_methods_lib.rs b/src/test/auxiliary/mod_trait_with_static_methods_lib.rs index 2099c6a2f2f2f..3591ff7931855 100644 --- a/src/test/auxiliary/mod_trait_with_static_methods_lib.rs +++ b/src/test/auxiliary/mod_trait_with_static_methods_lib.rs @@ -9,6 +9,15 @@ // except according to those terms. pub use sub_foo::Foo; +pub use Baz = self::Bar; + +pub trait Bar { + pub fn bar() -> Self; +} + +impl Bar for int { + pub fn bar() -> int { 84 } +} pub mod sub_foo { pub trait Foo { @@ -18,4 +27,5 @@ pub mod sub_foo { 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 index 20dcbf3267b70..4402881c43ddd 100644 --- a/src/test/run-pass/trait_with_static_methods_cross_crate.rs +++ b/src/test/run-pass/trait_with_static_methods_cross_crate.rs @@ -13,7 +13,9 @@ extern mod mod_trait_with_static_methods_lib; use mod_trait_with_static_methods_lib::Foo; +use mod_trait_with_static_methods_lib::Baz; pub fn main() { assert_eq!(42, Foo::foo()); + assert_eq!(84, Baz::bar()); } From cac97d7ee565eef14b9e7385d1c088c1eb0a9295 Mon Sep 17 00:00:00 2001 From: Tom Lee Date: Sun, 12 May 2013 12:19:28 -0700 Subject: [PATCH 2/3] Remove unused variable. --- src/librustc/metadata/encoder.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 78adee4b4f2f1..110d17b9b15bf 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -387,7 +387,6 @@ fn encode_reexported_static_methods(ecx: @EncodeContext, Some(methods) => { match ecx.tcx.items.find(&exp.def_id.node) { Some(&ast_map::node_item(item, path)) => { - let interner = ecx.tcx.sess.parse_sess.interner; let original_name = ecx.tcx.sess.str_of(item.ident); if mod_path != *path || *exp.name != *original_name { for methods.each |&m| { From e3a91f60c58d537945abc4c83b1b9f6ddcbe21fe Mon Sep 17 00:00:00 2001 From: Tom Lee Date: Sat, 18 May 2013 21:31:55 -0700 Subject: [PATCH 3/3] Explain an odd conditional check. --- src/librustc/metadata/encoder.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 110d17b9b15bf..460da5d60b33f 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -388,6 +388,17 @@ fn encode_reexported_static_methods(ecx: @EncodeContext, match ecx.tcx.items.find(&exp.def_id.node) { Some(&ast_map::node_item(item, path)) => { let original_name = ecx.tcx.sess.str_of(item.ident); + + // + // We don't need to reexport static methods on traits + // declared in the same module as our `pub use ...` since + // that's done when we encode the trait item. + // + // The only exception is when the reexport *changes* the + // name e.g. `pub use Foo = self::Bar` -- we have + // encoded metadata for static methods relative to Bar, + // but not yet for Foo. + // if mod_path != *path || *exp.name != *original_name { for methods.each |&m| { if m.explicit_self == ast::sty_static {