From eddc3ccce8d50634f860cd1f79f2f242eed7be0f Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 16 Jul 2014 22:16:55 -0400 Subject: [PATCH 1/5] syntax: Add ToTokens for Option --- src/libsyntax/ext/quote.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index 696d62838ba79..0eab9a90b956b 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -67,6 +67,15 @@ pub mod rt { } } + impl ToTokens for Option { + fn to_tokens(&self, cx: &ExtCtxt) -> Vec { + match self { + &Some(ref t) => t.to_tokens(cx), + &None => Vec::new(), + } + } + } + /* Should be (when bugs in default methods are fixed): trait ToSource : ToTokens { From 8659889ed959d1a5921cb18e42d92e7a4cad5903 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 16 Jul 2014 22:17:16 -0400 Subject: [PATCH 2/5] syntax: Add ToTokens for Attribute_ --- src/libsyntax/ext/quote.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index 0eab9a90b956b..eb1f25143cfce 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -147,6 +147,12 @@ pub mod rt { impl_to_source_slice!(ast::Ty, ", ") impl_to_source_slice!(Gc, "\n\n") + impl ToSource for ast::Attribute_ { + fn to_source(&self) -> String { + pprust::attribute_to_string(&dummy_spanned(*self)) + } + } + impl<'a> ToSource for &'a str { fn to_source(&self) -> String { let lit = dummy_spanned(ast::LitStr( @@ -238,6 +244,7 @@ pub mod rt { impl_to_tokens!(Gc) impl_to_tokens!(ast::Block) impl_to_tokens!(ast::Arg) + impl_to_tokens!(ast::Attribute_) impl_to_tokens_lifetime!(&'a str) impl_to_tokens!(()) impl_to_tokens!(char) From 96072d6efc110e81ab6e0a70e2bf9a96a53268b6 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 16 Jul 2014 22:24:42 -0400 Subject: [PATCH 3/5] syntax: Generalize ToTokens impl for Vec It will now `flat_map` over the elements of a `Vec` if `T: ToTokens` --- src/libsyntax/ext/quote.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index eb1f25143cfce..21c5626d16d3f 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -54,9 +54,10 @@ pub mod rt { } } - impl ToTokens for Vec { - fn to_tokens(&self, _cx: &ExtCtxt) -> Vec { - (*self).clone() + impl ToTokens for Vec { + fn to_tokens(&self, cx: &ExtCtxt) -> Vec { + let a = self.iter().flat_map(|t| t.to_tokens(cx).move_iter()); + FromIterator::from_iter(a) } } From a807aa1fca5f1dac03dd9440f735d0e223eef4af Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Thu, 17 Jul 2014 01:02:27 -0400 Subject: [PATCH 4/5] syntax: Add quote_method! --- src/libsyntax/ext/base.rs | 3 +++ src/libsyntax/ext/quote.rs | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 56484c4ba59df..49bd3697884c7 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -371,6 +371,9 @@ pub fn syntax_expander_table() -> SyntaxEnv { syntax_expanders.insert(intern("quote_ty"), builtin_normal_expander( ext::quote::expand_quote_ty)); + syntax_expanders.insert(intern("quote_method"), + builtin_normal_expander( + ext::quote::expand_quote_method)); syntax_expanders.insert(intern("quote_item"), builtin_normal_expander( ext::quote::expand_quote_item)); diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index 21c5626d16d3f..dec87915b3d34 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -353,6 +353,16 @@ pub fn expand_quote_ty(cx: &mut ExtCtxt, base::MacExpr::new(expanded) } +pub fn expand_quote_method(cx: &mut ExtCtxt, + sp: Span, + tts: &[ast::TokenTree]) + -> Box { + let e_param_colons = cx.expr_none(sp); + let expanded = expand_parse_call(cx, sp, "parse_method", + vec!(e_param_colons), tts); + base::MacExpr::new(expanded) +} + pub fn expand_quote_stmt(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) From e4f8cec416d727a7ca2d732cbbae99448228f76d Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Thu, 17 Jul 2014 08:54:43 -0400 Subject: [PATCH 5/5] syntax: Add ToTokens impl for Method --- src/libsyntax/ext/quote.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index dec87915b3d34..a7ede6f742d9f 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -143,6 +143,7 @@ pub mod rt { impl_to_source!(ast::Arg, arg_to_string) impl_to_source!(Generics, generics_to_string) impl_to_source!(Gc, item_to_string) + impl_to_source!(Gc, method_to_string) impl_to_source!(Gc, expr_to_string) impl_to_source!(Gc, pat_to_string) impl_to_source_slice!(ast::Ty, ", ") @@ -238,6 +239,7 @@ pub mod rt { impl_to_tokens!(ast::Ident) impl_to_tokens!(Gc) impl_to_tokens!(Gc) + impl_to_tokens!(Gc) impl_to_tokens_lifetime!(&'a [Gc]) impl_to_tokens!(ast::Ty) impl_to_tokens_lifetime!(&'a [ast::Ty])