diff --git a/codegen_next/Cargo.toml b/codegen_next/Cargo.toml index ba7979e7a2..693342bbfe 100644 --- a/codegen_next/Cargo.toml +++ b/codegen_next/Cargo.toml @@ -14,6 +14,6 @@ license = "MIT/Apache-2.0" proc-macro = true [dependencies] -quote = "0.5.1" -proc-macro2 = { version = "0.3.6", features = ["nightly"] } -syn = { version = "0.13.1", features = ["full", "extra-traits"] } +quote = "0.6.1" +proc-macro2 = { version = "0.4.3", features = ["nightly"] } +syn = { version = "0.14.0", features = ["full", "extra-traits"] } diff --git a/codegen_next/src/codegen_ext.rs b/codegen_next/src/codegen_ext.rs index ee4f67ad4d..58184612f5 100644 --- a/codegen_next/src/codegen_ext.rs +++ b/codegen_next/src/codegen_ext.rs @@ -1,35 +1,35 @@ use syn::*; use ext::*; -use quote::Tokens; +use proc_macro2::TokenStream; use spanned::Spanned; use FieldMember; pub trait CodegenFieldsExt { - fn surround(&self, tokens: Tokens) -> Tokens; - fn ignore_tokens(&self) -> Tokens; - fn id_match_tokens(&self) -> Tokens; + fn surround(&self, tokens: TokenStream) -> TokenStream; + fn ignore_tokens(&self) -> TokenStream; + fn id_match_tokens(&self) -> TokenStream; } pub fn field_to_ident(i: usize, field: &Field) -> Ident { let name = match field.ident { - Some(id) => format!("_{}", id), + Some(ref id) => format!("_{}", id), None => format!("_{}", i) }; Ident::new(&name, field.span().into()) } -pub fn field_to_match((i, field): (usize, &Field)) -> Tokens { +pub fn field_to_match((i, field): (usize, &Field)) -> TokenStream { let ident = field_to_ident(i, field); match field.ident { - Some(id) => quote!(#id: #ident), + Some(ref id) => quote!(#id: #ident), None => quote!(#ident) } } impl CodegenFieldsExt for Fields { - fn surround(&self, tokens: Tokens) -> Tokens { + fn surround(&self, tokens: TokenStream) -> TokenStream { match *self { Fields::Named(..) => quote!({ #tokens }), Fields::Unnamed(..) => quote!(( #tokens )), @@ -37,11 +37,11 @@ impl CodegenFieldsExt for Fields { } } - fn ignore_tokens(&self) -> Tokens { + fn ignore_tokens(&self) -> TokenStream { self.surround(quote!(..)) } - fn id_match_tokens(&self) -> Tokens { + fn id_match_tokens(&self) -> TokenStream { let idents = self.iter() .enumerate() .map(field_to_match); @@ -50,12 +50,12 @@ impl CodegenFieldsExt for Fields { } } -pub trait TokensExt { - fn tokens(&self) -> Tokens; +pub trait TokenStreamExt { + fn tokens(&self) -> TokenStream; } -impl<'f> TokensExt for FieldMember<'f> { - fn tokens(&self) -> Tokens { +impl<'f> TokenStreamExt for FieldMember<'f> { + fn tokens(&self) -> TokenStream { let index = self.member.unnamed().map(|i| i.index).unwrap_or(0); let ident = field_to_ident(index as usize, &self.field); quote!(#ident) @@ -64,15 +64,15 @@ impl<'f> TokensExt for FieldMember<'f> { // use rocket::http::{ContentType, MediaType, Status}; -// impl TokensExt for ContentType { -// fn tokens(&self) -> Tokens { +// impl TokenStreamExt for ContentType { +// fn tokens(&self) -> TokenStream { // let mt_tokens = self.0.tokens(); // quote!(rocket::http::ContentType(#mt_tokens)) // } // } -// impl TokensExt for MediaType { -// fn tokens(&self) -> Tokens { +// impl TokenStreamExt for MediaType { +// fn tokens(&self) -> TokenStream { // let (top, sub) = (self.top().as_str(), self.sub().as_str()); // let (keys, values) = (self.params().map(|(k, _)| k), self.params().map(|(_, v)| v)); // quote!(rocket::http::MediaType { @@ -93,8 +93,8 @@ impl<'f> TokensExt for FieldMember<'f> { // } // } -// impl TokensExt for Status { -// fn tokens(&self) -> Tokens { +// impl TokenStreamExt for Status { +// fn tokens(&self) -> TokenStream { // let (code, reason) = (self.code, self.reason); // quote!(rocket::http::Status { code: #code, reason: #reason }) // } diff --git a/codegen_next/src/ext.rs b/codegen_next/src/ext.rs index 59d5e62169..d55628c94d 100644 --- a/codegen_next/src/ext.rs +++ b/codegen_next/src/ext.rs @@ -80,8 +80,8 @@ impl FieldsExt for Fields { fn to_field_members<'f>(&'f self) -> Box> + 'f> { Box::new(self.iter().enumerate().map(|(index, field)| { - if let Some(ident) = field.ident { - FieldMember { field, member: Member::Named(ident) } + if let Some(ref ident) = field.ident { + FieldMember { field, member: Member::Named(ident.clone()) } } else { let index = Index { index: index as u32, span: field.span().into() }; let member = Member::Unnamed(index); diff --git a/codegen_next/src/lib.rs b/codegen_next/src/lib.rs index f9d18f894c..ac2f94aad3 100644 --- a/codegen_next/src/lib.rs +++ b/codegen_next/src/lib.rs @@ -61,13 +61,13 @@ fn real_derive_from_form_value(input: TokenStream) -> PResult { })?; // Validate the enum. - let name = input.ident; + let name = input.ident.clone(); let enum_data = validate_input(input)?; // Create iterators over the identifers as idents and as strings. - let variant_strs = enum_data.variants.iter().map(|v| v.ident.as_ref() as &str); - let variant_idents = enum_data.variants.iter().map(|v| v.ident); - let names = ::std::iter::repeat(name); + let variant_strs = enum_data.variants.iter().map(|v| v.ident.to_string()); + let variant_idents = enum_data.variants.iter().map(|v| v.ident.clone()); + let names = ::std::iter::repeat(&name); // Generate the implementation. Ok(quote! { diff --git a/codegen_next/src/spanned.rs b/codegen_next/src/spanned.rs index 35a35b0954..1b8e7a1be8 100644 --- a/codegen_next/src/spanned.rs +++ b/codegen_next/src/spanned.rs @@ -1,7 +1,6 @@ use proc_macro::Span; -use proc_macro2::TokenStream; -use quote::{Tokens, ToTokens}; +use quote::ToTokens; pub trait Spanned { fn span(&self) -> Span; @@ -10,9 +9,7 @@ pub trait Spanned { // FIXME: Remove this once proc_macro's stabilize. impl Spanned for T { fn span(&self) -> Span { - let mut tokens = Tokens::new(); - self.to_tokens(&mut tokens); - let token_stream = TokenStream::from(tokens); + let token_stream = self.into_token_stream(); let mut iter = token_stream.into_iter(); let mut span = match iter.next() { Some(tt) => tt.span().unstable(), diff --git a/examples/todo/Cargo.toml b/examples/todo/Cargo.toml index 79f97a9289..3011a49f56 100644 --- a/examples/todo/Cargo.toml +++ b/examples/todo/Cargo.toml @@ -9,7 +9,7 @@ rocket_codegen = { path = "../../codegen" } serde = "1.0" serde_json = "1.0" serde_derive = "1.0" -diesel = { version = "1.1", features = ["sqlite", "r2d2"] } +diesel = { version = "1.2.*", features = ["sqlite", "r2d2"] } [dev-dependencies] parking_lot = {version = "0.5", features = ["nightly"]} diff --git a/lib/Cargo.toml b/lib/Cargo.toml index a666a4a587..d8f9c437ca 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -29,8 +29,8 @@ time = "0.1" memchr = "2" base64 = "0.9" smallvec = "0.6" -pear = { git = "http://github.com/SergioBenitez/pear", rev = "44bbca0" } -pear_codegen = { git = "http://github.com/SergioBenitez/pear", rev = "44bbca0" } +pear = { git = "http://github.com/SergioBenitez/pear", rev = "a96a7fd" } +pear_codegen = { git = "http://github.com/SergioBenitez/pear", rev = "a96a7fd" } rustls = { version = "0.12.0", optional = true } hyper = { version = "0.10.13", default-features = false } indexmap = "1.0" diff --git a/lib/build.rs b/lib/build.rs index d5ac8cabe8..0759e51726 100644 --- a/lib/build.rs +++ b/lib/build.rs @@ -8,8 +8,8 @@ use yansi::Color::{Red, Yellow, Blue, White}; use version_check::{supports_features, is_min_version, is_min_date}; // Specifies the minimum nightly version needed to compile Rocket. -const MIN_DATE: &'static str = "2018-04-28"; -const MIN_VERSION: &'static str = "1.27.0-nightly"; +const MIN_DATE: &'static str = "2018-05-20"; +const MIN_VERSION: &'static str = "1.28.0-nightly"; fn main() { let ok_channel = supports_features(); diff --git a/lib/src/http/header.rs b/lib/src/http/header.rs index afa107ec17..61da08533a 100644 --- a/lib/src/http/header.rs +++ b/lib/src/http/header.rs @@ -541,7 +541,7 @@ impl<'h> HeaderMap<'h> { pub fn iter<'s>(&'s self) -> impl Iterator> { self.headers.iter().flat_map(|(key, values)| { values.iter().map(move |val| { - Header::new(key.as_str(), val.borrow()) + Header::new(key.as_str(), &**val) }) }) }