Add turbofish quoter
diff --git a/src/generics.rs b/src/generics.rs
index 50b9802..732baa3 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -19,6 +19,11 @@
#[derive(Debug)]
pub struct TyGenerics<'a>(&'a Generics);
+#[cfg(feature = "printing")]
+/// Returned by `TyGenerics::as_turbofish`.
+#[derive(Debug)]
+pub struct Turbofish<'a>(&'a Generics);
+
impl Generics {
#[cfg(feature = "printing")]
/// Split a type's generics into the pieces required for impl'ing a trait
@@ -45,6 +50,14 @@
}
}
+impl<'a> TyGenerics<'a> {
+ #[cfg(feature = "printing")]
+ /// Turn a type's generics like `<X, Y>` into a turbofish like `::<X, Y>`.
+ pub fn as_turbofish(&self) -> Turbofish {
+ Turbofish(self.0)
+ }
+}
+
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct Lifetime {
pub ident: Ident,
@@ -360,6 +373,17 @@
}
}
+ impl<'a> ToTokens for Turbofish<'a> {
+ fn to_tokens(&self, tokens: &mut Tokens) {
+ let has_lifetimes = !self.0.lifetimes.is_empty();
+ let has_ty_params = !self.0.ty_params.is_empty();
+ if has_lifetimes || has_ty_params {
+ tokens.append("::");
+ TyGenerics(self.0).to_tokens(tokens);
+ }
+ }
+ }
+
impl ToTokens for Lifetime {
fn to_tokens(&self, tokens: &mut Tokens) {
self.ident.to_tokens(tokens);
diff --git a/src/lib.rs b/src/lib.rs
index e365491..fe80c6b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -41,7 +41,7 @@
WhereBoundPredicate, WhereClause, WhereEqPredicate, WherePredicate,
WhereRegionPredicate};
#[cfg(feature = "printing")]
-pub use generics::{ImplGenerics, TyGenerics};
+pub use generics::{ImplGenerics, Turbofish, TyGenerics};
mod ident;
pub use ident::Ident;
@@ -90,11 +90,11 @@
#[cfg(feature = "parsing")]
mod parsing {
use super::*;
- use {derive, generics, ident, space, ty};
+ use {derive, generics, ident, mac, space, ty};
use nom::IResult;
#[cfg(feature = "full")]
- use {expr, item, krate, mac};
+ use {expr, item, krate};
pub fn parse_derive_input(input: &str) -> Result<DeriveInput, String> {
unwrap("derive input", derive::parsing::derive_input, input)
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index 3e2fd42..822d22d 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -58,15 +58,19 @@
};
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
let tokens = quote! {
impl #impl_generics MyTrait for Test #ty_generics #where_clause {}
};
-
let expected = concat!("impl < 'a , 'b : 'a , # [ may_dangle ] T : 'a > ",
"MyTrait for Test < 'a , 'b , T > ",
"where T : Debug { }");
+ assert_eq!(expected, tokens.to_string());
+ let turbofish = ty_generics.as_turbofish();
+ let tokens = quote! {
+ Test #turbofish
+ };
+ let expected = "Test :: < 'a , 'b , T >";
assert_eq!(expected, tokens.to_string());
}