From fcab98038c3b466d9ecd00b0f27e9c748e7acbde Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 5 Aug 2014 22:59:24 -0400 Subject: Temporary bootstrapping hack: introduce syntax for r egion bounds like `'b:'a`, meaning `'b outlives 'a`. Syntax currently does nothing but is needed for full fix to #5763. To use this syntax, the issue_5763_bootstrap feature guard is required. --- src/libsyntax/ext/build.rs | 16 ++++++++++++++++ src/libsyntax/ext/deriving/generic/mod.rs | 8 ++++++-- src/libsyntax/ext/deriving/generic/ty.rs | 15 ++++++++++----- 3 files changed, 32 insertions(+), 7 deletions(-) (limited to 'src/libsyntax/ext') diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index d500600e25d..0e687c02c1d 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -73,6 +73,11 @@ pub trait AstBuilder { fn trait_ref(&self, path: ast::Path) -> ast::TraitRef; fn typarambound(&self, path: ast::Path) -> ast::TyParamBound; fn lifetime(&self, span: Span, ident: ast::Name) -> ast::Lifetime; + fn lifetime_def(&self, + span: Span, + name: ast::Name, + bounds: Vec) + -> ast::LifetimeDef; // statements fn stmt_expr(&self, expr: Gc) -> Gc; @@ -456,6 +461,17 @@ impl<'a> AstBuilder for ExtCtxt<'a> { ast::Lifetime { id: ast::DUMMY_NODE_ID, span: span, name: name } } + fn lifetime_def(&self, + span: Span, + name: ast::Name, + bounds: Vec) + -> ast::LifetimeDef { + ast::LifetimeDef { + lifetime: self.lifetime(span, name), + bounds: bounds + } + } + fn stmt_expr(&self, expr: Gc) -> Gc { box(GC) respan(expr.span, ast::StmtSemi(expr, ast::DUMMY_NODE_ID)) } diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs index 9225e4414c4..5842ca4a0d5 100644 --- a/src/libsyntax/ext/deriving/generic/mod.rs +++ b/src/libsyntax/ext/deriving/generic/mod.rs @@ -395,7 +395,7 @@ impl<'a> TraitDef<'a> { let mut ty_params = ty_params.into_vec(); // Copy the lifetimes - lifetimes.extend(generics.lifetimes.iter().map(|l| *l)); + lifetimes.extend(generics.lifetimes.iter().map(|l| (*l).clone())); // Create the type parameters. ty_params.extend(generics.ty_params.iter().map(|ty_param| { @@ -429,7 +429,11 @@ impl<'a> TraitDef<'a> { cx.ty_ident(self.span, ty_param.ident) }); - let self_lifetimes = generics.lifetimes.clone(); + let self_lifetimes: Vec = + generics.lifetimes + .iter() + .map(|ld| ld.lifetime) + .collect(); // Create the type of `self`. let self_type = cx.ty_path( diff --git a/src/libsyntax/ext/deriving/generic/ty.rs b/src/libsyntax/ext/deriving/generic/ty.rs index 5d8b5660698..2130b6f4e9d 100644 --- a/src/libsyntax/ext/deriving/generic/ty.rs +++ b/src/libsyntax/ext/deriving/generic/ty.rs @@ -174,7 +174,9 @@ impl<'a> Ty<'a> { let self_params = self_generics.ty_params.map(|ty_param| { cx.ty_ident(span, ty_param.ident) }); - let lifetimes = self_generics.lifetimes.clone(); + let lifetimes = self_generics.lifetimes.iter() + .map(|d| d.lifetime) + .collect(); cx.path_all(span, false, vec!(self_ty), lifetimes, self_params.into_vec()) @@ -200,7 +202,7 @@ fn mk_ty_param(cx: &ExtCtxt, span: Span, name: &str, cx.typaram(span, cx.ident_of(name), bounds, unbound, None) } -fn mk_generics(lifetimes: Vec, ty_params: Vec ) -> Generics { +fn mk_generics(lifetimes: Vec, ty_params: Vec ) -> Generics { Generics { lifetimes: lifetimes, ty_params: OwnedSlice::from_vec(ty_params) @@ -210,7 +212,7 @@ fn mk_generics(lifetimes: Vec, ty_params: Vec ) -> /// Lifetimes and bounds on type parameters #[deriving(Clone)] pub struct LifetimeBounds<'a> { - pub lifetimes: Vec<&'a str>, + pub lifetimes: Vec<(&'a str, Vec<&'a str>)>, pub bounds: Vec<(&'a str, Option, Vec>)>, } @@ -226,8 +228,11 @@ impl<'a> LifetimeBounds<'a> { self_ty: Ident, self_generics: &Generics) -> Generics { - let lifetimes = self.lifetimes.iter().map(|lt| { - cx.lifetime(span, cx.ident_of(*lt).name) + let lifetimes = self.lifetimes.iter().map(|&(ref lt, ref bounds)| { + let bounds = + bounds.iter().map( + |b| cx.lifetime(span, cx.ident_of(*b).name)).collect(); + cx.lifetime_def(span, cx.ident_of(*lt).name, bounds) }).collect(); let ty_params = self.bounds.iter().map(|t| { match t { -- cgit 1.4.1-3-g733a5