From 4e7d86c079d9b4862bcf72a2a3b1093264fc5731 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Thu, 16 Oct 2014 17:40:01 +1300 Subject: [PATCH] Resolve methods called as functions and... ...defined in another crate. Fixes #18061 --- src/librustc/metadata/decoder.rs | 6 ++++ src/librustc/metadata/encoder.rs | 47 ++++++++++++++++++-------------- src/librustc/middle/resolve.rs | 7 +---- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 22ebaa40eb20b..d72b370864a82 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -115,6 +115,8 @@ enum Family { CtorFn, // o StaticMethod, // F UnsafeStaticMethod, // U + Method, // h + UnsafeMethod, // H Type, // y ForeignType, // T Mod, // m @@ -141,6 +143,8 @@ fn item_family(item: rbml::Doc) -> Family { 'o' => CtorFn, 'F' => StaticMethod, 'U' => UnsafeStaticMethod, + 'h' => Method, + 'H' => UnsafeMethod, 'y' => Type, 'T' => ForeignType, 'm' => Mod, @@ -312,6 +316,8 @@ fn item_to_def_like(item: rbml::Doc, did: ast::DefId, cnum: ast::CrateNum) UnsafeFn => DlDef(def::DefFn(did, ast::UnsafeFn, false)), Fn => DlDef(def::DefFn(did, ast::NormalFn, false)), CtorFn => DlDef(def::DefFn(did, ast::NormalFn, true)), + UnsafeMethod => DlDef(def::DefMethod(did, ast::UnsafeFn, false)), + Method => DlDef(def::DefMethod(did, ast::NormalFn, false)), StaticMethod | UnsafeStaticMethod => { let fn_style = if fam == UnsafeStaticMethod { ast::UnsafeFn diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index fd983075218a5..2769d71327370 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -840,7 +840,7 @@ fn encode_method_ty_fields(ecx: &EncodeContext, ty::StaticExplicitSelfCategory => { encode_family(rbml_w, fn_style_static_method_family(fn_style)); } - _ => encode_family(rbml_w, style_fn_family(fn_style)) + _ => encode_family(rbml_w, fn_style_method_family(fn_style)) } encode_provided_source(rbml_w, method_ty.provided_source); } @@ -978,6 +978,13 @@ fn fn_style_static_method_family(s: FnStyle) -> char { } } +fn fn_style_method_family(s: FnStyle) -> char { + match s { + UnsafeFn => 'h', + NormalFn => 'H', + } +} + fn should_inline(attrs: &[Attribute]) -> bool { use syntax::attr::*; @@ -1407,7 +1414,7 @@ fn encode_info_for_item(ecx: &EncodeContext, } _ => { encode_family(rbml_w, - style_fn_family( + fn_style_method_family( method_ty.fty.fn_style)); } } @@ -1432,30 +1439,30 @@ fn encode_info_for_item(ecx: &EncodeContext, encode_parent_sort(rbml_w, 't'); let trait_item = &ms[i]; - match &ms[i] { - &RequiredMethod(ref tm) => { - encode_attributes(rbml_w, tm.attrs.as_slice()); + let foo = |rbml_w: &mut Encoder| { + // If this is a static method, we've already + // encoded this. + if is_nonstatic_method { + // FIXME: I feel like there is something funny + // going on. + let pty = ty::lookup_item_type(tcx, item_def_id.def_id()); + encode_bounds_and_type(rbml_w, ecx, &pty); + } + }; + match trait_item { + &RequiredMethod(ref m) => { + encode_attributes(rbml_w, m.attrs.as_slice()); + foo(rbml_w); encode_item_sort(rbml_w, 'r'); - encode_method_argument_names(rbml_w, &*tm.decl); + encode_method_argument_names(rbml_w, &*m.decl); } &ProvidedMethod(ref m) => { encode_attributes(rbml_w, m.attrs.as_slice()); - // If this is a static method, we've already - // encoded this. - if is_nonstatic_method { - // FIXME: I feel like there is something funny - // going on. - let pty = ty::lookup_item_type(tcx, - item_def_id.def_id()); - encode_bounds_and_type(rbml_w, ecx, &pty); - } + foo(rbml_w); encode_item_sort(rbml_w, 'p'); - encode_inlined_item(ecx, - rbml_w, - IITraitItemRef(def_id, trait_item)); - encode_method_argument_names(rbml_w, - &*m.pe_fn_decl()); + encode_inlined_item(ecx, rbml_w, IITraitItemRef(def_id, trait_item)); + encode_method_argument_names(rbml_w, &*m.pe_fn_decl()); } &TypeTraitItem(ref associated_type) => { diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 383a60e51da7b..7b21b8666e2b8 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -1837,7 +1837,7 @@ impl<'a> Resolver<'a> { csearch::get_tuple_struct_definition_if_ctor(&self.session.cstore, ctor_id) .map_or(def, |_| DefStruct(ctor_id)), DUMMY_SP, is_public); } - DefFn(..) | DefStaticMethod(..) | DefStatic(..) | DefConst(..) => { + DefFn(..) | DefStaticMethod(..) | DefStatic(..) | DefConst(..) | DefMethod(..) => { debug!("(building reduced graph for external \ crate) building value (fn/static) {}", final_ident); child_name_bindings.define_value(def, DUMMY_SP, is_public); @@ -1902,11 +1902,6 @@ impl<'a> Resolver<'a> { // Record the def ID and fields of this struct. self.structs.insert(def_id, fields); } - DefMethod(..) => { - debug!("(building reduced graph for external crate) \ - ignoring {}", def); - // Ignored; handled elsewhere. - } DefLocal(..) | DefPrimTy(..) | DefTyParam(..) | DefUse(..) | DefUpvar(..) | DefRegion(..) | DefTyParamBinder(..) | DefLabel(..) | DefSelfTy(..) => {