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 696d62838ba79..a7ede6f742d9f 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) } } @@ -67,6 +68,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 { @@ -133,11 +143,18 @@ 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, ", ") 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( @@ -222,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]) @@ -229,6 +247,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) @@ -336,6 +355,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])