Skip to content

Commit

Permalink
Remove dependence on 'decl_macro' in codegen.
Browse files Browse the repository at this point in the history
The generated 'uri' helper macros are now re-exports of 'macro_rules'
macros, made possible by the stable 'uniform_paths' feature.
  • Loading branch information
jebrosen authored and SergioBenitez committed Jul 19, 2019
1 parent 34a741a commit 2f458b5
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 153 deletions.
31 changes: 25 additions & 6 deletions core/codegen/src/attribute/route.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

use proc_macro::{TokenStream, Span};
use crate::proc_macro2::TokenStream as TokenStream2;
use devise::{syn, Spanned, SpanWrapped, Result, FromMeta, ext::TypeExt};
Expand Down Expand Up @@ -325,15 +328,31 @@ fn generate_internal_uri_macro(route: &Route) -> TokenStream2 {
.map(|name| route.inputs.iter().find(|(ident, ..)| ident == name).unwrap())
.map(|(ident, _, ty)| quote!(#ident: #ty));

let generated_macro_name = route.function.ident.prepend(URI_MACRO_PREFIX);
let mut hasher = DefaultHasher::new();
let route_span = route.function.span();
route_span.source_file().path().hash(&mut hasher);
let line_column = route_span.start();
line_column.line.hash(&mut hasher);
line_column.column.hash(&mut hasher);

let mut generated_macro_name = route.function.ident.prepend(URI_MACRO_PREFIX);
generated_macro_name.set_span(Span::call_site().into());
let inner_generated_macro_name = generated_macro_name.append(&hasher.finish().to_string());
let route_uri = route.attribute.path.origin.0.to_string();

quote! {
pub macro #generated_macro_name($($token:tt)*) {{
extern crate std;
extern crate rocket;
rocket::rocket_internal_uri!(#route_uri, (#(#dynamic_args),*), $($token)*)
}}
#[doc(hidden)]
#[macro_export]
macro_rules! #inner_generated_macro_name {
($($token:tt)*) => {{
extern crate std;
extern crate rocket;
rocket::rocket_internal_uri!(#route_uri, (#(#dynamic_args),*), $($token)*)
}};
}

#[doc(hidden)]
pub use #inner_generated_macro_name as #generated_macro_name;
}
}

Expand Down
5 changes: 5 additions & 0 deletions core/codegen/src/syn_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,17 @@ pub fn syn_to_diag(error: syn::parse::Error) -> Diagnostic {

pub trait IdentExt {
fn prepend(&self, string: &str) -> syn::Ident;
fn append(&self, string: &str) -> syn::Ident;
}

impl IdentExt for syn::Ident {
fn prepend(&self, string: &str) -> syn::Ident {
syn::Ident::new(&format!("{}{}", string, self), self.span())
}

fn append(&self, string: &str) -> syn::Ident {
syn::Ident::new(&format!("{}{}", self, string), self.span())
}
}

pub trait ReturnTypeExt {
Expand Down
Loading

0 comments on commit 2f458b5

Please sign in to comment.