From eb598e5344bde56b0ba12681e7d46c25b2dd1c88 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 15 Oct 2014 13:33:20 +1300 Subject: [PATCH] Allow self as an arg in extension methods --- src/librustc/metadata/encoder.rs | 22 +++---- src/librustc/middle/astencode.rs | 4 +- src/librustc/middle/def.rs | 4 +- src/librustc/middle/privacy.rs | 2 +- src/librustc/middle/resolve.rs | 62 +++++++------------ src/librustc/middle/save/mod.rs | 2 +- src/librustc/middle/trans/callee.rs | 13 ++-- src/librustc/middle/typeck/check/mod.rs | 8 +-- src/librustc/middle/typeck/collect.rs | 13 ++-- .../call-extern-trait-as-function.rs | 17 ----- 10 files changed, 51 insertions(+), 96 deletions(-) delete mode 100644 src/test/compile-fail/call-extern-trait-as-function.rs diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 02f6a4a78db..009a06f5290 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -407,13 +407,10 @@ fn encode_reexported_static_base_methods(ecx: &EncodeContext, method_did.def_id()); match impl_item { ty::MethodTraitItem(ref m) => { - if m.explicit_self == - ty::StaticExplicitSelfCategory { - encode_reexported_static_method(rbml_w, - exp, - m.def_id, - m.ident); - } + encode_reexported_static_method(rbml_w, + exp, + m.def_id, + m.ident); } ty::TypeTraitItem(_) => {} } @@ -434,8 +431,7 @@ fn encode_reexported_static_trait_methods(ecx: &EncodeContext, Some(trait_items) => { for trait_item in trait_items.iter() { match *trait_item { - ty::MethodTraitItem(ref m) if m.explicit_self == - ty::StaticExplicitSelfCategory => { + ty::MethodTraitItem(ref m) => { encode_reexported_static_method(rbml_w, exp, m.def_id, @@ -1408,18 +1404,16 @@ fn add_to_index(item: &Item, rbml_w: &Encoder, encode_family(rbml_w, fn_style_static_method_family( method_ty.fty.fn_style)); - - let pty = ty::lookup_item_type(tcx, - method_def_id); - encode_bounds_and_type(rbml_w, ecx, &pty); } - _ => { encode_family(rbml_w, style_fn_family( method_ty.fty.fn_style)); } } + let pty = ty::lookup_item_type(tcx, + method_def_id); + encode_bounds_and_type(rbml_w, ecx, &pty); is_nonstatic_method = method_ty.explicit_self != ty::StaticExplicitSelfCategory; diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 955228c99de..7cadcb745ca 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -453,8 +453,8 @@ fn tr(&self, dcx: &DecodeContext) -> def::Def { }, p) } - def::DefMethod(did0, did1) => { - def::DefMethod(did0.tr(dcx), did1.map(|did1| did1.tr(dcx))) + def::DefMethod(did0, did1, p) => { + def::DefMethod(did0.tr(dcx), did1.map(|did1| did1.tr(dcx)), p) } def::DefSelfTy(nid) => { def::DefSelfTy(dcx.tr_id(nid)) } def::DefMod(did) => { def::DefMod(did.tr(dcx)) } diff --git a/src/librustc/middle/def.rs b/src/librustc/middle/def.rs index 3b7af9788ac..3facf0b0c0a 100644 --- a/src/librustc/middle/def.rs +++ b/src/librustc/middle/def.rs @@ -46,7 +46,7 @@ pub enum Def { DefTyParamBinder(ast::NodeId), /* struct, impl or trait with ty params */ DefRegion(ast::NodeId), DefLabel(ast::NodeId), - DefMethod(ast::DefId /* method */, Option /* trait */), + DefMethod(ast::DefId /* method */, Option /* trait */, MethodProvenance), } #[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Hash, Show)] @@ -62,7 +62,7 @@ pub fn def_id(&self) -> ast::DefId { DefForeignMod(id) | DefStatic(id, _) | DefVariant(_, id, _) | DefTy(id, _) | DefAssociatedTy(id) | DefTyParam(_, id, _) | DefUse(id) | DefStruct(id) | DefTrait(id) | - DefMethod(id, _) | DefConst(id) => { + DefMethod(id, _, _) | DefConst(id) => { id } DefLocal(id) | diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs index e434d859993..8b9207134ea 100644 --- a/src/librustc/middle/privacy.rs +++ b/src/librustc/middle/privacy.rs @@ -811,7 +811,7 @@ fn check_path(&mut self, span: Span, path_id: ast::NodeId, path: &ast::Path) { def::DefTy(_, true) => ck("enum"), def::DefTrait(..) => ck("trait"), def::DefStruct(..) => ck("struct"), - def::DefMethod(_, Some(..)) => ck("trait method"), + def::DefMethod(_, Some(..), _) => ck("trait method"), def::DefMethod(..) => ck("method"), def::DefMod(..) => ck("module"), _ => {} diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 4ec3fe0279e..bd5ea3a0619 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -250,7 +250,7 @@ enum FallbackSuggestion { Method, TraitItem, StaticMethod(String), - StaticTraitMethod(String), + TraitMethod(String), } enum TypeParameters<'a> { @@ -1386,17 +1386,17 @@ fn build_reduced_graph_for_item(&mut self, .node { SelfStatic => { // Static methods become - // `def_static_method`s. - DefStaticMethod( - local_def(method.id), - FromImpl(local_def(item.id)), - method.pe_fn_style()) + // `DefStaticMethod`s. + DefStaticMethod(local_def(method.id), + FromImpl(local_def(item.id)), + method.pe_fn_style()) } _ => { // Non-static methods become - // `def_method`s. + // `DefMethod`s. DefMethod(local_def(method.id), - None) + None, + FromImpl(local_def(item.id))) } }; @@ -1476,8 +1476,7 @@ fn build_reduced_graph_for_item(&mut self, let (def, static_flag) = match ty_m.explicit_self .node { SelfStatic => { - // Static methods become - // `def_static_method`s. + // Static methods become `DefStaticMethod`s. (DefStaticMethod( local_def(ty_m.id), FromTrait(local_def(item.id)), @@ -1485,10 +1484,10 @@ fn build_reduced_graph_for_item(&mut self, StaticMethodTraitItemKind) } _ => { - // Non-static methods become - // `def_method`s. + // Non-static methods become `DefMethod`s. (DefMethod(local_def(ty_m.id), - Some(local_def(item.id))), + Some(local_def(item.id)), + FromTrait(local_def(item.id))), NonstaticMethodTraitItemKind) } }; @@ -4607,8 +4606,7 @@ fn resolve_implementation(&mut self, // We also need a new scope for the method- // specific type parameters. this.resolve_method( - MethodRibKind(id, - ProvidedMethod(method.id)), + MethodRibKind(id, ProvidedMethod(method.id)), &**method); } TypeImplItem(ref typedef) => { @@ -5393,8 +5391,8 @@ fn resolve_module_relative_path(&mut self, let ident = path.segments.last().unwrap().identifier; let def = match self.resolve_definition_of_name_in_module(containing_module.clone(), - ident.name, - namespace) { + ident.name, + namespace) { NoNameDefinition => { // We failed to resolve the name. Report an error. return None; @@ -5403,26 +5401,6 @@ fn resolve_module_relative_path(&mut self, (def, last_private.or(lp)) } }; - match containing_module.kind.get() { - TraitModuleKind | ImplModuleKind => { - match containing_module.def_id.get() { - Some(def_id) => { - match self.trait_item_map.find(&(ident.name, def_id)) { - Some(&StaticMethodTraitItemKind) => (), - Some(&TypeTraitItemKind) => (), - None => (), - Some(&NonstaticMethodTraitItemKind) => { - debug!("containing module was a trait or impl \ - and name was a method -> not resolved"); - return None; - } - } - }, - _ => (), - } - }, - _ => (), - } match containing_module.def_id.get() { Some(DefId{krate: kid, ..}) => { self.used_crates.insert(kid); }, _ => {} @@ -5668,8 +5646,8 @@ fn get_module(this: &mut Resolver, span: Span, ident_path: &[ast::Ident]) FromTrait(_) => unreachable!() } } - Some(DefMethod(_, None)) if allowed == Everything => return Method, - Some(DefMethod(_, Some(_))) => return TraitItem, + Some(DefMethod(_, None, _)) if allowed == Everything => return Method, + Some(DefMethod(_, Some(_), _)) => return TraitItem, _ => () } } @@ -5684,7 +5662,9 @@ fn get_module(this: &mut Resolver, span: Span, ident_path: &[ast::Ident]) let path_str = self.path_idents_to_string(&trait_ref.path); match self.trait_item_map.find(&(name, did)) { - Some(&StaticMethodTraitItemKind) => return StaticTraitMethod(path_str), + Some(&StaticMethodTraitItemKind) => { + return TraitMethod(path_str) + } Some(_) => return TraitItem, None => {} } @@ -5810,7 +5790,7 @@ fn resolve_expr(&mut self, expr: &Expr) { Method | TraitItem => format!("to call `self.{}`", wrong_name), - StaticTraitMethod(path_str) + TraitMethod(path_str) | StaticMethod(path_str) => format!("to call `{}::{}`", path_str, wrong_name) }; diff --git a/src/librustc/middle/save/mod.rs b/src/librustc/middle/save/mod.rs index 4aba29d7bae..21810b608b4 100644 --- a/src/librustc/middle/save/mod.rs +++ b/src/librustc/middle/save/mod.rs @@ -244,7 +244,7 @@ fn lookup_def_kind(&self, ref_id: NodeId, span: Span) -> Option { def::DefStaticMethod(_, _, _) | def::DefTyParam(..) | def::DefUse(_) | - def::DefMethod(_, _) | + def::DefMethod(..) | def::DefPrimTy(_) => { self.sess.span_bug(span, format!("lookup_def_kind for unexpected item: {:?}", def).as_slice()); diff --git a/src/librustc/middle/trans/callee.rs b/src/librustc/middle/trans/callee.rs index a0a67cc774f..bb32fdcea7e 100644 --- a/src/librustc/middle/trans/callee.rs +++ b/src/librustc/middle/trans/callee.rs @@ -137,7 +137,9 @@ fn fn_callee<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, llfn: ValueRef) }; } - fn trans_def<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, def: def::Def, ref_expr: &ast::Expr) + fn trans_def<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, + def: def::Def, + ref_expr: &ast::Expr) -> Callee<'blk, 'tcx> { debug!("trans_def(def={}, ref_expr={})", def.repr(bcx.tcx()), ref_expr.repr(bcx.tcx())); let expr_ty = node_id_type(bcx, ref_expr.id); @@ -165,14 +167,13 @@ fn trans_def<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, def: def::Def, ref_expr: &ast:: let def_id = inline::maybe_instantiate_inline(bcx.ccx(), did); Callee { bcx: bcx, data: Intrinsic(def_id.node, substs) } } - def::DefFn(did, _, _) | def::DefMethod(did, _) | + def::DefFn(did, _, _) | def::DefMethod(did, _, def::FromImpl(_)) | def::DefStaticMethod(did, def::FromImpl(_), _) => { fn_callee(bcx, trans_fn_ref(bcx, did, ExprId(ref_expr.id))) } - def::DefStaticMethod(impl_did, - def::FromTrait(trait_did), - _) => { - fn_callee(bcx, meth::trans_static_method_callee(bcx, impl_did, + def::DefStaticMethod(meth_did, def::FromTrait(trait_did), _) | + def::DefMethod(meth_did, _, def::FromTrait(trait_did)) => { + fn_callee(bcx, meth::trans_static_method_callee(bcx, meth_did, trait_did, ref_expr.id)) } diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index fbc5fb8936a..d88e01f6e49 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -5027,10 +5027,9 @@ pub fn polytype_for_def(fcx: &FnCtxt, let typ = fcx.local_ty(sp, nid); return no_params(typ); } - def::DefFn(id, _, _) | def::DefStaticMethod(id, _, _) | + def::DefFn(id, _, _) | def::DefStaticMethod(id, _, _) | def::DefMethod(id, _, _) | def::DefStatic(id, _) | def::DefVariant(_, id, _) | - def::DefStruct(id) | def::DefConst(id) | - def::DefMethod(id, _) => { + def::DefStruct(id) | def::DefConst(id) => { return ty::lookup_item_type(fcx.ccx.tcx, id); } def::DefTrait(_) | @@ -5229,8 +5228,7 @@ pub fn instantiate_path(fcx: &FnCtxt, } fcx.add_obligations_for_parameters( - traits::ObligationCause::new(span, - traits::ItemObligation(def.def_id())), + traits::ObligationCause::new(span, traits::ItemObligation(def.def_id())), &substs, &polytype.generics); diff --git a/src/librustc/middle/typeck/collect.rs b/src/librustc/middle/typeck/collect.rs index 100dffb547b..6e25b23daac 100644 --- a/src/librustc/middle/typeck/collect.rs +++ b/src/librustc/middle/typeck/collect.rs @@ -77,10 +77,12 @@ fn collect_intrinsic_type(ccx: &CrateCtxt, } match ccx.tcx.lang_items.ty_desc() { - Some(id) => { collect_intrinsic_type(ccx, id); } None => {} + Some(id) => { collect_intrinsic_type(ccx, id); } + None => {} } match ccx.tcx.lang_items.opaque() { - Some(id) => { collect_intrinsic_type(ccx, id); } None => {} + Some(id) => { collect_intrinsic_type(ccx, id); } + None => {} } let mut visitor = CollectTraitDefVisitor{ ccx: ccx }; @@ -306,10 +308,7 @@ fn collect_trait_methods(ccx: &CrateCtxt, } }); - if ty_method.explicit_self == - ty::StaticExplicitSelfCategory { - make_static_method_ty(ccx, &*ty_method); - } + make_method_ty(ccx, &*ty_method); tcx.impl_or_trait_items .borrow_mut() @@ -364,7 +363,7 @@ fn collect_trait_methods(ccx: &CrateCtxt, _ => { /* Ignore things that aren't traits */ } } - fn make_static_method_ty(ccx: &CrateCtxt, m: &ty::Method) { + fn make_method_ty(ccx: &CrateCtxt, m: &ty::Method) { ccx.tcx.tcache.borrow_mut().insert( m.def_id, Polytype { diff --git a/src/test/compile-fail/call-extern-trait-as-function.rs b/src/test/compile-fail/call-extern-trait-as-function.rs deleted file mode 100644 index 86ebeedda67..00000000000 --- a/src/test/compile-fail/call-extern-trait-as-function.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2013 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. - -// issue #6698 - -fn V() -> bool { - std::clone::Clone::clone(true) //~ ERROR error: unresolved name `std::clone::Clone::clone`. -} - -fn main() {} -- GitLab