diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2016-12-04 03:18:11 +0200 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2016-12-28 11:21:45 +0200 |
| commit | 6ebb6fdbee7f0d250e50e4d84d9aede293cf3bb3 (patch) | |
| tree | f40bc78586832c7af3feca2507fbc1a2b8b2316b /src/librustc | |
| parent | 0807104c8fa90b084748940f7a7980b5a765264e (diff) | |
| download | rust-6ebb6fdbee7f0d250e50e4d84d9aede293cf3bb3.tar.gz rust-6ebb6fdbee7f0d250e50e4d84d9aede293cf3bb3.zip | |
hir: lower `ImplicitSelf` to resolved `Self` TyQPath's.
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/hir/lowering.rs | 27 | ||||
| -rw-r--r-- | src/librustc/hir/mod.rs | 38 | ||||
| -rw-r--r-- | src/librustc/hir/print.rs | 45 | ||||
| -rw-r--r-- | src/librustc/ty/mod.rs | 2 |
4 files changed, 27 insertions, 85 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index 1cf5e35a095..d1fe19364b4 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -259,7 +259,7 @@ impl<'a> LoweringContext<'a> { P(hir::Ty { id: t.id, node: match t.node { - TyKind::Infer | TyKind::ImplicitSelf => hir::TyInfer, + TyKind::Infer => hir::TyInfer, TyKind::Slice(ref ty) => hir::TySlice(self.lower_ty(ty)), TyKind::Ptr(ref mt) => hir::TyPtr(self.lower_mt(mt)), TyKind::Rptr(ref region, ref mt) => { @@ -283,6 +283,16 @@ impl<'a> LoweringContext<'a> { TyKind::Path(ref qself, ref path) => { hir::TyPath(self.lower_qpath(t.id, qself, path, ParamMode::Explicit)) } + TyKind::ImplicitSelf => { + hir::TyPath(hir::QPath::Resolved(None, P(hir::Path { + def: self.expect_full_def(t.id), + segments: hir_vec![hir::PathSegment { + name: keywords::SelfType.name(), + parameters: hir::PathParameters::none() + }], + span: t.span, + }))) + } TyKind::ObjectSum(ref ty, ref bounds) => { hir::TyObjectSum(self.lower_ty(ty), self.lower_bounds(bounds)) } @@ -976,7 +986,7 @@ impl<'a> LoweringContext<'a> { ImplItemKind::Const(..) => hir::AssociatedItemKind::Const, ImplItemKind::Type(..) => hir::AssociatedItemKind::Type, ImplItemKind::Method(ref sig, _) => hir::AssociatedItemKind::Method { - has_self: sig.decl.get_self().is_some(), + has_self: sig.decl.has_self(), }, ImplItemKind::Macro(..) => unimplemented!(), }, @@ -1051,24 +1061,13 @@ impl<'a> LoweringContext<'a> { } fn lower_method_sig(&mut self, sig: &MethodSig) -> hir::MethodSig { - let hir_sig = hir::MethodSig { + hir::MethodSig { generics: self.lower_generics(&sig.generics), abi: sig.abi, unsafety: self.lower_unsafety(sig.unsafety), constness: self.lower_constness(sig.constness), decl: self.lower_fn_decl(&sig.decl), - }; - // Check for `self: _` and `self: &_` - if let Some(SelfKind::Explicit(..)) = sig.decl.get_self().map(|eself| eself.node) { - match hir_sig.decl.get_self().map(|eself| eself.node) { - Some(hir::SelfKind::Value(..)) | Some(hir::SelfKind::Region(..)) => { - self.diagnostic().span_err(sig.decl.inputs[0].ty.span, - "the type placeholder `_` is not allowed within types on item signatures"); - } - _ => {} - } } - hir_sig } fn lower_unsafety(&mut self, u: Unsafety) -> hir::Unsafety { diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index 4eee76d466a..d135762ae82 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -35,8 +35,8 @@ use hir::def_id::DefId; use util::nodemap::{NodeMap, FxHashSet}; use rustc_data_structures::fnv::FnvHashMap; -use syntax_pos::{mk_sp, Span, ExpnId, DUMMY_SP}; -use syntax::codemap::{self, respan, Spanned}; +use syntax_pos::{Span, ExpnId, DUMMY_SP}; +use syntax::codemap::{self, Spanned}; use syntax::abi::Abi; use syntax::ast::{Name, NodeId, DUMMY_NODE_ID, AsmDialect}; use syntax::ast::{Attribute, Lit, StrStyle, FloatTy, IntTy, UintTy, MetaItem}; @@ -1234,37 +1234,8 @@ pub struct Arg { pub id: NodeId, } -/// Alternative representation for `Arg`s describing `self` parameter of methods. -#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] -pub enum SelfKind { - /// `self`, `mut self` - Value(Mutability), - /// `&'lt self`, `&'lt mut self` - Region(Option<Lifetime>, Mutability), - /// `self: TYPE`, `mut self: TYPE` - Explicit(P<Ty>, Mutability), -} - -pub type ExplicitSelf = Spanned<SelfKind>; - impl Arg { - pub fn to_self(&self) -> Option<ExplicitSelf> { - if let PatKind::Binding(BindByValue(mutbl), _, name, _) = self.pat.node { - if name.node == keywords::SelfValue.name() { - return match self.ty.node { - TyInfer => Some(respan(self.pat.span, SelfKind::Value(mutbl))), - TyRptr(lt, MutTy{ref ty, mutbl}) if ty.node == TyInfer => { - Some(respan(self.pat.span, SelfKind::Region(lt, mutbl))) - } - _ => Some(respan(mk_sp(self.pat.span.lo, self.ty.span.hi), - SelfKind::Explicit(self.ty.clone(), mutbl))) - } - } - } - None - } - - pub fn is_self(&self) -> bool { + fn is_self(&self) -> bool { if let PatKind::Binding(_, _, name, _) = self.pat.node { name.node == keywords::SelfValue.name() } else { @@ -1282,9 +1253,6 @@ pub struct FnDecl { } impl FnDecl { - pub fn get_self(&self) -> Option<ExplicitSelf> { - self.inputs.get(0).and_then(Arg::to_self) - } pub fn has_self(&self) -> bool { self.inputs.get(0).map(Arg::is_self).unwrap_or(false) } diff --git a/src/librustc/hir/print.rs b/src/librustc/hir/print.rs index 100e344d941..eaed62e4dce 100644 --- a/src/librustc/hir/print.rs +++ b/src/librustc/hir/print.rs @@ -25,7 +25,7 @@ use syntax_pos::{self, BytePos}; use errors; use hir; -use hir::{Crate, PatKind, RegionTyParamBound, SelfKind, TraitTyParamBound, TraitBoundModifier}; +use hir::{Crate, PatKind, RegionTyParamBound, TraitTyParamBound, TraitBoundModifier}; use std::io::{self, Write, Read}; @@ -1954,27 +1954,6 @@ impl<'a> State<'a> { self.end() // close enclosing cbox } - fn print_explicit_self(&mut self, explicit_self: &hir::ExplicitSelf) -> io::Result<()> { - match explicit_self.node { - SelfKind::Value(m) => { - self.print_mutability(m)?; - word(&mut self.s, "self") - } - SelfKind::Region(ref lt, m) => { - word(&mut self.s, "&")?; - self.print_opt_lifetime(lt)?; - self.print_mutability(m)?; - word(&mut self.s, "self") - } - SelfKind::Explicit(ref typ, m) => { - self.print_mutability(m)?; - word(&mut self.s, "self")?; - self.word_space(":")?; - self.print_type(&typ) - } - } - } - pub fn print_fn(&mut self, decl: &hir::FnDecl, unsafety: hir::Unsafety, @@ -2185,21 +2164,17 @@ impl<'a> State<'a> { match input.ty.node { hir::TyInfer if is_closure => self.print_pat(&input.pat)?, _ => { - if let Some(eself) = input.to_self() { - self.print_explicit_self(&eself)?; + let invalid = if let PatKind::Binding(_, _, name, _) = input.pat.node { + name.node == keywords::Invalid.name() } else { - let invalid = if let PatKind::Binding(_, _, name, _) = input.pat.node { - name.node == keywords::Invalid.name() - } else { - false - }; - if !invalid { - self.print_pat(&input.pat)?; - word(&mut self.s, ":")?; - space(&mut self.s)?; - } - self.print_type(&input.ty)?; + false + }; + if !invalid { + self.print_pat(&input.pat)?; + word(&mut self.s, ":")?; + space(&mut self.s)?; } + self.print_type(&input.ty)?; } } self.end() diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 2ab10d0446b..180141d674a 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2127,7 +2127,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { let (kind, has_self, has_value) = match trait_item.node { hir::MethodTraitItem(ref sig, ref body) => { - (AssociatedKind::Method, sig.decl.get_self().is_some(), + (AssociatedKind::Method, sig.decl.has_self(), body.is_some()) } hir::ConstTraitItem(_, ref value) => { |
